CINXE.COM

About - Fletcher - Global Competitive Insights

<!DOCTYPE html><html lang="en-US"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1"><link rel="profile" href="http://gmpg.org/xfn/11"> <script defer type="text/javascript" id="splide-script-js" src="https://fletchercsi.com/wp-content/themes/catch-responsive-child/js/splide.min.js"></script> <link rel="stylesheet" id="splide-style-css" href="https://fletchercsi.com/wp-content/themes/catch-responsive-child/css/splide.min.css" type="text/css" media="all"> <script defer src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script> <script defer src="https://www.googletagmanager.com/gtag/js?id=AW-1070951481"></script> <script defer src="data:text/javascript;base64,CgkJCXdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwoJCQlmdW5jdGlvbiBndGFnKCl7ZGF0YUxheWVyLnB1c2goYXJndW1lbnRzKTt9CgkJCWd0YWcoJ2pzJywgbmV3IERhdGUoKSk7CgoJCQlndGFnKCdjb25maWcnLCAnQVctMTA3MDk1MTQ4MScpOwoJCQ=="></script> <script defer type="text/javascript" id="splide-script-js" src="https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_d29b672c88ddab4ae609ffe7cf1cfdb4.php"></script> <style>@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&display=swap');</style><meta name='robots' content='index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1' /><style>img:is([sizes="auto" i], [sizes^="auto," i]) { contain-intrinsic-size: 3000px 1500px }</style><title>About - Fletcher - Global Competitive Insights</title><meta name="description" content="Fletcher has over 35 years experience as a leader in the Competitive Intelligence industry, working with the startups, to the fortune 500." /><link rel="canonical" href="https://fletchercsi.com/about/" /><meta property="og:locale" content="en_US" /><meta property="og:type" content="article" /><meta property="og:title" content="About - Fletcher - Global Competitive Insights" /><meta property="og:description" content="Fletcher has over 35 years experience as a leader in the Competitive Intelligence industry, working with the startups, to the fortune 500." /><meta property="og:url" content="https://fletchercsi.com/about/" /><meta property="og:site_name" content="Fletcher - Global Competitive Insights" /><meta property="article:modified_time" content="2024-04-04T21:03:11+00:00" /><meta name="twitter:card" content="summary_large_image" /> <script type="application/ld+json" class="yoast-schema-graph">{"@context":"https://schema.org","@graph":[{"@type":"WebPage","@id":"https://fletchercsi.com/about/","url":"https://fletchercsi.com/about/","name":"About - Fletcher - Global Competitive Insights","isPartOf":{"@id":"https://fletchercsi.com/#website"},"datePublished":"2022-08-19T19:16:09+00:00","dateModified":"2024-04-04T21:03:11+00:00","description":"Fletcher has over 35 years experience as a leader in the Competitive Intelligence industry, working with the startups, to the fortune 500.","breadcrumb":{"@id":"https://fletchercsi.com/about/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https://fletchercsi.com/about/"]}]},{"@type":"BreadcrumbList","@id":"https://fletchercsi.com/about/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://fletchercsi.com/"},{"@type":"ListItem","position":2,"name":"About"}]},{"@type":"WebSite","@id":"https://fletchercsi.com/#website","url":"https://fletchercsi.com/","name":"Fletcher - Global Competitive Insights","description":"Global Competitive Insights","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://fletchercsi.com/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}</script> <link rel='dns-prefetch' href='//www.googletagmanager.com' /><link rel='dns-prefetch' href='//fonts.googleapis.com' /><link rel='dns-prefetch' href='//use.fontawesome.com' /><link rel="alternate" type="application/rss+xml" title="Fletcher - Global Competitive Insights &raquo; Feed" href="https://fletchercsi.com/feed/" /><link rel="alternate" type="text/calendar" title="Fletcher - Global Competitive Insights &raquo; iCal Feed" href="https://fletchercsi.com/events/?ical=1" /><link rel='stylesheet' id='wp-block-library-css' href='https://fletchercsi.com/wp-includes/css/dist/block-library/style.min.css?ver=6.7.1' type='text/css' media='all' /><style id='wp-block-library-theme-inline-css' type='text/css'>.wp-block-audio :where(figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-audio :where(figcaption){color:#ffffffa6}.wp-block-audio{margin:0 0 1em}.wp-block-code{border:1px solid #ccc;border-radius:4px;font-family:Menlo,Consolas,monaco,monospace;padding:.8em 1em}.wp-block-embed :where(figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-embed :where(figcaption){color:#ffffffa6}.wp-block-embed{margin:0 0 1em}.blocks-gallery-caption{color:#555;font-size:13px;text-align:center}.is-dark-theme .blocks-gallery-caption{color:#ffffffa6}:root :where(.wp-block-image figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme :root :where(.wp-block-image figcaption){color:#ffffffa6}.wp-block-image{margin:0 0 1em}.wp-block-pullquote{border-bottom:4px solid;border-top:4px solid;color:currentColor;margin-bottom:1.75em}.wp-block-pullquote cite,.wp-block-pullquote footer,.wp-block-pullquote__citation{color:currentColor;font-size:.8125em;font-style:normal;text-transform:uppercase}.wp-block-quote{border-left:.25em solid;margin:0 0 1.75em;padding-left:1em}.wp-block-quote cite,.wp-block-quote footer{color:currentColor;font-size:.8125em;font-style:normal;position:relative}.wp-block-quote:where(.has-text-align-right){border-left:none;border-right:.25em solid;padding-left:0;padding-right:1em}.wp-block-quote:where(.has-text-align-center){border:none;padding-left:0}.wp-block-quote.is-large,.wp-block-quote.is-style-large,.wp-block-quote:where(.is-style-plain){border:none}.wp-block-search .wp-block-search__label{font-weight:700}.wp-block-search__button{border:1px solid #ccc;padding:.375em .625em}:where(.wp-block-group.has-background){padding:1.25em 2.375em}.wp-block-separator.has-css-opacity{opacity:.4}.wp-block-separator{border:none;border-bottom:2px solid;margin-left:auto;margin-right:auto}.wp-block-separator.has-alpha-channel-opacity{opacity:1}.wp-block-separator:not(.is-style-wide):not(.is-style-dots){width:100px}.wp-block-separator.has-background:not(.is-style-dots){border-bottom:none;height:1px}.wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots){height:2px}.wp-block-table{margin:0 0 1em}.wp-block-table td,.wp-block-table th{word-break:normal}.wp-block-table :where(figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-table :where(figcaption){color:#ffffffa6}.wp-block-video :where(figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-video :where(figcaption){color:#ffffffa6}.wp-block-video{margin:0 0 1em}:root :where(.wp-block-template-part.has-background){margin-bottom:0;margin-top:0;padding:1.25em 2.375em}</style><style id='classic-theme-styles-inline-css' type='text/css'>/*! This file is auto-generated */ .wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}</style><style id='global-styles-inline-css' type='text/css'>:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--color--dark-gray: #404040;--wp--preset--color--gray: #eeeeee;--wp--preset--color--light-gray: #f9f9f9;--wp--preset--color--yellow: #e5ae4a;--wp--preset--color--blue: #1b8be0;--wp--preset--color--tahiti-gold: #e4741f;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 14px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 26px;--wp--preset--font-size--x-large: 42px;--wp--preset--font-size--extra-small: 13px;--wp--preset--font-size--normal: 16px;--wp--preset--font-size--huge: 32px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;} :where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;} :where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;} :root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;}</style><link rel='stylesheet' id='contact-form-7-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_3fd2afa98866679439097f4ab102fe0a.php?ver=6.0' type='text/css' media='all' /><link rel='stylesheet' id='more-google-fonts-css' href='https://fonts.googleapis.com/css?family=Oswald%3Awght%40400%3B500%3B600&#038;display=swap&#038;ver=6.7.1' type='text/css' media='all' /><link rel='stylesheet' id='animate-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_e8f760ef9145795c4352cac3a8936207.php?ver=1.0' type='text/css' media='all' /><link rel='stylesheet' id='bootstrap-style-css' href='https://fletchercsi.com/wp-content/themes/catch-responsive-child/css/bootstrap.min.css?ver=1.0' type='text/css' media='all' /><link rel='stylesheet' id='fontawesome-style-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_3a84551df4f26e66de3e3711c1b743ca.php?ver=1.0' type='text/css' media='all' /><link rel='stylesheet' id='custom-styles-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_5fc1ccc818bf7988e64028f8aa853ecf.php?ver=1.0' type='text/css' media='all' /><link rel='stylesheet' id='custom-laptop-average-styles-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_570302ffd8756266629f18e91c0a4f1e.php?ver=1.0' type='text/css' media='all' /><link rel='stylesheet' id='custom-mobile-large-styles-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_7b1590f97369e800967ff8bcf9bccf6f.php?ver=1.0' type='text/css' media='all' /><link rel='stylesheet' id='catchresponsive-style-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_9b4dbfbf6cc716f6b5ec687519ab48f1.php?ver=6.7.1' type='text/css' media='all' /><link rel='stylesheet' id='child-style-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_9105caf58d7f8757337dad89cfdda326.php?ver=6.7.1' type='text/css' media='all' /><link rel='stylesheet' id='catchresponsive-fonts-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_1ef829497e33b0231d889b95978a972f.php' type='text/css' media='all' /><link rel='stylesheet' id='catchresponsive-block-style-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_8ae0ffb70e81dcc97200fed987c0c347.php?ver=6.7.1' type='text/css' media='all' /><link rel='stylesheet' id='genericons-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_13a6500ddf36c6dd581877aefc78d34d.php?ver=3.4.1' type='text/css' media='all' /><link rel='stylesheet' id='jquery-sidr-css' href='https://fletchercsi.com/wp-content/themes/catch-responsive/css/jquery.sidr.light.min.css?ver=2.1.0' type='text/css' media='all' /><link rel='stylesheet' id='font-awesome-official-css' href='https://use.fontawesome.com/releases/v6.2.0/css/all.css' type='text/css' media='all' integrity="sha384-SOnAn/m2fVJCwnbEYgD4xzrPtvsXdElhOVvR8ND1YjB5nhGNwwf7nBQlhfAwHAZC" crossorigin="anonymous" /><link rel='stylesheet' id='font-awesome-official-v4shim-css' href='https://use.fontawesome.com/releases/v6.2.0/css/v4-shims.css' type='text/css' media='all' integrity="sha384-MAgG0MNwzSXBbmOw4KK9yjMrRaUNSCk3WoZPkzVC1rmhXzerY4gqk/BLNYtdOFCO" crossorigin="anonymous" /> <!--[if lt IE 9]> <script type="text/javascript" src="https://fletchercsi.com/wp-content/themes/catch-responsive/js/html5.min.js?ver=3.7.3" id="catchresponsive-html5-js"></script> <![endif]--> <script type="text/javascript" src="https://fletchercsi.com/wp-includes/js/jquery/jquery.min.js?ver=3.7.1" id="jquery-core-js"></script> <script defer type="text/javascript" src="https://fletchercsi.com/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.4.1" id="jquery-migrate-js"></script> <script defer type="text/javascript" src="https://fletchercsi.com/wp-content/themes/catch-responsive/js/jquery.sidr.min.js?ver=2.2.1.1" id="jquery-sidr-js"></script> <script defer type="text/javascript" src="https://fletchercsi.com/wp-content/themes/catch-responsive/js/catchresponsive-custom-scripts.min.js" id="catchresponsive-custom-scripts-js"></script> <script defer type="text/javascript" src="https://www.googletagmanager.com/gtag/js?id=G-MMHB4QCLRY" id="google_gtagjs-js"></script> <script defer id="google_gtagjs-js-after" src="data:text/javascript;base64,Ci8qIDwhW0NEQVRBWyAqLwp3aW5kb3cuZGF0YUxheWVyID0gd2luZG93LmRhdGFMYXllciB8fCBbXTtmdW5jdGlvbiBndGFnKCl7ZGF0YUxheWVyLnB1c2goYXJndW1lbnRzKTt9Cmd0YWcoInNldCIsImxpbmtlciIseyJkb21haW5zIjpbImZsZXRjaGVyY3NpLmNvbSJdfSk7Cmd0YWcoImpzIiwgbmV3IERhdGUoKSk7Cmd0YWcoInNldCIsICJkZXZlbG9wZXJfaWQuZFpUTmlNVCIsIHRydWUpOwpndGFnKCJjb25maWciLCAiRy1NTUhCNFFDTFJZIik7Ci8qIF1dPiAqLwo="></script> <link rel="https://api.w.org/" href="https://fletchercsi.com/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://fletchercsi.com/wp-json/wp/v2/pages/10" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://fletchercsi.com/xmlrpc.php?rsd" /><meta name="generator" content="WordPress 6.7.1" /><link rel='shortlink' href='https://fletchercsi.com/?p=10' /><link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://fletchercsi.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Ffletchercsi.com%2Fabout%2F" /><link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://fletchercsi.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Ffletchercsi.com%2Fabout%2F&#038;format=xml" /><meta name="generator" content="Site Kit by Google 1.140.0" /><meta name="tec-api-version" content="v1"><meta name="tec-api-origin" content="https://fletchercsi.com"><link rel="alternate" href="https://fletchercsi.com/wp-json/tribe/events/v1/" /><style type="text/css"></style> <script defer src="data:text/javascript;base64,Ci8qIDwhW0NEQVRBWyAqLwoKCQkJKCBmdW5jdGlvbiggdywgZCwgcywgbCwgaSApIHsKCQkJCXdbbF0gPSB3W2xdIHx8IFtdOwoJCQkJd1tsXS5wdXNoKCB7J2d0bS5zdGFydCc6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLCBldmVudDogJ2d0bS5qcyd9ICk7CgkJCQl2YXIgZiA9IGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHMgKVswXSwKCQkJCQlqID0gZC5jcmVhdGVFbGVtZW50KCBzICksIGRsID0gbCAhPSAnZGF0YUxheWVyJyA/ICcmbD0nICsgbCA6ICcnOwoJCQkJai5hc3luYyA9IHRydWU7CgkJCQlqLnNyYyA9ICdodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndG0uanM/aWQ9JyArIGkgKyBkbDsKCQkJCWYucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGosIGYgKTsKCQkJfSApKCB3aW5kb3csIGRvY3VtZW50LCAnc2NyaXB0JywgJ2RhdGFMYXllcicsICdHVE0tVzlHRFJUNicgKTsKCQkJCi8qIF1dPiAqLwo="></script> <link rel="icon" href="https://fletchercsi.com/wp-content/uploads/2022/10/favicon-40x40.png" sizes="32x32" /><link rel="icon" href="https://fletchercsi.com/wp-content/uploads/2022/10/favicon.png" sizes="192x192" /><link rel="apple-touch-icon" href="https://fletchercsi.com/wp-content/uploads/2022/10/favicon.png" /><meta name="msapplication-TileImage" content="https://fletchercsi.com/wp-content/uploads/2022/10/favicon.png" /> <style type="text/css" media="screen">.site-title a, .site-description { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px, 1px, 1px, 1px); }</style></head><body class="page-template page-template-php page-template-about-page page-template-phpabout-page-php page page-id-10 wp-embed-responsive tribe-no-js slug-about new-header no-sidebar content-width excerpt-image-left mobile-menu-two"> <noscript> <iframe src="https://www.googletagmanager.com/ns.html?id=GTM-W9GDRT6" height="0" width="0" style="display:none;visibility:hidden"></iframe> </noscript> <script type="text/javascript">/*! * modernizr v3.6.0 * Build https://modernizr.com/download?-mq-dontmin * * Copyright (c) * Faruk Ates * Paul Irish * Alex Sexton * Ryan Seddon * Patrick Kettner * Stu Cox * Richard Herrera * MIT License */ /* * Modernizr tests which native CSS3 and HTML5 features are available in the * current UA and makes the results available to you in two ways: as properties on * a global `Modernizr` object, and as classes on the `<html>` element. This * information allows you to progressively enhance your pages with a granular level * of control over the experience. */ ; (function(window, document, undefined) { var tests = []; /** * * ModernizrProto is the constructor for Modernizr * * @class * @access public */ var ModernizrProto = { // The current version, dummy _version: '3.6.0', // Any settings that don't work as separate modules // can go in here as configuration. _config: { 'classPrefix': '', 'enableClasses': true, 'enableJSClass': true, 'usePrefixes': true }, // Queue of tests _q: [], // Stub these for people who are listening on: function(test, cb) { // I don't really think people should do this, but we can // safe guard it a bit. // -- NOTE:: this gets WAY overridden in src/addTest for actual async tests. // This is in case people listen to synchronous tests. I would leave it out, // but the code to *disallow* sync tests in the real version of this // function is actually larger than this. var self = this; setTimeout(function() { cb(self[test]); }, 0); }, addTest: function(name, fn, options) { tests.push({ name: name, fn: fn, options: options }); }, addAsyncTest: function(fn) { tests.push({ name: null, fn: fn }); } }; // Fake some of Object.create so we can force non test results to be non "own" properties. var Modernizr = function() {}; Modernizr.prototype = ModernizrProto; // Leak modernizr globally when you `require` it rather than force it here. // Overwrite name so constructor name is nicer :D Modernizr = new Modernizr(); var classes = []; /** * is returns a boolean if the typeof an obj is exactly type. * * @access private * @function is * @param {*} obj - A thing we want to check the type of * @param {string} type - A string to compare the typeof against * @returns {boolean} */ function is(obj, type) { return typeof obj === type; }; /** * Run through all tests and detect their support in the current UA. * * @access private */ function testRunner() { var featureNames; var feature; var aliasIdx; var result; var nameIdx; var featureName; var featureNameSplit; for (var featureIdx in tests) { if (tests.hasOwnProperty(featureIdx)) { featureNames = []; feature = tests[featureIdx]; // run the test, throw the return value into the Modernizr, // then based on that boolean, define an appropriate className // and push it into an array of classes we'll join later. // // If there is no name, it's an 'async' test that is run, // but not directly added to the object. That should // be done with a post-run addTest call. if (feature.name) { featureNames.push(feature.name.toLowerCase()); if (feature.options && feature.options.aliases && feature.options.aliases.length) { // Add all the aliases into the names list for (aliasIdx = 0; aliasIdx < feature.options.aliases.length; aliasIdx++) { featureNames.push(feature.options.aliases[aliasIdx].toLowerCase()); } } } // Run the test, or use the raw value if it's not a function result = is(feature.fn, 'function') ? feature.fn() : feature.fn; // Set each of the names on the Modernizr object for (nameIdx = 0; nameIdx < featureNames.length; nameIdx++) { featureName = featureNames[nameIdx]; // Support dot properties as sub tests. We don't do checking to make sure // that the implied parent tests have been added. You must call them in // order (either in the test, or make the parent test a dependency). // // Cap it to TWO to make the logic simple and because who needs that kind of sub testing // hashtag famous last words featureNameSplit = featureName.split('.'); if (featureNameSplit.length === 1) { Modernizr[featureNameSplit[0]] = result; } else { // cast to a Boolean, if not one already if (Modernizr[featureNameSplit[0]] && !(Modernizr[featureNameSplit[0]] instanceof Boolean)) { Modernizr[featureNameSplit[0]] = new Boolean(Modernizr[featureNameSplit[0]]); } Modernizr[featureNameSplit[0]][featureNameSplit[1]] = result; } classes.push((result ? '' : 'no-') + featureNameSplit.join('-')); } } } }; /** * docElement is a convenience wrapper to grab the root element of the document * * @access private * @returns {HTMLElement|SVGElement} The root element of the document */ var docElement = document.documentElement; /** * A convenience helper to check if the document we are running in is an SVG document * * @access private * @returns {boolean} */ var isSVG = docElement.nodeName.toLowerCase() === 'svg'; /** * createElement is a convenience wrapper around document.createElement. Since we * use createElement all over the place, this allows for (slightly) smaller code * as well as abstracting away issues with creating elements in contexts other than * HTML documents (e.g. SVG documents). * * @access private * @function createElement * @returns {HTMLElement|SVGElement} An HTML or SVG element */ function createElement() { if (typeof document.createElement !== 'function') { // This is the case in IE7, where the type of createElement is "object". // For this reason, we cannot call apply() as Object is not a Function. return document.createElement(arguments[0]); } else if (isSVG) { return document.createElementNS.call(document, 'http://www.w3.org/2000/svg', arguments[0]); } else { return document.createElement.apply(document, arguments); } } ; /** * getBody returns the body of a document, or an element that can stand in for * the body if a real body does not exist * * @access private * @function getBody * @returns {HTMLElement|SVGElement} Returns the real body of a document, or an * artificially created element that stands in for the body */ function getBody() { // After page load injecting a fake body doesn't work so check if body exists var body = document.body; if (!body) { // Can't use the real body create a fake one. body = createElement(isSVG ? 'svg' : 'body'); body.fake = true; } return body; } ; /** * injectElementWithStyles injects an element with style element and some CSS rules * * @access private * @function injectElementWithStyles * @param {string} rule - String representing a css rule * @param {function} callback - A function that is used to test the injected element * @param {number} [nodes] - An integer representing the number of additional nodes you want injected * @param {string[]} [testnames] - An array of strings that are used as ids for the additional nodes * @returns {boolean} */ function injectElementWithStyles(rule, callback, nodes, testnames) { var mod = 'modernizr'; var style; var ret; var node; var docOverflow; var div = createElement('div'); var body = getBody(); if (parseInt(nodes, 10)) { // In order not to give false positives we create a node for each test // This also allows the method to scale for unspecified uses while (nodes--) { node = createElement('div'); node.id = testnames ? testnames[nodes] : mod + (nodes + 1); div.appendChild(node); } } style = createElement('style'); style.type = 'text/css'; style.id = 's' + mod; // IE6 will false positive on some tests due to the style element inside the test div somehow interfering offsetHeight, so insert it into body or fakebody. // Opera will act all quirky when injecting elements in documentElement when page is served as xml, needs fakebody too. #270 (!body.fake ? div : body).appendChild(style); body.appendChild(div); if (style.styleSheet) { style.styleSheet.cssText = rule; } else { style.appendChild(document.createTextNode(rule)); } div.id = mod; if (body.fake) { //avoid crashing IE8, if background image is used body.style.background = ''; //Safari 5.13/5.1.4 OSX stops loading if ::-webkit-scrollbar is used and scrollbars are visible body.style.overflow = 'hidden'; docOverflow = docElement.style.overflow; docElement.style.overflow = 'hidden'; docElement.appendChild(body); } ret = callback(div, rule); // If this is done after page load we don't want to remove the body so check if body exists if (body.fake) { body.parentNode.removeChild(body); docElement.style.overflow = docOverflow; // Trigger layout so kinetic scrolling isn't disabled in iOS6+ // eslint-disable-next-line docElement.offsetHeight; } else { div.parentNode.removeChild(div); } return !!ret; } ; /** * Modernizr.mq tests a given media query, live against the current state of the window * adapted from matchMedia polyfill by Scott Jehl and Paul Irish * gist.github.com/786768 * * @memberof Modernizr * @name Modernizr.mq * @optionName Modernizr.mq() * @optionProp mq * @access public * @function mq * @param {string} mq - String of the media query we want to test * @returns {boolean} * @example * Modernizr.mq allows for you to programmatically check if the current browser * window state matches a media query. * * ```js * var query = Modernizr.mq('(min-width: 900px)'); * * if (query) { * // the browser window is larger than 900px * } * ``` * * Only valid media queries are supported, therefore you must always include values * with your media query * * ```js * // good * Modernizr.mq('(min-width: 900px)'); * * // bad * Modernizr.mq('min-width'); * ``` * * If you would just like to test that media queries are supported in general, use * * ```js * Modernizr.mq('only all'); // true if MQ are supported, false if not * ``` * * * Note that if the browser does not support media queries (e.g. old IE) mq will * always return false. */ var mq = (function() { var matchMedia = window.matchMedia || window.msMatchMedia; if (matchMedia) { return function(mq) { var mql = matchMedia(mq); return mql && mql.matches || false; }; } return function(mq) { var bool = false; injectElementWithStyles('@media ' + mq + ' { #modernizr { position: absolute; } }', function(node) { bool = (window.getComputedStyle ? window.getComputedStyle(node, null) : node.currentStyle).position == 'absolute'; }); return bool; }; })(); ModernizrProto.mq = mq; // Run each test testRunner(); delete ModernizrProto.addTest; delete ModernizrProto.addAsyncTest; // Run the things that are supposed to run after the tests for (var i = 0; i < Modernizr._q.length; i++) { Modernizr._q[i](); } // Leak Modernizr namespace window.Modernizr = Modernizr; ; })(window, document);</script> <div id="page" class="hfeed site"><header id="masthead" role="banner"><div class="wrapper"><div id="mobile-header-left-menu" class="mobile-menu-anchor primary-menu"> <a href="#mobile-header-left-nav" id="header-left-menu" class="genericon genericon-menu"> <span class="mobile-menu-text">Menu</span> </a></div><div id="site-branding"><div id="site-header"><p class="site-title"><a href="https://fletchercsi.com/" rel="home">Fletcher - Global Competitive Insights</a></p><p class="site-description">Global Competitive Insights</p></div></div><div id="mobile-header-right-menu" class="mobile-menu-anchor secondary-menu"> <a href="#mobile-header-right-menu" id="secondary-menu" class="genericon genericon-menu"> <span class="mobile-menu-text">Menu</span> </a></div><aside class="sidebar sidebar-header-right widget-area"></aside></div></header><nav class="site-navigation nav-secondary" role="navigation"><div class="wrapper"><h2 class="screen-reader-text">Secondary Menu</h2><div class="screen-reader-text skip-link"><a href="#content" title="Skip to content">Skip to content</a></div><div class="menu-main-menu-container"><ul id="menu-main-menu" class="menu catchresponsive-nav-menu"><li id="menu-item-25" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home menu-item-25"><a href="https://fletchercsi.com/">Home</a></li><li id="menu-item-24" class="menu-item menu-item-type-post_type menu-item-object-page current-menu-item page_item page-item-10 current_page_item current-menu-ancestor current-menu-parent current_page_parent current_page_ancestor menu-item-has-children menu-item-24"><a href="https://fletchercsi.com/about/" aria-current="page">About</a><ul class="sub-menu"><li id="menu-item-1958" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item menu-item-1958"><a href="https://fletchercsi.com/about/#company" aria-current="page">Company</a></li><li id="menu-item-1933" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item menu-item-1933"><a href="https://fletchercsi.com/about/#careers" aria-current="page">Careers</a></li><li id="menu-item-1934" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item menu-item-1934"><a href="https://fletchercsi.com/about/#privacypolicy" aria-current="page">Privacy Policy</a></li></ul></li><li id="menu-item-23" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-23"><a href="https://fletchercsi.com/industries/">Industries</a><ul class="sub-menu"><li id="menu-item-4191" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-4191"><a href="https://fletchercsi.com/industries/financial-services/">Financial Services</a></li><li id="menu-item-4210" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-4210"><a href="https://fletchercsi.com/industries/life-sciences/">Life Sciences</a></li><li id="menu-item-3999" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-3999"><a href="https://fletchercsi.com/industries/technology/">Technology</a></li><li id="menu-item-4200" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-4200"><a href="https://fletchercsi.com/industries/consumer-packaged-goods/">Consumer Packaged Goods</a></li><li id="menu-item-4179" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-4179"><a href="https://fletchercsi.com/industries/industrial/">Industrial Services</a></li></ul></li><li id="menu-item-6362" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-6362"><a href="https://fletchercsi.com/services/">Services</a><ul class="sub-menu"><li id="menu-item-6363" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6363"><a href="https://fletchercsi.com/services/primary-research/">Primary Research</a></li><li id="menu-item-6368" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6368"><a href="https://fletchercsi.com/services/winloss-analysis/">Win/Loss Analysis</a></li><li id="menu-item-6367" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6367"><a href="https://fletchercsi.com/services/strategy-workshops/">Strategy Workshops</a></li><li id="menu-item-6366" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6366"><a href="https://fletchercsi.com/services/trade-show-intelligence/">Trade Show Intelligence</a></li><li id="menu-item-6365" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6365"><a href="https://fletchercsi.com/services/market-intelligence-platform/">Market Intelligence Platform</a></li></ul></li><li id="menu-item-6742" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-6742"><a href="https://fletchercsi.com/resources/">Resources</a><ul class="sub-menu"><li id="menu-item-6783" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6783"><a href="https://fletchercsi.com/resources/blogs/">Blogs</a></li><li id="menu-item-6747" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6747"><a href="https://fletchercsi.com/resources/webinars-and-videos/">Webinars and Videos</a></li><li id="menu-item-6746" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6746"><a href="https://fletchercsi.com/resources/white-papers-and-publications/">White Papers and Publications</a></li><li id="menu-item-6745" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6745"><a href="https://fletchercsi.com/resources/presentations/">Presentations</a></li><li id="menu-item-6744" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6744"><a href="https://fletchercsi.com/resources/ci-tips/">CI Tips</a></li></ul></li><li id="menu-item-4865" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-4865"><a href="https://fletchercsi.com/contact/">Contact Us</a></li></ul></div></div></nav><div id="content" class="site-content"><div class="wrapper"><main id="main full-width" class="site-main topheavy" role="main"><article id="post-10" class="post-10 page type-page status-publish hentry"><div class="entry-container no-hyphens"><div class="entry-content"> <script defer src="data:text/javascript;base64,DQoJalF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoJCkgew0KCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2IEVESVQgQ09QWSBIRVJFIHYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8NCgkJd2luZG93LmR5bmFtaWNfY2FyZWVyc19kaWN0aW9uYXJ5ID0gew0KCQkJJ0dlbmVyYWwgQXBwbGljYXRpb24nOiB7DQoJCQkJZGVzY3JpcHRpb25fcGFyYWdyYXBoczogWw0KCQkJCQknV2UgYXJlIGFsd2F5cyBsb29raW5nIGZvciB0aGUgcmlnaHQgY2FuZGlkYXRlcyB0byBqb2luIG91ciB0ZWFtLiBJZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gbGVhcm5pbmcgbW9yZSBhYm91dCBjYXJlZXIgb3Bwb3J0dW5pdGllcyB3aXRoIEZsZXRjaGVyLCBwbGVhc2UgYXBwbHkgd2l0aCB5b3VyIGNvdmVyIGxldHRlciBhbmQgcmVzdW1lLicsDQoJCQkJCSdGbGV0Y2hlciBvZmZlcnMgZnVsbCBiZW5lZml0cyBpbmNsdWRpbmcgNDAxayBtYXRjaCwgcHJvZml0IHNoYXJpbmcsIGFuZCBhIGZsZXhpYmxlIHdvcmtpbmcgZW52aXJvbm1lbnQuJywNCgkJCQldLA0KCQkJfSwNCgkJfTsNCg0KCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBeIEVESVQgQ09QWSBIRVJFIF4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8NCgl9KTsNCg=="></script> <div id="" class="page-container container-fluid"><div id="hero-container" class="row"><div class="col position-relative background-image-zoom-on-hover-parent"><div id="industry-image" role="img" aria-label="" class="row background-image-zoom-on-hover-child" style="background-image: url('https://fletchercsi.com/wp-content/uploads/2023/04/pexels-fauxels-3184639-scaled.jpg');"></div><div id="industry-image-filter" class="row position-absolute-stretch-to-fill background-fcsi-gradient-1-blue pass-through-pointer-events"></div><div class="row pass-through-pointer-events" id="hero-copy-container"><div class="col max-width-outer-horizontal-bounds"><div class="row all-width-two-thirds mb-40" id="industry-description"><div class="col color-white"> <span id="dynamic-hero-image-copy" class="no-hyphens"><h1>About Fletcher/CSI</h1><div class="su-spacer" style="height:40px"></div> Our guiding principle to deliver strategic insights that support decisions is a key reason the world's leading companies turn to Fletcher/CSI for a competitive edge. Founded in 1988 Fletcher has grown into one of the longest running, continuously operated primary research firms. With offices in North America and Europe and global partnerships, Fletcher provides five strategic consulting services: Market Intelligence Platform, Primary Research, Win/Loss Analysis, Strategy Workshops, and Trade Show Intelligence. Fletcher's services support clients in Life Sciences, Technology, Finance &amp; Insurance, Industrial, and Consumer Packaged Goods industries.</span></div></div><div class="row" id="industry-contact-cta"><div class="col"> <a class="button m-unset catch-pointer-events" href="../contact/">Get in Touch</a></div></div></div></div></div></div><div class="row block-seperator border-top-green"></div><div id="history-container" class="row justify-content-center min-height-page-block"><div id="company" data-anchor="company" data-anchor-in-url="yes" class="col copy-col"><div class="row h-100 align-items-center justify-content-end"><div class="col max-width-half-outer-horizontal-bounds py-80 center-aligned-right-padding no-hyphens mb-20"><h3>History</h3><div class="su-spacer" style="height:20px"></div> In 1988 Erik Glitman founded the firm that has grown into today's Fletcher/CSI. The company, then called Fletcher Mountain Group, focused on primary data collection and analysis to support strategic decision making for a global clientele. By 1999, Fletcher Mountain Group's services had expanded to include Win/Loss, market insights, benchmarking, and sales force assessment. In 2000, the company merged with a sales focused entity, Competitive Sales Intelligence or CSI, to become today's Fletcher/CSI. We've shortened the name to Fletcher as a reflection of how we are known in the market. In response to our growth over the past 34 years, Fletcher has opened offices in London and Paris continuously expanded our global primary research collection and analysis capabilities.</div></div></div><div class="col image-col background-image-zoom-on-hover-parent"><div id="extra-copy-image" role="img" aria-label="Extra Copy Image" class="row background-image-zoom-on-hover-child" style="background-image: url('https://fletchercsi.com/wp-content/uploads/2023/04/pexels-anna-tarazevich-6712383-scaled.jpg');"></div><div id="extra-copy-image-gradient-mask" class="row position-absolute-stretch-to-fill pass-through-pointer-events"></div></div></div><div class="row block-seperator border-top-green"></div><div id="ethos-container" class="row justify-content-center min-height-page-block background-color-off-white"><div class="col image-col background-image-zoom-on-hover-parent"><div id="extra-copy-image" role="img" aria-label="Extra Copy Image" class="row background-image-zoom-on-hover-child" style="background-image: url('https://fletchercsi.com/wp-content/uploads/2023/04/pexels-rostislav-uzunov-5011647-scaled.jpg');"></div><div id="extra-copy-image-gradient-mask" class="row position-absolute-stretch-to-fill pass-through-pointer-events"></div></div><div class="col copy-col"><div class="row h-100 align-items-center"><div class="col max-width-half-outer-horizontal-bounds py-80 center-aligned-left-padding no-hyphens"><h3>Ethos</h3><div class="su-spacer" style="height:20px"></div> Across the years, Fletcher has stayed true to its original purpose to support client decision making with ethically sourced primary data collection enhanced with current technology and secondary data gathering tools. A key component of the company's character remains a dedication to in-house employees based in the U.S. and the UK. Fletcher's in-house research managers and analysts collaborate with a global network of affiliates in more than 25 countries. These affiliates provide on-the-ground support in global markets.<div class="su-spacer" style="height:20px"></div> In addition to our client focused activities, Fletcher staff members contribute to the continued development of the Competitive and Market Intelligence industry. Staff members are regular speakers at leading industry events and lead workshops on a variety of CI/MI topics. With a well-deserved reputation as true thought leaders for their innovative perspectives on markets and market drivers, Fletcher staff are on-going participants in the improvement and professional development of the CI/MI industry.</div></div></div></div><div class="row block-seperator border-top-green"></div><div id="code-of-ethics-container" class="row py-80 justify-content-center min-height-page-block"><div class="col max-width-outer-horizontal-bounds"><div class="row"><div class="col"><div class="row h-100 align-items-center justify-content-end"><div class="col"><div class="row mb-20"><div class="col"><h3 class="header">Code of Ethics</h3></div></div><div class="row"><div class="col no-hyphens"><div class="row"><div class="col no-hyphens">Fletcher provides services to some of the most advanced, as well as market sensitive clients worldwide. To guide staff and clients in the collection of competitor data, we have established a Code of Ethics.</div></div></div></div></div></div></div><div class="col all-width-fit-content"> <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEh0lEQVR4nO2beYhXVRTHPzNqli0Wqe0lChUtiFJB4VgWLWSbacsf/hNEVrRQZDsuCLZSREUUFLSoJDXkQEMwtI3hkCXSZkSEtmhllKVOaakvjnwvHJ7vtw2/+f3e7733gYvP887vLufd5dxz70BBQbPpAb4CZgFDySGRSz8C9wNjyBGR0hfueSfwEXAvcBYwkgwTKRlTgTeAv2M9w9J6YJWGzDLgBeBgMmaAwAjgUuBZoA/YkmAQS1eSUQPEaQOOASYA5wC9+s1V5MQAcZZl0QDLgY48GyBSWgPcrC6fKwPMAzYmGMMmwtnAZOB4YDTQmUUDGPsA1wJvAltLzPw+Zc4AnuHAecDdwKvAamAd8If07d8TyekqkCmiwgAUPSAipwx1Q2AYOeQ6Z4BbyBnDgO+cAX7L+r4/zmw13MJhH+r5YXLCcOAHNXomMBHYBfwDHEcOuE2N/xxol2yxZOb1ZZp9gZ/U2Muc/GiFwnYDp5Fh7lLjP1Wkx/OI3n1Ai3GhUiUOADapkRclvB+p1SDeO1LNeOBfYAdwRAXd+9Q4C3mX4lbpfN0qByUvu7X8gTJ69nV/l56Fv8v5B99IzyJDqeYEHWLsdrH7ISV050vnvSrynS7dX4GDSDGLVdHn3VeblqBnBxib9X5KlXmH0PciUspJcl5s7I8F5qjCXQm6i/TunRryP0M9K7XO0etq1DP6/yhgu4bEsU5vtIvvWaM8tgzeoBRfEo2l+t0rpIxTnet6pJO/pgovdLLHJXs7wSFa4ibQJZLFV5idKmtSQj3GyqV+lAbTqUo/GZN3SL5Rs/nhQL9k5uXdIdf3MJ35mfwvJXteqXfG2QqLR2Umz2Dw/4BxNIiJGpv9amCcL1WpGcBTziCR8wHW69mivKcorXOyYOCwsoTl8xJXzgT1jKBnp8UNoUsFPlbBkVmtOWGXGmirwwZX4ZWxixBjJAvvtwEPAvsBt0u21jlH3ZJ1apjsiM09g8Lp+vpbNblRYskL3T7SRBY4BHgaeCJhvCOZDavngKOc3A5MvlV+N2p4hOEzyi3HYUIeNLpV0EMV9F50Nz3MWaoHM5TnL8AnerYe4pfk+KRcV850Vj+0gm5Yvl6qY/ltmj9Cz/oZ2D/hwNR616DQowIW1LBEljvhHQjBObJ63BR7d7LK7R+MS1YdKnRzFfdyukoskfVivnpYUhj9LZVtcYW68r4ynlvlJLnNreeNZJIrv9QkXTPn1vD1303wBBtNd73rsEIZ2gXGckx1x9bNvL4WJus/61GPC9yhhYWzyhGcFdsVNpueKodsRfpqaNQQRXNDmLuZBEfJXOgDB5rJNGWyqYqvn0bCadM9A83gY2VgO7hW5Pwahu9eXO52cXZttVUJnuOdtbqca/RD29nFe0VfC8kudh8yafOVyEz9aIO2opXu86RdtqqW+wftwGdu20mKG1at7Ar3xxh2Kl2Wa1wUxvbgSU5Rb4vJ2txHtTsJZdfxtVK8nmxxtdr1fYkPu4dZLiZXUqlFaXd/kmP3khJ9/SiHaUXeDdDblP5YUFBQUEA6+B8fYkIVP7Vj9gAAAABJRU5ErkJggg=="></div></div><div class="row mt-20"><div class="col no-hyphens"><ul class="m-0 ml-20"><li>Fletcher collects data in a manner designed to result in accurate and reliable data.</li><li>Fletcher collects intelligence through direct contact with competitor employees, taking steps to assure that sources are clearly, and accurately informed and no confidential information is shared.</li><li>Espionage activities are not within Fletcher's scope of services. Requests for such actions will be rejected. Employees may not engage in these activities on behalf of a client.</li><li>Business standards differ across the world. Fletcher and its affiliates (when working on Fletcher projects) will use standard U.S. business ethics when operating outside the U.S.</li><li>All data collection activities prohibited by U.S. legislation are prohibited by Fletcher's code of ethics. Foreign affiliates are required to abide by U.S. legislation on the subject of data collection, even if certain activities are permitted under local law.</li><li>Fletcher will not permit its clients or itself to be exposed to legal action as a result of employee or affiliate actions on Fletcher's behalf.</li><li>To avoid possible conflicts between similar client investigations, Fletcher will create and assign separate and disparate research and project management teams in any potentially conflicting project scenarios.</li><li>Client confidentiality is essential to Fletcher's business and Fletcher's internal operating and ethics policies assure adherence to all client confidentiality agreements. Clients may be identified only with prior client approval and if identification is necessary to achieve data collection goals. All Fletcher affiliates are expected to abide by the Fletcher Code of Ethics while participating in Fletcher projects. All Fletcher employees are required to abide by the Fletcher Code of Ethics at all times.</li><li>In addition to its own code of ethics, Fletcher follows the <a href="https://www.scip.org/page/Ethical-Intelligence">Strategic and Competitive Intelligence Professionals (SCIP) Code of Ethics</a>.</li></ul></div></div></div></div><div class="row block-seperator border-top-green"></div><div id="careers-container" class="row justify-content-center min-height-page-block background-color-off-white"><div id="careers" data-anchor="careers" data-anchor-in-url="yes" class="col max-width-outer-horizontal-bounds py-80"><div class="row"><div class="col"><div class="row mb-20"><div class="col"><h3 class="header">Careers</h3></div></div><div class="row"><div class="col no-hyphens"><h5>Join Our Team</h5><div class="su-spacer" style="height:15px"></div> Fletcher offers an exciting and engaging work environment with headquarters based in Burlington, Vermont, an office in London, UK as well as affiliates in Europe and other parts of the world. We help drive critical business decisions and advise many of the world's Fortune 500 companies. Our standards are demanding, our work is rewarding and impacts global markets. We balance demanding schedules with flexibility and a generous range of benefits not limited to 401(k) match, health and dental coverage, a hybrid work environment, and self-managed PTO and Holiday time off.<div class="su-spacer" style="height:10px"></div> Fletcher believes in fostering trusting and respectful relationships with our coworkers, enabling everyone to do their best work in a way that works best for them and their families, while encouraging personal and professional growth.</div></div></div></div><div class="row"><div class="col"><div class="row mt-40"><div class="col"><h4 class="header">Opportunities</h4></div></div><div class="row flex-nowrap careers-parent mt-10"><div id="careers-col" class="col-3 pt-10 px-0"><div class="row pt-10 pb-20 career-title-row template"><div class="col"> <button type="button" class="career-title-button trigger-link" data-title=""><div class="container"><div class="row w-100 flex-nowrap"><div class="col pr-10 all-width-fit-content d-flex align-items-center indicator"> <i class="fa fa-angle-double-right height-fit-content" aria-hidden="true"></i></div><div class="col text-left underline-on-hover link line-height-fcsi-1"></div></div></div> </button></div></div></div><div class="col-9 careers"><div class="container p-0 h-100 all-width-100pct w-100"><div class="row h-100"><div class="col h-100"><li class="splide__slide h-100 horizontal-borders-transparent template"><div class="container h-100 px-30 career"><div class="row ml-40 border-left-1px-solid-black pl-40 min-height-100pct height-fit-content align-items-center career-detail-row"><div class="col detail-container height-fit-content"><div class="row description-paragraph py-10 template"></div><div class="row description-paragraphs"></div><div class="row pt-20"><div class="col d-flex justify-content-center"> <a class="button m-unset border-fcsi-secondary-light-green catch-pointer-events dark" href="mailto:careers@fletchercsi.com">Apply Now</a></div></div></div></div></div></li><div id="careers-carousel" class="splide h-100" role="group" aria-label=""><div class="splide__track h-100"><ul class="splide__list h-100"></ul></div></div></div></div></div></div></div></div></div></div></div><div class="row block-seperator border-top-green"></div><div id="code-of-ethics-container" class="row py-80 justify-content-center min-height-page-block"><div id="privacypolicy" data-anchor="privacypolicy" data-anchor-in-url="yes" class="col max-width-outer-horizontal-bounds"><div class="row"><div class="col"><div class="row h-100 align-items-center justify-content-end"><div class="col"><div class="row mb-10"><div class="col"><h3 class="header">Privacy Policy</h3></div><div class="col all-width-fit-content"> <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsTAAALEwEAmpwYAAAHM0lEQVR4nO2be7BPVRTHPy6lh1RCCjWTymtMD0lTo3ClQnWb8ugho9BDkaFJDxIlxR+RJGZ6jlRopoiZur2YlNFUKFFoKskjPdDD6/6aNfM9M2vO/Pidl+tefGfOzO/us9faa6+z91prr7Uv7D8cB9wAXK/fBxWuADYBOT2b1HbAoyowHNitiS/Qk1PbMKCIAxSnAB+4yT4IVNHzkFPK+0ADDiBUAwYCWzXBdUBxnn4dgF/VZwswQLSVFkVAd2Cl2+uvA3X1/nhgqB77bTgRmOH6rwC6VrZtURu4B1gVmkin0Nde697b70vd+y4hxX2vVXQCFRSNgf7APGCnE9yUcKtbyjWA8UBZHiNYpndHq6/R9AVWO347gLnAnRqzXHAU0Ay4SF+mp5bt00Ap8JsT0At5dWjpdndf3fo8IK9gz/1qs3drgMscnfEoEU+v3JzGLpUsQyVbF8naTLInRnVgMvBfaNB8zwZgur52eJm2kmUP+n4KnJNnPGv7wvWbl6efba8+GmtDBLlM9knA4UkU8LCYbAeWA58Ac4BXgCe1JzsDDfPQHgb0ABY6YTZKQXszaLbs7wX+dNviXX1VWylhNJQMJstYyTZHsi6X7Dm52dj4XMTtI/a3cPZaYIpcXTDxzcAYZ+mjwFbROGCb42MuciLQIgafYtEuJgFWiLhJHuEuBG7SKnkZWATsCi2/ZTJiafahKXUw8F3IsAboIo/TVTKFldzEeaHYWCTi1qH2n/ew37Yr0rtvD3s8LYzno8CNrm1bHqV7tFa7zSU23hVxx1D7aO3t6RKoN9DGua+oaCWbkMadlch1zpJM5k08OmoONpfYmCHibmSPge6r7ZQh2xfopjFsLrExVcS2j7PAGcBIHYI2ivd7bumOUmxg4XBW6Cv+NpfYGCfiIRkI0izPfrUv3yiPLVmbYcg7RDxtLrExXMT2ZdJivHjNdaGvnQ7ru4nPdK7XQt0sMEr8bC6xMUDEEzIQ5E3xukaTCwKjWk4BxfIgOblWc23NU447QfxsLrHRywmTFnPEq7NTwI/AkSEFeOMYRIJmF5LiZfGxuSRyMTngLdIjMHYdnAJWKhtU5hRwm5t8qeyEZYrqJBz3LfGyucRGOxF/RHrMF6+LnQK+0rt/nQJ6uYyQKefjmOF4GB+J3uYSG2eLeCnp8ZmLKgMFWJvhd6eA7vr9h97N1N/XJRx3qehtLrFRR8QmYFp86QQJFPCh3q1zCigJKWCK/u6XcNzgVJnYrW4Tg5qkw3LxaeoUYC4Rl/ExBVweUsAT+tuSHXFR07nb1II3j0FzKvCshLdAB5cfbOQUYK7R8LVTwCUhBQRu0XjFRQvRGv/EeEdM7Jwf9xQZRHu93QnS8v136Pc09V/sDF3rkAL6pQhlu4p2NikwMsEXCLbNa3JxZS6XV1eraYk7ZA2QQaytZbtQKwjVDQNeSUN5y1kkRqcErnCNaE53oWguoS25MsVXDEJun26PjVr6gluV54szcFslVoOTX06RXxy0TRiLWBL0bwVRqSvP3zgjFQXT1f/GkCXPJajwnCc6OyTFQccMYxhGi5nl3qNgrPqbBUeWf7dWUr2YYyfN6U0Sndmw1DhXzH5SeFoIt6v/867tDbeXbVtERQOXI4gKW2W/iO4sMsIaMTQ/XQjnh2L9oDS+2fnlQdrfhXCsaCyii4r2orFMcmZ4TEztSxbCESpz7ZARDdBcRU7vFYoj8MrpwBQVs0TzCBmivia0U78LYbaEsJx+uPLTQ4mKF0IKyoe64mNlsChoKBktRX8SGWOahHk8Qt8gpl+tr5gUwXayw1QUjMkwibNHl7QtgjUvUqY3J4ucFHeLx0sR+p4s35+T4d4nmK0BnonQtyXwj/rbRJIgKK5a2bsQJmeYwdqrX94pe3Am0Q4kQQwwJKIbDdBTE/oLOKZA36Yx5UqFiRJsfsTIrr+7AVYqN7U3u3CKzhDBAequAvyLVA63vk9RDqjt4vuo6eargPXO/e1Spin8+OJJme4NFsIg9V8fwatkhqudQbSSVxTUUllsmbu4kO/ZqmSJGd1CaOwMn5XKyxVTXWRXaI+GUVW1/PBjl6iioqbLWD3HfkANd3HhzZgGLi2KXM5/ZYLSfGZo7GJ8C5fLC0HAs7k8rH4htHE3yWyP72sM01g7UhRMMsfNrsQ1WG7JMkMeWbQF5e4y3VGqULglz0UpjyzaAhdqmeYKiRtCtzmrZqCAqqE0u2WKKzRKXMFztrPQCxQ9ehRqM9q3XU4gUZV3f+ACd5V1ScJ/gKjniiabZWwrFU5zly3XxqzQ2p2iH1xOodxuhmeNWu5uwBYlSgqhnUpjwcXq4B8sKi2qA686I7a3a3fdnP2YlaCQUmFRBRjhfPiIPKHzQBdLjK9s/yYTFX2cm3xRJaxqLpuzS/mDAxpd3Ln/Wz3B0brcj7T7Cy1D/1S1Sm0HFaqrMFIcs1x2CIdwCGSG/wGk87XZxkcJpQAAAABJRU5ErkJggg=="></div></div><div class="row"><div class="col no-hyphens"><div class="row"><div class="col">Effective date: April 4, 2020</div></div><div class="row mt-20"><div class="col no-hyphens"> Fletcher/CSI, Inc. (“FCSI”, “us”, “we”, or “our”) refers to the www.fletchercsi.com website and all operations of Fletcher/CSI, Inc. known as the “Service”. This page informs you of our policies regarding the collection, use, and disclosure of personal data when you use our Service and the choices you have associated with that data. “Service” includes our website and business operations, such as primary research and win/loss.<div class="su-spacer" style="height:20px"></div> We use your data to provide and improve the Service. By using the Service, you agree to the collection and use of information in accordance with this policy. Unless otherwise defined in this Privacy Policy, terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, accessible from www.fletchercsi.com.</div></div></div></div></div></div></div></div><div class="row mt-30 entire-policy-row"> <button type="button" id="expand-privacy-policy" class="border-0 p-0 background-transparent color-fcsi-primary-blue all-width-100pct underline-on-hover box-shadow-none outline-none expand-caret-button"><div class="col"><div class="row"><div class="col text-left"><h4 class="toggle-language"><span class="collapsed">Expand to View Entire</span><span class="expanded d-none">Collapse Privacy</span> Policy</h4></div><div class="col all-width-fit-content"><h4 class="caret-icons"><i class="fa fa-caret-down" aria-hidden="true"></i><i class="fa fa-caret-up d-none" aria-hidden="true"></i></h4></div></div></div> </button></div><div id="entire-policy" class="row no-hyphens d-none"><div class="col"><div class="row"><div class="col"><div class="row mt-20"><div class="col"><h4 class="underline">Definitions:</h4></div><div class="col"><div class="row justify-content-end"><div class="col all-width-fit-content"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsTAAALEwEAmpwYAAACrElEQVR4nO2bzWvUQBjGf4r4Ra+e3IKo0KMHFQXtfyAIgtA/wYPgzb9AtH6ACl68eBAEP2q9aIuXHhpXETx7EKQgK4JS2i56UyOBZyGErJlsZjaTzTwwhHnfybvvPMw8O3lDICAgIKAY08AC0Adij9tXYB7YieXJr3swuTLtmk0CFhT0FdDBb5xOrQRr6Cuo75MfYLAKnAXspmxvMvZ0f2IJiFK2VZc/7CsBwxAIIKwA4jaLYJTRhNaJoC+oTQRpOwHdtpwDfF8ptYlg3BYConASrMb8BWALOEFLNeCjxj2wkFuVPKwHNBl3JDVuA9hlKceyedQmglcylZszNhMtkUdtIvhJY17r+tBmoiXycBIwLhh3VP5vwGHgr6pNuy3mapKHs4Bxwbh5+e+p/0H9s4aV6KQw+wR4ATy3kK8xbBCwDfgs/6xsl9V/NGIlumq+xrAhgsfl6wHbZTuQ2gZ7DCrRyXXJBwKiEUTwpnx3Mvb3sp8zrERP+0BA2XHJ8l8rWM6PDWMV+Uz8YyfgpOy/cyb+R9vgJ7B3Ugm4LfutIfe9lf98UwjolhDBZPl/kX3Yw88l+Z8VxDLxmfjHKoKnZFsTGXnYr63wC5gqIYKdJmyBu7LdKLh3VePm1F9Uf0mTRtfl1O+kfaPka4wqBPRkO1Zw78XMNpj5z0Hoh1reNiyTrzGqELACvDS4d58elNLv9ZMl/lTFkyTupvoHgUMia0tbcpR8jWHjJDhOeCWCdcCrLVAHAgGEFUAQQRzuqSiIYD6CCBL+BWjF32A3nAQJJ8E8BA2gfg2YVQ7fbQaN1e5nnsN9btddEBA3pCWv4Ha4IOCdKjW+wtkWjNWSN7q0kYB+Qz6YcEbAYkEV1gcM1D8pwlrHTIM+mrqKI3QyFVrfWk+Tt/q5XEBAABOPf4567oSyO2fkAAAAAElFTkSuQmCC"></div></div></div></div><div class="row"><div class="col"><div class="row"><div class="col"><h5>Service</h5></div></div><div class="row mt-5"><div class="col">Service is the www.fletchercsi.com website operated by Fletcher/CSI, Inc. & our business operations.</div></div></div></div><div class="row mt-20"><div class="col"><div class="row"><div class="col"><h5>Personal Data</h5></div></div><div class="row mt-5"><div class="col">Personal Data means data about a living individual who can be identified from those data (or from those and other information either in our possession or likely to come into our possession).</div></div></div></div><div class="row mt-20"><div class="col"><div class="row"><div class="col"><h5>Usage Data</h5></div></div><div class="row mt-5"><div class="col">Usage Data is data collected automatically either generated by the use of the Service or from the Service infrastructure itself (for example, the duration of a page visit).</div></div></div></div><div class="row mt-20"><div class="col"><div class="row"><div class="col"><h5>Cookies</h5></div></div><div class="row mt-5"><div class="col">Cookies are small pieces of data stored on your device (computer or mobile device).</div></div></div></div><div class="row mt-20"><div class="col"><div class="row"><div class="col"><h5>Data Controller</h5></div></div><div class="row mt-5"><div class="col"><div class="row"><div class="col">Data Controller means the natural or legal person who (either alone or jointly or in common with other persons) determines the purposes for which and the manner in which any personal information are, or are to be, processed.</div></div><div class="row mt-10"><div class="col">For the purpose of this Privacy Policy, we are a Data Controller of your Personal Data.</div></div></div></div></div></div><div class="row mt-20"><div class="col"><div class="row"><div class="col"><h5>Data Processors (or Service Providers)</h5></div></div><div class="row mt-5"><div class="col"><div class="row"><div class="col">Data Processor (or Service Provider) means any natural or legal person who processes the data on behalf of the Data Controller.</div></div><div class="row mt-10"><div class="col">We may use the services of various Service Providers in order to process your data more effectively.</div></div></div></div></div></div><div class="row mt-20"><div class="col"><div class="row"><div class="col"><h5>Data Subject (or User)</h5></div></div><div class="row mt-5"><div class="col">Data Subject is any living individual who is using our Service and is the subject of Personal Data.</div></div></div></div><div class="row mt-20"><div class="col"><div class="row"><div class="col"><h5>Information Collection and Use</h5></div></div><div class="row mt-5"><div class="col">We collect several different types of information for various purposes to provide and improve our Service to you.</div></div></div></div><div class="row mt-40"><div class="col"><h4 class="underline">Types of Data Collected:</h4></div><div class="col"><div class="row justify-content-end"><div class="col all-width-fit-content"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsTAAALEwEAmpwYAAACo0lEQVR4nO1au24UMRQ90q62TCSkrEKTD0HhA7J9SrKpoA4dfAAbvoLkT/KigipbgEIBYhNKCn7AyNIdyXL8tmdsTe6RrB3ZHs85Z+6949EOwGAwGGlYANgAEJWb5HCACtg0IL5rv2sYIKjVRjUegg0AR4CoEXq1I3HRWAEc/GmwaUBs1aeBaCT3q/ESbAA4AgTaQ++RuWi8APb+NNg0IK7q00A0mvuD8RRsADgCBNrH4CkwA/ARwB8ADwBOqe/JGHBqqMIrPCEDHqj/BYB9OpZ9udgG8I7aVgGevRuwD+AlHd9nXmsOYK1cc019OTyzISwLrwwp8KGQ+LV2PG+1CK4oEu5J/KyQ+LmlL4VnMt4A+FVgYZnT7x057RIaY0LH8yeA18jEoSG8+8jpEIGhJuh8pYYkTADc0SInGQb4cjrm7obM7Xi+pV+pYZrAG0faAikGhOR0bJHzmdDxnCo3UGqJvvvftZNjDdgBcEvnfAOwaxkzjceu/VwZU3ku6fhHbBQcGcInxgDfXYqt7L5rfFH6VZ5JUTCxnBRqwBDi1bWk+CsHT9PNdGJpCZsQA1xhHzJeAjpPUzpbMXFM9hnQgngbz+BasHRMdBnQingbz6AomHoKhsuAr56c9o2XhI2ntxa8UiZIx3TcaMVGxTUVo3nieEnYeKrFXWp9hEsaPMZ4cUwaL0yD/2hQvrSMFdukUWp9BFG4/QVwBuBZBmF57jmtVZpf7wYIy1Y1FPp2eTADSmEvY8en7xblWqUwmAGpQnKMa86AnFAeaqvcuwFdMTsLLGZyzqfM4tmcAS2BDUBgBHymbSVG1hdsgDBMHEMfG4DACLihtziMrI+LIPgxCN4HwPM//1jh/H5h1eOrZ2vN+P3CTPmfX4y05X6/wGAwMC78B5aulBJSh5axAAAAAElFTkSuQmCC"></div></div></div></div><div class="row"><div class="col"><div class="row"><div class="col"><h5>Personal Data</h5></div></div><div class="row mt-5"><div class="col">While using our Service, we may ask you to provide us with certain personally identifiable information that can be used to contact or identify you (“Personal Data”). Personally identifiable information may include, but is not limited to:</div></div><div class="row"><div class="col"><ul class="m-0 ml-20"><li>Email address</li><li>First name and last name</li><li>Phone number</li><li>Address, State, Province, ZIP/Postal code, City</li><li>Cookies and Usage Data</li></ul></div></div><div class="row mt-10"><div class="col">We may use your Personal Data to contact you with newsletters, marketing or promotional materials and other information that may be of interest to you. You may opt-out of receiving any, or all, of these communications from us by following the unsubscribe link or instructions provided in any email we send.</div></div></div></div><div class="row mt-20"><div class="col"><div class="row"><div class="col"><h5>Usage Data</h5></div></div><div class="row mt-5"><div class="col">We may also collect information on how the Service is accessed and used (“Usage Data”). This Usage Data may include information such as your computer's Internet Protocol address (e.g. IP address), browser type, browser version, the pages of our Service that you visit, the time and date of your visit, the time spent on those pages, unique device identifiers and other diagnostic data.</div></div></div></div><div class="row mt-20"><div class="col"><div class="row"><div class="col"><h5>Tracking Cookies Data</h5></div></div><div class="row mt-5"><div class="col">We use cookies and similar tracking technologies to track the activity on our Service and hold certain information.</div></div><div class="row mt-10"><div class="col">Cookies are files with a small amount of data which may include an anonymous unique identifier. Cookies are sent to your browser from a website and stored on your device. Tracking technologies also used are beacons, tags, and scripts to collect and track information and to improve and analyze our Service.</div></div><div class="row mt-10"><div class="col">You can instruct your browser to refuse all cookies or to indicate when a cookie is being sent. However, if you do not accept cookies, you may not be able to use some portions of our Service.</div></div><div class="row mt-10"><div class="col">Examples of Cookies we use:</div></div><div class="row mt-5"><div class="col"><ul class="m-0 ml-20"><li><b>Session Cookies.</b> We use Session Cookies to operate our Service.</li><li class="mt-5"><b>Preference Cookies.</b> We use Preference Cookies to remember your preferences and various settings.</li><li class="mt-5"><b>Security Cookies.</b> We use Security Cookies for security purposes.</li></ul></div></div></div></div><div class="row mt-20"><div class="col"><div class="row"><div class="col"><h5>Use of Data</h5></div></div><div class="row mt-5"><div class="col">Fletcher/CSI, Inc. uses the collected data for various purposes:</div></div><div class="row mt-5"><div class="col"><ul class="m-0 ml-20"><li>To provide and maintain our Service</li><li class="mt-5">To notify you about changes to our Service</li><li class="mt-5">To allow you to participate in interactive features of our Service when you choose to do so</li><li class="mt-5">To provide customer support</li><li class="mt-5">To gather analysis or valuable information so that we can improve our Service</li><li class="mt-5">To monitor the usage of our Service</li><li class="mt-5">To detect, prevent and address technical issues</li></ul></div></div><div class="row mt-10"><div class="col">To provide you with news, special offers, and general information about other goods, services, and events which we offer that are similar to those that you have already purchased or inquired about unless you have opted not to receive such information.</div></div></div></div><div class="row mt-20"><div class="col"><div class="row"><div class="col"><h5>Legal Basis for Processing Personal Data Under General Data Protection Regulation (GDPR)</h5></div></div><div class="row mt-5"><div class="col">If you are from the European Economic Area (EEA), Fletcher/CSI, Inc. legal basis for collecting and using the personal information described in this Privacy Policy depends on the Personal Data we collect and the specific context in which we collect it.</div></div><div class="row mt-10"><div class="col">Fletcher/CSI, Inc. may process your Personal Data because:</div></div><div class="row mt-5"><div class="col"><ul class="m-0 ml-20"><li>We need to perform a contract with you</li><li class="mt-5">You have given us permission to do so</li><li class="mt-5">The processing is in our legitimate interests and it's not overridden by your rights</li><li class="mt-5">To comply with the law</li></ul></div></div></div></div><div class="row mt-20"><div class="col"><div class="row"><div class="col"><h5>Retention of Data</h5></div></div><div class="row mt-5"><div class="col">Fletcher/CSI, Inc. will retain your Personal Data only for as long as is necessary for the purposes set out in this Privacy Policy. We will retain and use your Personal Data to the extent necessary to comply with our legal obligations (for example, if we are required to retain your data to comply with applicable laws), resolve disputes, and enforce our legal agreements and policies.</div></div><div class="row mt-10"><div class="col">Fletcher/CSI, Inc. will also retain Usage Data for internal analysis purposes. Usage Data is generally retained for a shorter period of time, except when this data is used to strengthen the security or to improve the functionality of our Service, or we are legally obligated to retain this data for longer time periods.</div></div></div></div><div class="row mt-20"><div class="col"><div class="row"><div class="col"><h5>Transfer of Data</h5></div></div><div class="row mt-5"><div class="col">Your information, including Personal Data, may be transferred to — and maintained on — computers located outside of your state, province, country or other governmental jurisdiction where the data protection laws may differ than those from your jurisdiction.</div></div><div class="row mt-10"><div class="col">If you are located outside the United States and choose to provide information to us, please note that we transfer the data, including Personal Data, to the United States and process it there.</div></div><div class="row mt-10"><div class="col">Your consent to this Privacy Policy followed by your submission of such information represents your agreement to that transfer.</div></div><div class="row mt-10"><div class="col">Fletcher/CSI, Inc. will take all steps reasonably necessary to ensure that your data is treated securely and in accordance with this Privacy Policy and no transfer of your Personal Data will take place to an organization or a country unless there are adequate controls in place including the security of your data and other personal information.</div></div></div></div><div class="row mt-40"><div class="col"><h4 class="underline">Disclosure of Data:</h4></div><div class="col"><div class="row justify-content-end"><div class="col all-width-fit-content"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsTAAALEwEAmpwYAAADaUlEQVR4nO2by29NURTGf520FbSC3qBRYiReAxID6dhjIqEhMRDvoFpEYmBgIqX1J3gFMRcNMTFs6xGPohVihtQYFY9SR7Z8J9m59jn3uLmnzrndX7KSe89eZ5+1vrP2Wmvv3oKHh4eHx+RGLXAWeA8EVSIjQI98K4meDBiclnQnIWBEymuoHrRakVASgaTakNivwBOAj4CgiiXxEgiqVHwOKIXA5wB8EgyoPqSaAwrAI6CPSUhAARjSPQ+ZBAT0y9FCkfND+h5iwFGC+kuMlyP9E03AI8vhKOdDooqN7SsxXo70TTQBTcBzS+8lMIfso6I5oKBlEC6FPMB3gvhWGN8HUMm1Ivg+gOR9QBqSqz4gSEF8H5AQvg/Al0FSK4NM9ggo+PMA/pDmzwOoXB+QpL6bnele4AbwAvgIfAHeAL1AJzA3r31AX4wNi4DLwI8E84wB1ypJQMFyPMr5tFCvP9+P6dnfgZvADmAZ0Cgxn3cCt6RjEzKl1EOCjJ4HLFeYB3rz54H5Ce5rAS5a0fIMWJy3MtgGjMquYWBlGXOssgg0c23OCwGdwC/ZdEnLwEYdcBi4D3yWmM8djp/E1Ct3mLl+AgeyTsBx2WIIOOYYbwaexiTAQem45g1JNQRnkoCdMtK8qV2O8TrL+bdaJtMlm4BXGnsS8eMoUz7HJduyRsAGK9M7w1RhHzo/0zFurr2TzqGIOdqtarIuKwSYqvJBNnTF6D2QjnnzUdginXsxOqelY57Z5CJgwNGVpXltn55/B6iJMTysCibko9AgnU8xOjV6ltHb4yLAFRFpXqskAY15JKBgLYFTMYbfl45JeFFok87dGJ0z1hKY7TKw39GXp31trdXCRiXBTo2/ikmCr6Vjkp0LHdZ+YX1WkmCIrSpRphQeiSiDg7L1nRJeg6TNcv5xRBncb82/3fVT2Vb+Pw5aL+SkY7zZIsElxvl5jvtOyHEjR4sHu/9x2zqRYra104rsrVUo31ViHNXndsebNzvBq5prXFHwF2pFQhgJWZOXZW6GVuvesCpsJGdYYrW+pj0+ByxIcN9C4IruCc8vlpJT1Ck6v8oZs8e/rr2C2eNPVe1fAewGbhcdnnQl/aeJrKNFb/VbgiVjCLiQMFpyhxl6+706CP2qg9FhRYaJgln/20gPDw8PD3KC3zjRawFO7lF4AAAAAElFTkSuQmCC"></div></div></div></div><div class="row"><div class="col"><div class="row"><div class="col"><h5>Disclosure for Law Enforcement</h5></div></div><div class="row mt-5"><div class="col">Under certain circumstances, Fletcher/CSI, Inc. may be required to disclose your Personal Data if required to do so by law or in response to valid requests by public authorities (e.g., a court or a government agency).</div></div></div></div><div class="row mt-20"><div class="col"><div class="row"><div class="col"><h5>Legal Requirements</h5></div></div><div class="row mt-5"><div class="col">Fletcher/CSI, Inc. may disclose your Personal Data in the good faith belief that such action is necessary to:</div></div><div class="row mt-5"><div class="col"><ul class="m-0 ml-20"><li>Comply with a legal obligation</li><li class="mt-5">Protect and defend the rights or property of Fletcher/CSI, Inc.</li><li class="mt-5">Prevent or investigate possible wrongdoing in connection with the Service</li><li class="mt-5">Protect the personal safety of users of the Service or the public</li><li class="mt-5">Protect against legal liability</li></ul></div></div></div></div><div class="row mt-20"><div class="col"><div class="row"><div class="col"><h5>Security of Data</h5></div></div><div class="row mt-5"><div class="col">Users of our site and resources are responsible for maintaining the security of user IDs, passwords, or other authentications needed for access to secure sites. To protect your information, we may suspend use of a website without notice to investigate, if a breach of security is suspected. Access to password protected parts of our website is restricted to authorized users only. The security of your data is important to us but remember that no method of transmission over the Internet, or method of electronic storage is 100% secure. While we strive to use commercially acceptable means to protect your Personal Data, we cannot guarantee its absolute security.</div></div></div></div><div class="row mt-20"><div class="col"><div class="row"><div class="col"><h5>“Do Not Track” Signals</h5></div></div><div class="row mt-5"><div class="col">We do not support Do Not Track (“DNT”). Do Not Track is a preference you can set in your web browser to inform websites that you do not want to be tracked.</div></div><div class="row mt-10"><div class="col">You can enable or disable Do Not Track by visiting the Preferences or Settings page of your web browser.</div></div></div></div><div class="row mt-20"><div class="col"><div class="row"><div class="col"><h5>Your Data Protection Rights Under General Data Protection Regulation (GDPR)</h5></div></div><div class="row mt-5"><div class="col">If you are a resident of the European Economic Area (EEA), you have certain data protection rights. Fletcher/CSI, Inc. aims to take reasonable steps to allow you to correct, amend, delete, or limit the use of your Personal Data.</div></div><div class="row mt-10"><div class="col">If you wish to be informed what Personal Data we hold about you and if you want it to be removed from our systems, please contact us.</div></div><div class="row mt-10"><div class="col">In certain circumstances, you have the following data protection rights:</div></div><div class="row mt-5"><div class="col"><ul class="m-0 ml-20"><li><b>The right to access, update or to delete the information we have on you.</b> Whenever made possible, you can access, update or request deletion of your Personal Data directly within your account settings section. If you are unable to perform these actions yourself, please contact us to assist you.</li><li class="mt-5"><b>The right of rectification.</b> You have the right to have your information rectified if that information is inaccurate or incomplete.</li><li class="mt-5"><b>The right to object.</b> You have the right to object to our processing of your Personal Data. The right of restriction. You have the right to request that we restrict the processing of your personal information.</li><li class="mt-5"><b>The right to data portability.</b> You have the right to be provided with a copy of the information we have on you in a structured, machine-readable and commonly used format.</li><li class="mt-5"><b>The right to withdraw consent.</b> You also have the right to withdraw your consent at any time where Fletcher/CSI, Inc. relied on your consent to process your personal information.</li></ul></div></div><div class="row mt-10"><div class="col">Please note that we may ask you to verify your identity before responding to such requests.</div></div><div class="row mt-10"><div class="col">You have the right to complain to a Data Protection Authority about our collection and use of your Personal Data. For more information, please contact your local data protection authority in the European Economic Area (EEA).</div></div></div></div><div class="row mt-20"><div class="col"><div class="row"><div class="col"><h5>Service Providers</h5></div></div><div class="row mt-5"><div class="col">We may employ third-party companies and individuals to facilitate our Service (“Service Providers”), to provide the Service on our behalf, to perform Service-related services or to assist us in analyzing how our Service is used.</div></div><div class="row mt-10"><div class="col">These third parties have access to your Personal Data only to perform these tasks on our behalf and are obligated not to disclose or use it for any other purpose.</div></div></div></div><div class="row mt-20"><div class="col"><div class="row"><div class="col"><h5>Third Party Processors</h5></div></div><div class="row mt-5"><div class="col">Our carefully selected partners and service providers may process personal information about you on our behalf as described below:</div></div></div></div><div class="row mt-5"><div class="col"><ul class="m-0 ml-20"><li><div class="row"><div class="col"><b>Digital Marketing Service Providers</b></div></div><div class="row mt-5"><div class="col">We periodically appoint digital marketing agents to conduct marketing activity on our behalf, such activity may result in the compliant processing of personal information. Our appointed data processors include:</div></div><div class="row mt-5"><div class="col"><ul class="m-0 ml-20 list-square"><li><b>(i)Prospect Global Ltd (trading as Sopro) Reg. UK Co. 09648733. You can contact Sopro and view their privacy policy here: http://sopro.io. Sopro are registered with the ICO Reg: ZA346877 their Data Protection Officer can be emailed at: <a href="mailto:dpo@sopro.io">dpo@sopro.io</a>.</b></li></ul></div></div></li><li class="mt-5"><div class="row"><div class="col"><b>Analytics</b></div></div><div class="row mt-5"><div class="col">We may use third-party Service Providers to monitor and analyze the use of our Service.</div></div><div class="row mt-10"><div class="col"><ul class="m-0 ml-20 list-square"><li><div class="row"><div class="col"><b>Google Analytics</b></div></div><div class="row mt-5"><div class="col">Google Analytics is a web analytics service offered by Google that tracks and reports website traffic. Google uses the data collected to track and monitor the use of our Service. This data is shared with other Google services. Google may use the collected data to contextualize and personalize the ads of its own advertising network.</div></div><div class="row mt-10"><div class="col">You can opt-out of having made your activity on the Service available to Google Analytics by installing the Google Analytics opt-out browser add-on. The add-on prevents the Google Analytics JavaScript (ga.js, analytics.js, and dc.js) from sharing information with Google Analytics about visits activity.</div></div><div class="row mt-10"><div class="col">For more information on the privacy practices of Google, please visit the Google Privacy Terms web page: <a href="https://www.google.com/intl/en/policies/privacy/">https://www.google.com/intl/en/policies/privacy/</a></div></div></li></ul></div></div></li><li class="mt-5"><div class="row"><div class="col"><b>Links to Other Sites</b></div></div><div class="row mt-5"><div class="col">Our Service may contain links to other sites that are not operated by us. If you click on a third-party link, you will be directed to that third-party's site. We strongly advise you to review the Privacy Policy of every site you visit.</div></div><div class="row mt-10"><div class="col">We have no control over and assume no responsibility for the content, privacy policies or practices of any third-party sites or services.</div></div></li></ul></div></div><div class="row mt-20"><div class="col"><div class="row"><div class="col"><h5>Children's Privacy</h5></div></div><div class="row mt-5"><div class="col">Our Service does not address anyone under the age of 18 (“Children”).</div></div><div class="row mt-10"><div class="col">We do not knowingly collect personally identifiable information from anyone under the age of 18. If you are a parent or guardian and you are aware that your Children have provided us with Personal Data, please contact us. If we become aware that we have collected Personal Data from children without verification of parental consent, we take steps to remove that information from our servers.</div></div></div></div><div class="row mt-40"><div class="col"><h4 class="underline">Changes to This Privacy Policy:</h4></div><div class="col"><div class="row justify-content-end"><div class="col all-width-fit-content"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGgUlEQVR4nO2ba6hVRRTHf9dn5k1NetnTUrOyUFLJJMs0lOhhaSUVKBT2oVIkKisfhUVF+cVXWBfT/NAHKTSQNB/RQ0upTKOofJVlYWX28FV688SC/8Bqc8+9e/bZ99yj+YOBw+xZs2f2nr3WmrXmwDGO0RS0AaYBv6hMU93/gs7AeqCQKOt17ahmOLBbE94E9FXZpDq7djNHIScDC9zbXgR0cNft92J3fT5wEkcBrYFxwC5NbD9wP1DlJt5ev6vUdr/amm4YC7TiCKQdMB741r3Vt4Auum6TegY4CPyt32GiXYEVTu4bPRjrs6JpBVyr5funm8AG4HrXrodTgodUghK0a4Ebgc9cP38A84ChlbAq2gDdNMjJwDJgX0KrrwRuAJo5manAAV3fAlyuskV1dm0i0FIyJnsT8Hai773AUmCSxtC1scxoL2AmsBz4SAP9vQ4TZuWw3vYkPRzPMC3l0G4OUO2u2+8Xda2gN2+ryXM+MAXYWOT+BY1ti8ZqY54B9Mw6+Svc20qWv4Ct+q6fA0YCpybkW6r+Ayf3CdCvnnteDWx27d8FrnOrKHAacDvwvCa6TWOqa6w2h/5ZHsAydVADDJG9tqXWsQG5i7UKdrhBmBW4F2ie4r7HAQ/ICgT5zUVWVpKOGmNfjblG8va5RPO1hK3DYpgZ6w3cCcxNTDos5TEZv0/T+g/q7fo+X3VtWqgUo6tkbC7RbJCw6QHPs9LYwbYnyw/Ay8Ag8qG5sy6/SbkGPgf+AX7UmExHeHo5SxTNOxIemKjf7iZr5u5T4DW9rUsa6LM7MEGT+FLa3L7Rnaqb2oDSauacqPCZ1rrx2Fg8A1Vvc4nmDQmbBk9+Z33k3qbF2q+qR3sny3t1PPhi2Cdwhu6RdJaGqT+bSzQLJDyK7JglmOXM26/SFcO0GtpK6Z0lZ2m22gRzWaPrgTXA6oj7j1JfNpdoZkrY3NAsnOgcGPPvn0rpzlbrWw4meK36wq2QtIxTe5tLNE9K2Dy9LG8+TH6HLEUsPZ3ztEaWJPYBTFZ7m0s0D0nYojWxzHKTP5PsnO02VLMzPIBpam9zieYe5wjF0Eff7/6Mbz7JpfLyDmd4AMERsrlEM1LCCyPlgra3b74U1tRjJdKyUO1vyzKAoRI2Xzst3Z22D4GOrKwuMvn3I/pYLhmbSzT9JLwuQmaCZMzUVQLrNJ76NmBFOc9FZNKyoojz1FQEBXouGU1ZrUJW3v2sj00pNlDloplCbrUuwBLN95rQKSnbh1DYCTQ9nTQW27uUrIkHRj4AH+1pKq5xQZXM1ES6wyGGYOGrvOmgba9ti9MwXmOx8Ftm7lIn8yOVoAUy82aE+rYwXMxmbnQpN70o0hI8rPYWEMmbOerbTG0atuexGpu5XF7nCEdodw6OkKe98gIFxRzTmvBdERasQXfyPtKxUu2fJj+mRHqlY+uIH2ZmpDqz7W0aemvjckAbo1LpJV/E+rwyMpxneqNkqrWzq1U8Pg0zctwOh6iw9ZmG0zVWizceT04s0iAei4jTrXQPweL0Wd781kRAJA2TMu5iU+0Mt9WRpanPboeHcEAZYH8moD6F97iWvcl+GJEZbu78/8HkSBXwhTq+NULOVsJ0xe6DdZinUyAX6PNqq7T5cJm6kHs8rGXfJoO+soRM7oxxsfeqDFEdn/NvqFjbAZH3qHKJU3PgcqeNXNFStGs3xeeWKzGyR8pqs+oeSZFcKcYtTuf4UHqu3K2bbG3Mm2Q8irM5D9c3jZIJOcNHqRwmuvR7WiWdmcFOs5siu0O5ek856y50SZSrKBNzXdbmoIqnnHVrNRY7YVI22rrwV12h6nLWFXQspuxRqP4uNW2227NPpTHrgr9wKGvUNw9C+mxPIgs0oA47nmddb92zoOM0TcoLGsjPigc0Nl10oCJL2q5RaKEwVfAPzmnEe3V2u8OlDZwPKivtXAT5u0ZaCd3Vd0Fps0oIvf+HancmYKf8/7ywvn5S36tkhSqS1u7Y+14dlS2VIS4e+OaR8M+SFsBLGnBtRCyx2N4jHKZ+pRIOScdsTZ9whxqmR/roQb7g5EuO7jYFo11k5/WUy7e1ornBycl0uqOSGKQTniG8Vd/5wo7K5RWUZ0yeGD9i6eFidVuKmElLZnzlghrJI7pHPJ2Aj90RGu/aXubM3MYSQ+kVTTWwRBPdrwyO/6PUkgpJrdPYUaVwjtCXmkpybcvBCDlNi/NKYR3jGETzL3QUaiWKPsauAAAAAElFTkSuQmCC"></div></div></div></div><div class="row"><div class="col"><div class="row"><div class="col">We may update our Privacy Policy from time to time. We will notify you of any changes by posting the new Privacy Policy on this page.</div></div><div class="row mt-10"><div class="col">We will let you know via email and/or a prominent notice on our Service, prior to the change becoming effective and update the “effective date” at the top of this Privacy Policy.</div></div><div class="row mt-10"><div class="col">You are advised to review this Privacy Policy periodically for any changes. Changes to this Privacy Policy are effective when they are posted on this page.</div></div></div></div></div></div></div></div><div class="row contact-information mt-40"><div class="col"><div class="row"><div class="col"><h4 class="header">Talk to Us About Our Policy</h4></div></div><div class="row mt-20"><div class="col no-hyphens"> If you have any questions about this Privacy Policy, please contact us:<div class="su-spacer" style="height:20px"></div><ul><li>By email: <a href="mailto:info@fletchercsi.com">info@fletchercsi.com</a></li><li class="mt-5">By phone: <a href="tel:802-660-9636">802-660-9636</a></li></ul></div></div></div></div></div></div><div class="row block-seperator border-top-green"></div></div></div><footer class="entry-footer"><p class="entry-meta"></p></footer></div></article> <script defer src="data:text/javascript;base64,CgkJCWpRdWVyeShkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCQpIHsKCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHYgSEVMUEVSIEZVTkNUSU9OUyB2ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCgkvLyBIeWRyYXRlIGR5bmFtaWMgY29weToKCWZ1bmN0aW9uIGh5ZHJhdGVEeW5hbWljQ29weSgpIHsKCQl2YXIgJEZpcnN0Q2FyZWVyVGl0bGVSb3cgPSB1bmRlZmluZWQ7CgoJCWNvbnNvbGUubG9nKAoJCQknd2luZG93LmR5bmFtaWNfY2FyZWVyc19kaWN0aW9uYXJ5JywKCQkJd2luZG93LmR5bmFtaWNfY2FyZWVyc19kaWN0aW9uYXJ5CgkJKTsKCgkJdmFyIGNhcmVlcnNBcnJheUZvdW5kID0gZmFsc2U7CgkJaWYgKHdpbmRvdy5keW5hbWljX2NhcmVlcnNfZGljdGlvbmFyeSAhPT0gdW5kZWZpbmVkKSB7CgkJCWNhcmVlcnNBcnJheUZvdW5kID0gdHJ1ZTsKCQl9CgoJCWlmIChjYXJlZXJzQXJyYXlGb3VuZCkgewoJCQl2YXIgY2FyZWVySW5kZXggPSAwOwoJCQkkLmVhY2goCgkJCQl3aW5kb3cuZHluYW1pY19jYXJlZXJzX2RpY3Rpb25hcnksCgkJCQlmdW5jdGlvbiAoY2FyZWVyVGl0bGUsIGNhcmVlckluZm9PYmplY3QpIHsKCQkJCQl2YXIgJE5ld0NhcmVlclRpdGxlUm93ID0gY3JlYXRlQ2FyZWVyVGl0bGVSb3coY2FyZWVyVGl0bGUpOwoJCQkJCWlmIChjYXJlZXJJbmRleCA9PT0gMCkgewoJCQkJCQkkRmlyc3RDYXJlZXJUaXRsZVJvdyA9ICROZXdDYXJlZXJUaXRsZVJvdzsKCQkJCQl9CgoJCQkJCWNhcmVlckluZGV4ICs9IDE7CgkJCQl9CgkJCSk7CgkJfQoKCQkvLyBTdGF0ZXMgZm9yIGluaXRpYWwgc2VsZWN0aW9uIG9mIGJ1dHRvbnM6CgkJc2V0VGltZW91dCgoKSA9PiB7CgkJCWlmICgKCQkJCSRGaXJzdENhcmVlclRpdGxlUm93LmZpbmQoJ2J1dHRvbi5jYXJlZXItdGl0bGUtYnV0dG9uJykubGVuZ3RoICE9PSAwCgkJCSkgewoJCQkJJEZpcnN0Q2FyZWVyVGl0bGVSb3cuZmluZCgnYnV0dG9uLmNhcmVlci10aXRsZS1idXR0b24nKS5jbGljaygpOwoJCQl9CgkJfSwgMSk7Cgl9CgoJLy8gQ3JlYXRlIG5ldyBjYXJlZXIgdGl0bGUgcm93OgoJZnVuY3Rpb24gY3JlYXRlQ2FyZWVyVGl0bGVSb3coY2FyZWVyVGl0bGVTdHJpbmcpIHsKCQl2YXIgJE5ld0NhcmVlclRpdGxlUm93ID0gJENhcmVlclRpdGxlUm93VGVtcGxhdGUKCQkJLmNsb25lKCkKCQkJLnJlbW92ZUNsYXNzKCd0ZW1wbGF0ZScpOwoKCQkkTmV3Q2FyZWVyVGl0bGVSb3cKCQkJLmZpbmQoJ2J1dHRvbi5jYXJlZXItdGl0bGUtYnV0dG9uJykKCQkJLmF0dHIoJ2RhdGEtdGl0bGUnLCBjYXJlZXJUaXRsZVN0cmluZyk7CgkJJE5ld0NhcmVlclRpdGxlUm93LmZpbmQoJy5jb2wubGluaycpLnRleHQoY2FyZWVyVGl0bGVTdHJpbmcpOwoKCQkkQ2FyZWVyc0NvbC5hcHBlbmQoJE5ld0NhcmVlclRpdGxlUm93KTsKCgkJcmV0dXJuICROZXdDYXJlZXJUaXRsZVJvdzsKCX0KCgkvLyBDcmVhdGUgbmV3IGNhcm91c2VsIGl0ZW0gY29sOgoJZnVuY3Rpb24gY3JlYXRlQ2FyZWVyRGV0YWlsQ2Fyb3VzZWxMaXN0SXRlbShjYXJlZXJJbmZvT2JqZWN0KSB7CgkJdmFyICRuZXdDYXJlZXJEZXRhaWxMaSA9ICRDYXJlZXJEZXRhaWxMaVRlbXBsYXRlCgkJCS5jbG9uZSgpCgkJCS5yZW1vdmVDbGFzcygndGVtcGxhdGUnKTsKCgkJJC5lYWNoKAoJCQljYXJlZXJJbmZvT2JqZWN0LmRlc2NyaXB0aW9uX3BhcmFncmFwaHMsCgkJCWZ1bmN0aW9uIChwYXJhZ3JhcGhJbmRleCwgcGFyYWdyYXBoU3RyaW5nKSB7CgkJCQkkRGVzY3JpcHRpb25QYXJhZ3JhcGhSb3dUZW1wbGF0ZSA9ICRuZXdDYXJlZXJEZXRhaWxMaS5maW5kKAoJCQkJCScucm93LmRlc2NyaXB0aW9uLXBhcmFncmFwaC50ZW1wbGF0ZScKCQkJCSk7CgoJCQkJJE5ld0Rlc2NyaXB0aW9uUGFyYWdyYXBoUm93ID0gJERlc2NyaXB0aW9uUGFyYWdyYXBoUm93VGVtcGxhdGUKCQkJCQkuY2xvbmUoKQoJCQkJCS5yZW1vdmVDbGFzcygndGVtcGxhdGUnKTsKCgkJCQkkTmV3RGVzY3JpcHRpb25QYXJhZ3JhcGhSb3cuaHRtbChwYXJhZ3JhcGhTdHJpbmcpOwoKCQkJCSRuZXdDYXJlZXJEZXRhaWxMaQoJCQkJCS5maW5kKCcuY29sLmRldGFpbC1jb250YWluZXIgLnJvdy5kZXNjcmlwdGlvbi1wYXJhZ3JhcGhzJykKCQkJCQkuYXBwZW5kKCROZXdEZXNjcmlwdGlvblBhcmFncmFwaFJvdyk7CgkJCX0KCQkpOwoKCQkkQ2FyZWVyc0Nhcm91c2VsLmZpbmQoJ3VsLnNwbGlkZV9fbGlzdCcpLmFwcGVuZCgkbmV3Q2FyZWVyRGV0YWlsTGkpOwoKCQlyZXR1cm4gJG5ld0NhcmVlckRldGFpbExpOwoJfQoKCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIF4gSEVMUEVSIEZVTkNUSU9OUyBeICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCgkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2IElOSVRJQUxJWkUgdiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoJLy8gVmFyaWFibGVzOgoJLy8gVmFyaWFibGVzID4+PiBET006Cgljb25zdCAkQ2FyZWVyc0NvbCA9ICQoZG9jdW1lbnQpLmZpbmQoJyNjYXJlZXJzLWNvbCcpOwoJY29uc3QgJENhcmVlclRpdGxlUm93VGVtcGxhdGUgPSAkKGRvY3VtZW50KS5maW5kKAoJCScucm93LmNhcmVlci10aXRsZS1yb3cudGVtcGxhdGUnCgkpOwoJY29uc3QgJENhcmVlcnNDYXJvdXNlbCA9ICQoZG9jdW1lbnQpLmZpbmQoJyNjYXJlZXJzLWNhcm91c2VsJyk7Cgljb25zdCAkQ2FyZWVyRGV0YWlsTGlUZW1wbGF0ZSA9ICRDYXJlZXJzQ2Fyb3VzZWwuc2libGluZ3MoJ2xpLnRlbXBsYXRlJyk7CgoJY29uc3QgJEV4cGFuZFByaXZhY3lQb2xpY3lCdXR0b24gPSAkKCdidXR0b24jZXhwYW5kLXByaXZhY3ktcG9saWN5Jyk7Cgljb25zdCAkRXhwYW5kUHJpdmFjeVBvbGljeUJ1dHRvblRvZ2dsZUxhbmd1YWdlU3BhbnMgPQoJCSRFeHBhbmRQcml2YWN5UG9saWN5QnV0dG9uLmZpbmQoJy50b2dnbGUtbGFuZ3VhZ2UgPiBzcGFuJyk7Cgljb25zdCAkRXhwYW5kUHJpdmFjeVBvbGljeUJ1dHRvbkNhcmV0SWNvbnMgPQoJCSRFeHBhbmRQcml2YWN5UG9saWN5QnV0dG9uLmZpbmQoJy5jYXJldC1pY29ucyA+IGknKTsKCWNvbnN0ICRFbnRpcmVQb2xpY3lSb3cgPSAkKCcucm93I2VudGlyZS1wb2xpY3knKTsKCWNvbnNvbGUubG9nKCckRW50aXJlUG9saWN5Um93JywgJEVudGlyZVBvbGljeVJvdyk7CgoJLy8gVmFyaWFibGVzID4+PiBDdXN0b206Cgl3aW5kb3cuYWN0aXZlQ29yZVNlcnZpY2VUaXRsZSA9ICcnOwoKCS8vIEN1c3RvbToKCS8vIFN0YXRlczoKCS8vIEh5ZHJhdGUgZHluYW1pYyBjb3B5OgoJaHlkcmF0ZUR5bmFtaWNDb3B5KCk7CgkvLyBQbHVnaW5zOgoJLy8KCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIF4gSU5JVElBTElaRSBeICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCgkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHYgRVZFTlRTIHYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoJLy8gSGFuZGxlIGEgQ0xJQ0sgb24gb25lIG9mIHRoZSBidXR0b24uY2FyZWVyLXRpdGxlLWJ1dHRvbiBlbGVtZW50czoKCSQoZG9jdW1lbnQpLmRlbGVnYXRlKCdidXR0b24uY2FyZWVyLXRpdGxlLWJ1dHRvbicsICdjbGljaycsIGZ1bmN0aW9uIChldmVudCkgewoJCS8vIFJlc2V0IFNwbGlkZQoJCWlmICh3aW5kb3cuY2FyZWVyc0Nhcm91c2VsU3BsaWRlICE9PSB1bmRlZmluZWQpIHsKCQkJd2luZG93LmNhcmVlcnNDYXJvdXNlbFNwbGlkZS5kZXN0cm95KHRydWUpOwoJCQkkQ2FyZWVyc0Nhcm91c2VsLmZpbmQoJ2xpLnNwbGlkZV9fc2xpZGUnKS5yZW1vdmUoKTsKCQl9CgoJCS8vIFJlbW92ZSBhY3RpdmUgY2xhc3MgZnJvbSBzaWJsaW5nIENvcmUgU2VydmljZSBidXR0b25zOgoJCSQoZG9jdW1lbnQpLmZpbmQoJ2J1dHRvbi5jYXJlZXItdGl0bGUtYnV0dG9uJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwoKCQkvLyBBZGQgYWN0aXZlIGNsYXNzIHRvIHRoaXMgY2xpY2tlZCBDb3JlIFNlcnZpY2UgYnV0dG9uOgoJCSQodGhpcykuYWRkQ2xhc3MoJ2FjdGl2ZScpOwoKCQl2YXIgY2xpY2tlZENhcmVlclRpdGxlID0gJCh0aGlzKS5kYXRhKCd0aXRsZScpOwoJCXdpbmRvdy5hY3RpdmVDb3JlU2VydmljZVRpdGxlID0gY2xpY2tlZENhcmVlclRpdGxlOwoKCQlsZXQgY2xpY2tlZENhcmVlckluZm9PYmplY3QgPQoJCQl3aW5kb3cuZHluYW1pY19jYXJlZXJzX2RpY3Rpb25hcnlbY2xpY2tlZENhcmVlclRpdGxlXTsKCgkJLy8gbGV0IGRlc2NyaXB0aW9uUGFyYWdyYXBoQ291bnQgPQoJCS8vIAljbGlja2VkQ2FyZWVySW5mb09iamVjdC5kZXNjcmlwdGlvbl9wYXJhZ3JhcGhzLmxlbmd0aDsKCgkJY3JlYXRlQ2FyZWVyRGV0YWlsQ2Fyb3VzZWxMaXN0SXRlbShjbGlja2VkQ2FyZWVySW5mb09iamVjdCk7CgoJCS8vIEluaXRpYWxpemUgYW5kIGh5ZHJhdGUgU3BsaWRlIHZhcnMgdy8gZGVmYXVsdCB2YWx1ZXM6CgkJLy8gdmFyIG1pbl9zbGlkZV9waXhlbF93aWR0aCA9IDI1NjsKCQl2YXIgc3BsaWRlX3Blcl9wYWdlID0gMTsKCQl2YXIgc3BsaWRlX3Blcl9tb3ZlID0gMTsKCQl2YXIgc3BsaWRlX2F1dG9wbGF5ID0gZmFsc2U7CgkJdmFyIHNwbGlkZV9hcnJvd3MgPSBmYWxzZTsKCQl2YXIgc3BsaWRlX2RyYWcgPSBmYWxzZTsKCgkJd2luZG93LmNhcmVlcnNDYXJvdXNlbFNwbGlkZSA9IG5ldyBTcGxpZGUoJyNjYXJlZXJzLWNhcm91c2VsLnNwbGlkZScsIHsKCQkJdHlwZTogJ2xvb3AnLAoJCQlwZXJQYWdlOiBzcGxpZGVfcGVyX3BhZ2UsCgkJCXBlck1vdmU6IHNwbGlkZV9wZXJfbW92ZSwKCQkJc3BlZWQ6IDEzMDAsCgkJCXBhZ2luYXRpb246IGZhbHNlLAoJCQlhdXRvcGxheTogc3BsaWRlX2F1dG9wbGF5LAoJCQlpbnRlcnZhbDogNDAwMCwKCQkJcGF1c2VPbkhvdmVyOiB0cnVlLAoJCQlwYXVzZU9uRm9jdXM6IHRydWUsCgkJCWFycm93czogc3BsaWRlX2Fycm93cywKCQkJZHJhZzogc3BsaWRlX2RyYWcsCgkJfSkubW91bnQoKTsKCX0pOwoKCS8vIEhhbmRsZSBhIENMSUNLIG9uIHRoZSAkRXhwYW5kUHJpdmFjeVBvbGljeUJ1dHRvbjoKCSRFeHBhbmRQcml2YWN5UG9saWN5QnV0dG9uLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKCQkkRXhwYW5kUHJpdmFjeVBvbGljeUJ1dHRvbkNhcmV0SWNvbnMudG9nZ2xlQ2xhc3MoJ2Qtbm9uZScpOwoJCSRFeHBhbmRQcml2YWN5UG9saWN5QnV0dG9uVG9nZ2xlTGFuZ3VhZ2VTcGFucy50b2dnbGVDbGFzcygnZC1ub25lJyk7CgkJJEVudGlyZVBvbGljeVJvdy50b2dnbGVDbGFzcygnZC1ub25lJyk7Cgl9KTsKCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogXiBFVkVOVFMgXiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCn0pOwoJCQ=="></script> </main> <script defer src="data:text/javascript;base64,CgkJCQkJCS8qIQ0KICAqIEJvb3RzdHJhcCB2NC4xLjMgKGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS8pDQogICogQ29weXJpZ2h0IDIwMTEtMjAxOCBUaGUgQm9vdHN0cmFwIEF1dGhvcnMgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ncmFwaHMvY29udHJpYnV0b3JzKQ0KICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpDQogICovDQohZnVuY3Rpb24odCxlKXsib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlP2UoZXhwb3J0cyxyZXF1aXJlKCJqcXVlcnkiKSxyZXF1aXJlKCJwb3BwZXIuanMiKSk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJleHBvcnRzIiwianF1ZXJ5IiwicG9wcGVyLmpzIl0sZSk6ZSh0LmJvb3RzdHJhcD17fSx0LmpRdWVyeSx0LlBvcHBlcil9KHRoaXMsZnVuY3Rpb24odCxlLGgpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpPWVbbl07aS5lbnVtZXJhYmxlPWkuZW51bWVyYWJsZXx8ITEsaS5jb25maWd1cmFibGU9ITAsInZhbHVlImluIGkmJihpLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxpLmtleSxpKX19ZnVuY3Rpb24gcyh0LGUsbil7cmV0dXJuIGUmJmkodC5wcm90b3R5cGUsZSksbiYmaSh0LG4pLHR9ZnVuY3Rpb24gbChyKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbz1udWxsIT1hcmd1bWVudHNbdF0/YXJndW1lbnRzW3RdOnt9LGU9T2JqZWN0LmtleXMobyk7ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMmJihlPWUuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMobykuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG8sdCkuZW51bWVyYWJsZX0pKSksZS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlLG4saTtlPXIsaT1vW249dF0sbiBpbiBlP09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4se3ZhbHVlOmksZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTplW25dPWl9KX1yZXR1cm4gcn1lPWUmJmUuaGFzT3duUHJvcGVydHkoImRlZmF1bHQiKT9lLmRlZmF1bHQ6ZSxoPWgmJmguaGFzT3duUHJvcGVydHkoImRlZmF1bHQiKT9oLmRlZmF1bHQ6aDt2YXIgcixuLG8sYSxjLHUsZixkLGcsXyxtLHAsdix5LEUsQyxULGIsUyxJLEEsRCx3LE4sTyxrLFAsaixILEwsUix4LFcsVSxxLEYsSyxNLFEsQixWLFkseixKLFosRywkLFgsdHQsZXQsbnQsaXQscnQsb3Qsc3QsYXQsbHQsY3QsaHQsdXQsZnQsZHQsZ3QsX3QsbXQscHQsdnQseXQsRXQsQ3QsVHQsYnQsU3QsSXQsQXQsRHQsd3QsTnQsT3Qsa3QsUHQsanQsSHQsTHQsUnQseHQsV3QsVXQscXQsRnQsS3QsTXQsUXQsQnQsVnQsWXQsenQsSnQsWnQsR3QsJHQsWHQsdGUsZWUsbmUsaWUscmUsb2Usc2UsYWUsbGUsY2UsaGUsdWUsZmUsZGUsZ2UsX2UsbWUscGUsdmUseWUsRWUsQ2UsVGUsYmUsU2UsSWUsQWUsRGUsd2UsTmUsT2Usa2UsUGUsamUsSGUsTGUsUmUseGUsV2UsVWUscWUsRmUsS2UsTWUsUWUsQmUsVmUsWWUsemUsSmUsWmUsR2UsJGUsWGUsdG4sZW4sbm4scm4sb24sc24sYW4sbG4sY24saG4sdW4sZm4sZG4sZ24sX24sbW4scG4sdm4seW4sRW4sQ24sVG4sYm4sU24sSW4sQW4sRG4sd24sTm4sT24sa24sUG4sam4sSG4sTG4sUm4seG4sV24sVW4scW4sRm49ZnVuY3Rpb24oaSl7dmFyIGU9InRyYW5zaXRpb25lbmQiO2Z1bmN0aW9uIHQodCl7dmFyIGU9dGhpcyxuPSExO3JldHVybiBpKHRoaXMpLm9uZShsLlRSQU5TSVRJT05fRU5ELGZ1bmN0aW9uKCl7bj0hMH0pLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtufHxsLnRyaWdnZXJUcmFuc2l0aW9uRW5kKGUpfSx0KSx0aGlzfXZhciBsPXtUUkFOU0lUSU9OX0VORDoiYnNUcmFuc2l0aW9uRW5kIixnZXRVSUQ6ZnVuY3Rpb24odCl7Zm9yKDt0Kz1+figxZTYqTWF0aC5yYW5kb20oKSksZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodCk7KTtyZXR1cm4gdH0sZ2V0U2VsZWN0b3JGcm9tRWxlbWVudDpmdW5jdGlvbih0KXt2YXIgZT10LmdldEF0dHJpYnV0ZSgiZGF0YS10YXJnZXQiKTtlJiYiIyIhPT1lfHwoZT10LmdldEF0dHJpYnV0ZSgiaHJlZiIpfHwiIik7dHJ5e3JldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGUpP2U6bnVsbH1jYXRjaCh0KXtyZXR1cm4gbnVsbH19LGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50OmZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiAwO3ZhciBlPWkodCkuY3NzKCJ0cmFuc2l0aW9uLWR1cmF0aW9uIik7cmV0dXJuIHBhcnNlRmxvYXQoZSk/KGU9ZS5zcGxpdCgiLCIpWzBdLDFlMypwYXJzZUZsb2F0KGUpKTowfSxyZWZsb3c6ZnVuY3Rpb24odCl7cmV0dXJuIHQub2Zmc2V0SGVpZ2h0fSx0cmlnZ2VyVHJhbnNpdGlvbkVuZDpmdW5jdGlvbih0KXtpKHQpLnRyaWdnZXIoZSl9LHN1cHBvcnRzVHJhbnNpdGlvbkVuZDpmdW5jdGlvbigpe3JldHVybiBCb29sZWFuKGUpfSxpc0VsZW1lbnQ6ZnVuY3Rpb24odCl7cmV0dXJuKHRbMF18fHQpLm5vZGVUeXBlfSx0eXBlQ2hlY2tDb25maWc6ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaSBpbiBuKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLGkpKXt2YXIgcj1uW2ldLG89ZVtpXSxzPW8mJmwuaXNFbGVtZW50KG8pPyJlbGVtZW50IjooYT1vLHt9LnRvU3RyaW5nLmNhbGwoYSkubWF0Y2goL1xzKFthLXpdKykvaSlbMV0udG9Mb3dlckNhc2UoKSk7aWYoIW5ldyBSZWdFeHAocikudGVzdChzKSl0aHJvdyBuZXcgRXJyb3IodC50b1VwcGVyQ2FzZSgpKyc6IE9wdGlvbiAiJytpKyciIHByb3ZpZGVkIHR5cGUgIicrcysnIiBidXQgZXhwZWN0ZWQgdHlwZSAiJytyKyciLicpfXZhciBhfX07cmV0dXJuIGkuZm4uZW11bGF0ZVRyYW5zaXRpb25FbmQ9dCxpLmV2ZW50LnNwZWNpYWxbbC5UUkFOU0lUSU9OX0VORF09e2JpbmRUeXBlOmUsZGVsZWdhdGVUeXBlOmUsaGFuZGxlOmZ1bmN0aW9uKHQpe2lmKGkodC50YXJnZXQpLmlzKHRoaXMpKXJldHVybiB0LmhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19LGx9KGUpLEtuPShuPSJhbGVydCIsYT0iLiIrKG89ImJzLmFsZXJ0IiksYz0ocj1lKS5mbltuXSx1PXtDTE9TRToiY2xvc2UiK2EsQ0xPU0VEOiJjbG9zZWQiK2EsQ0xJQ0tfREFUQV9BUEk6ImNsaWNrIithKyIuZGF0YS1hcGkifSxmPSJhbGVydCIsZD0iZmFkZSIsZz0ic2hvdyIsXz1mdW5jdGlvbigpe2Z1bmN0aW9uIGkodCl7dGhpcy5fZWxlbWVudD10fXZhciB0PWkucHJvdG90eXBlO3JldHVybiB0LmNsb3NlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2VsZW1lbnQ7dCYmKGU9dGhpcy5fZ2V0Um9vdEVsZW1lbnQodCkpLHRoaXMuX3RyaWdnZXJDbG9zZUV2ZW50KGUpLmlzRGVmYXVsdFByZXZlbnRlZCgpfHx0aGlzLl9yZW1vdmVFbGVtZW50KGUpfSx0LmRpc3Bvc2U9ZnVuY3Rpb24oKXtyLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCxvKSx0aGlzLl9lbGVtZW50PW51bGx9LHQuX2dldFJvb3RFbGVtZW50PWZ1bmN0aW9uKHQpe3ZhciBlPUZuLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQodCksbj0hMTtyZXR1cm4gZSYmKG49ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlKSksbnx8KG49cih0KS5jbG9zZXN0KCIuIitmKVswXSksbn0sdC5fdHJpZ2dlckNsb3NlRXZlbnQ9ZnVuY3Rpb24odCl7dmFyIGU9ci5FdmVudCh1LkNMT1NFKTtyZXR1cm4gcih0KS50cmlnZ2VyKGUpLGV9LHQuX3JlbW92ZUVsZW1lbnQ9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcztpZihyKGUpLnJlbW92ZUNsYXNzKGcpLHIoZSkuaGFzQ2xhc3MoZCkpe3ZhciB0PUZuLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KGUpO3IoZSkub25lKEZuLlRSQU5TSVRJT05fRU5ELGZ1bmN0aW9uKHQpe3JldHVybiBuLl9kZXN0cm95RWxlbWVudChlLHQpfSkuZW11bGF0ZVRyYW5zaXRpb25FbmQodCl9ZWxzZSB0aGlzLl9kZXN0cm95RWxlbWVudChlKX0sdC5fZGVzdHJveUVsZW1lbnQ9ZnVuY3Rpb24odCl7cih0KS5kZXRhY2goKS50cmlnZ2VyKHUuQ0xPU0VEKS5yZW1vdmUoKX0saS5falF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1yKHRoaXMpLGU9dC5kYXRhKG8pO2V8fChlPW5ldyBpKHRoaXMpLHQuZGF0YShvLGUpKSwiY2xvc2UiPT09biYmZVtuXSh0aGlzKX0pfSxpLl9oYW5kbGVEaXNtaXNzPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXt0JiZ0LnByZXZlbnREZWZhdWx0KCksZS5jbG9zZSh0aGlzKX19LHMoaSxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNC4xLjMifX1dKSxpfSgpLHIoZG9jdW1lbnQpLm9uKHUuQ0xJQ0tfREFUQV9BUEksJ1tkYXRhLWRpc21pc3M9ImFsZXJ0Il0nLF8uX2hhbmRsZURpc21pc3MobmV3IF8pKSxyLmZuW25dPV8uX2pRdWVyeUludGVyZmFjZSxyLmZuW25dLkNvbnN0cnVjdG9yPV8sci5mbltuXS5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHIuZm5bbl09YyxfLl9qUXVlcnlJbnRlcmZhY2V9LF8pLE1uPShwPSJidXR0b24iLHk9Ii4iKyh2PSJicy5idXR0b24iKSxFPSIuZGF0YS1hcGkiLEM9KG09ZSkuZm5bcF0sVD0iYWN0aXZlIixiPSJidG4iLEk9J1tkYXRhLXRvZ2dsZV49ImJ1dHRvbiJdJyxBPSdbZGF0YS10b2dnbGU9ImJ1dHRvbnMiXScsRD0iaW5wdXQiLHc9Ii5hY3RpdmUiLE49Ii5idG4iLE89e0NMSUNLX0RBVEFfQVBJOiJjbGljayIreStFLEZPQ1VTX0JMVVJfREFUQV9BUEk6KFM9ImZvY3VzIikreStFKyIgYmx1ciIreStFfSxrPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih0KXt0aGlzLl9lbGVtZW50PXR9dmFyIHQ9bi5wcm90b3R5cGU7cmV0dXJuIHQudG9nZ2xlPWZ1bmN0aW9uKCl7dmFyIHQ9ITAsZT0hMCxuPW0odGhpcy5fZWxlbWVudCkuY2xvc2VzdChBKVswXTtpZihuKXt2YXIgaT10aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoRCk7aWYoaSl7aWYoInJhZGlvIj09PWkudHlwZSlpZihpLmNoZWNrZWQmJnRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFQpKXQ9ITE7ZWxzZXt2YXIgcj1uLnF1ZXJ5U2VsZWN0b3Iodyk7ciYmbShyKS5yZW1vdmVDbGFzcyhUKX1pZih0KXtpZihpLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKXx8bi5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIil8fGkuY2xhc3NMaXN0LmNvbnRhaW5zKCJkaXNhYmxlZCIpfHxuLmNsYXNzTGlzdC5jb250YWlucygiZGlzYWJsZWQiKSlyZXR1cm47aS5jaGVja2VkPSF0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhUKSxtKGkpLnRyaWdnZXIoImNoYW5nZSIpfWkuZm9jdXMoKSxlPSExfX1lJiZ0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgiYXJpYS1wcmVzc2VkIiwhdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoVCkpLHQmJm0odGhpcy5fZWxlbWVudCkudG9nZ2xlQ2xhc3MoVCl9LHQuZGlzcG9zZT1mdW5jdGlvbigpe20ucmVtb3ZlRGF0YSh0aGlzLl9lbGVtZW50LHYpLHRoaXMuX2VsZW1lbnQ9bnVsbH0sbi5falF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1tKHRoaXMpLmRhdGEodik7dHx8KHQ9bmV3IG4odGhpcyksbSh0aGlzKS5kYXRhKHYsdCkpLCJ0b2dnbGUiPT09ZSYmdFtlXSgpfSl9LHMobixudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNC4xLjMifX1dKSxufSgpLG0oZG9jdW1lbnQpLm9uKE8uQ0xJQ0tfREFUQV9BUEksSSxmdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCk7dmFyIGU9dC50YXJnZXQ7bShlKS5oYXNDbGFzcyhiKXx8KGU9bShlKS5jbG9zZXN0KE4pKSxrLl9qUXVlcnlJbnRlcmZhY2UuY2FsbChtKGUpLCJ0b2dnbGUiKX0pLm9uKE8uRk9DVVNfQkxVUl9EQVRBX0FQSSxJLGZ1bmN0aW9uKHQpe3ZhciBlPW0odC50YXJnZXQpLmNsb3Nlc3QoTilbMF07bShlKS50b2dnbGVDbGFzcyhTLC9eZm9jdXMoaW4pPyQvLnRlc3QodC50eXBlKSl9KSxtLmZuW3BdPWsuX2pRdWVyeUludGVyZmFjZSxtLmZuW3BdLkNvbnN0cnVjdG9yPWssbS5mbltwXS5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIG0uZm5bcF09QyxrLl9qUXVlcnlJbnRlcmZhY2V9LGspLFFuPShqPSJjYXJvdXNlbCIsTD0iLiIrKEg9ImJzLmNhcm91c2VsIiksUj0iLmRhdGEtYXBpIix4PShQPWUpLmZuW2pdLFc9e2ludGVydmFsOjVlMyxrZXlib2FyZDohMCxzbGlkZTohMSxwYXVzZToiaG92ZXIiLHdyYXA6ITB9LFU9e2ludGVydmFsOiIobnVtYmVyfGJvb2xlYW4pIixrZXlib2FyZDoiYm9vbGVhbiIsc2xpZGU6Iihib29sZWFufHN0cmluZykiLHBhdXNlOiIoc3RyaW5nfGJvb2xlYW4pIix3cmFwOiJib29sZWFuIn0scT0ibmV4dCIsRj0icHJldiIsSz0ibGVmdCIsTT0icmlnaHQiLFE9e1NMSURFOiJzbGlkZSIrTCxTTElEOiJzbGlkIitMLEtFWURPV046ImtleWRvd24iK0wsTU9VU0VFTlRFUjoibW91c2VlbnRlciIrTCxNT1VTRUxFQVZFOiJtb3VzZWxlYXZlIitMLFRPVUNIRU5EOiJ0b3VjaGVuZCIrTCxMT0FEX0RBVEFfQVBJOiJsb2FkIitMK1IsQ0xJQ0tfREFUQV9BUEk6ImNsaWNrIitMK1J9LEI9ImNhcm91c2VsIixWPSJhY3RpdmUiLFk9InNsaWRlIix6PSJjYXJvdXNlbC1pdGVtLXJpZ2h0IixKPSJjYXJvdXNlbC1pdGVtLWxlZnQiLFo9ImNhcm91c2VsLWl0ZW0tbmV4dCIsRz0iY2Fyb3VzZWwtaXRlbS1wcmV2IiwkPSIuYWN0aXZlIixYPSIuYWN0aXZlLmNhcm91c2VsLWl0ZW0iLHR0PSIuY2Fyb3VzZWwtaXRlbSIsZXQ9Ii5jYXJvdXNlbC1pdGVtLW5leHQsIC5jYXJvdXNlbC1pdGVtLXByZXYiLG50PSIuY2Fyb3VzZWwtaW5kaWNhdG9ycyIsaXQ9IltkYXRhLXNsaWRlXSwgW2RhdGEtc2xpZGUtdG9dIixydD0nW2RhdGEtcmlkZT0iY2Fyb3VzZWwiXScsb3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBvKHQsZSl7dGhpcy5faXRlbXM9bnVsbCx0aGlzLl9pbnRlcnZhbD1udWxsLHRoaXMuX2FjdGl2ZUVsZW1lbnQ9bnVsbCx0aGlzLl9pc1BhdXNlZD0hMSx0aGlzLl9pc1NsaWRpbmc9ITEsdGhpcy50b3VjaFRpbWVvdXQ9bnVsbCx0aGlzLl9jb25maWc9dGhpcy5fZ2V0Q29uZmlnKGUpLHRoaXMuX2VsZW1lbnQ9UCh0KVswXSx0aGlzLl9pbmRpY2F0b3JzRWxlbWVudD10aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IobnQpLHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKCl9dmFyIHQ9by5wcm90b3R5cGU7cmV0dXJuIHQubmV4dD1mdW5jdGlvbigpe3RoaXMuX2lzU2xpZGluZ3x8dGhpcy5fc2xpZGUocSl9LHQubmV4dFdoZW5WaXNpYmxlPWZ1bmN0aW9uKCl7IWRvY3VtZW50LmhpZGRlbiYmUCh0aGlzLl9lbGVtZW50KS5pcygiOnZpc2libGUiKSYmImhpZGRlbiIhPT1QKHRoaXMuX2VsZW1lbnQpLmNzcygidmlzaWJpbGl0eSIpJiZ0aGlzLm5leHQoKX0sdC5wcmV2PWZ1bmN0aW9uKCl7dGhpcy5faXNTbGlkaW5nfHx0aGlzLl9zbGlkZShGKX0sdC5wYXVzZT1mdW5jdGlvbih0KXt0fHwodGhpcy5faXNQYXVzZWQ9ITApLHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihldCkmJihGbi50cmlnZ2VyVHJhbnNpdGlvbkVuZCh0aGlzLl9lbGVtZW50KSx0aGlzLmN5Y2xlKCEwKSksY2xlYXJJbnRlcnZhbCh0aGlzLl9pbnRlcnZhbCksdGhpcy5faW50ZXJ2YWw9bnVsbH0sdC5jeWNsZT1mdW5jdGlvbih0KXt0fHwodGhpcy5faXNQYXVzZWQ9ITEpLHRoaXMuX2ludGVydmFsJiYoY2xlYXJJbnRlcnZhbCh0aGlzLl9pbnRlcnZhbCksdGhpcy5faW50ZXJ2YWw9bnVsbCksdGhpcy5fY29uZmlnLmludGVydmFsJiYhdGhpcy5faXNQYXVzZWQmJih0aGlzLl9pbnRlcnZhbD1zZXRJbnRlcnZhbCgoZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlP3RoaXMubmV4dFdoZW5WaXNpYmxlOnRoaXMubmV4dCkuYmluZCh0aGlzKSx0aGlzLl9jb25maWcuaW50ZXJ2YWwpKX0sdC50bz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMuX2FjdGl2ZUVsZW1lbnQ9dGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKFgpO3ZhciBuPXRoaXMuX2dldEl0ZW1JbmRleCh0aGlzLl9hY3RpdmVFbGVtZW50KTtpZighKHQ+dGhpcy5faXRlbXMubGVuZ3RoLTF8fHQ8MCkpaWYodGhpcy5faXNTbGlkaW5nKVAodGhpcy5fZWxlbWVudCkub25lKFEuU0xJRCxmdW5jdGlvbigpe3JldHVybiBlLnRvKHQpfSk7ZWxzZXtpZihuPT09dClyZXR1cm4gdGhpcy5wYXVzZSgpLHZvaWQgdGhpcy5jeWNsZSgpO3ZhciBpPW48dD9xOkY7dGhpcy5fc2xpZGUoaSx0aGlzLl9pdGVtc1t0XSl9fSx0LmRpc3Bvc2U9ZnVuY3Rpb24oKXtQKHRoaXMuX2VsZW1lbnQpLm9mZihMKSxQLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCxIKSx0aGlzLl9pdGVtcz1udWxsLHRoaXMuX2NvbmZpZz1udWxsLHRoaXMuX2VsZW1lbnQ9bnVsbCx0aGlzLl9pbnRlcnZhbD1udWxsLHRoaXMuX2lzUGF1c2VkPW51bGwsdGhpcy5faXNTbGlkaW5nPW51bGwsdGhpcy5fYWN0aXZlRWxlbWVudD1udWxsLHRoaXMuX2luZGljYXRvcnNFbGVtZW50PW51bGx9LHQuX2dldENvbmZpZz1mdW5jdGlvbih0KXtyZXR1cm4gdD1sKHt9LFcsdCksRm4udHlwZUNoZWNrQ29uZmlnKGosdCxVKSx0fSx0Ll9hZGRFdmVudExpc3RlbmVycz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5fY29uZmlnLmtleWJvYXJkJiZQKHRoaXMuX2VsZW1lbnQpLm9uKFEuS0VZRE9XTixmdW5jdGlvbih0KXtyZXR1cm4gZS5fa2V5ZG93bih0KX0pLCJob3ZlciI9PT10aGlzLl9jb25maWcucGF1c2UmJihQKHRoaXMuX2VsZW1lbnQpLm9uKFEuTU9VU0VFTlRFUixmdW5jdGlvbih0KXtyZXR1cm4gZS5wYXVzZSh0KX0pLm9uKFEuTU9VU0VMRUFWRSxmdW5jdGlvbih0KXtyZXR1cm4gZS5jeWNsZSh0KX0pLCJvbnRvdWNoc3RhcnQiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50JiZQKHRoaXMuX2VsZW1lbnQpLm9uKFEuVE9VQ0hFTkQsZnVuY3Rpb24oKXtlLnBhdXNlKCksZS50b3VjaFRpbWVvdXQmJmNsZWFyVGltZW91dChlLnRvdWNoVGltZW91dCksZS50b3VjaFRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbih0KXtyZXR1cm4gZS5jeWNsZSh0KX0sNTAwK2UuX2NvbmZpZy5pbnRlcnZhbCl9KSl9LHQuX2tleWRvd249ZnVuY3Rpb24odCl7aWYoIS9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QodC50YXJnZXQudGFnTmFtZSkpc3dpdGNoKHQud2hpY2gpe2Nhc2UgMzc6dC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMucHJldigpO2JyZWFrO2Nhc2UgMzk6dC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmV4dCgpfX0sdC5fZ2V0SXRlbUluZGV4PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9pdGVtcz10JiZ0LnBhcmVudE5vZGU/W10uc2xpY2UuY2FsbCh0LnBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbCh0dCkpOltdLHRoaXMuX2l0ZW1zLmluZGV4T2YodCl9LHQuX2dldEl0ZW1CeURpcmVjdGlvbj1mdW5jdGlvbih0LGUpe3ZhciBuPXQ9PT1xLGk9dD09PUYscj10aGlzLl9nZXRJdGVtSW5kZXgoZSksbz10aGlzLl9pdGVtcy5sZW5ndGgtMTtpZigoaSYmMD09PXJ8fG4mJnI9PT1vKSYmIXRoaXMuX2NvbmZpZy53cmFwKXJldHVybiBlO3ZhciBzPShyKyh0PT09Rj8tMToxKSkldGhpcy5faXRlbXMubGVuZ3RoO3JldHVybi0xPT09cz90aGlzLl9pdGVtc1t0aGlzLl9pdGVtcy5sZW5ndGgtMV06dGhpcy5faXRlbXNbc119LHQuX3RyaWdnZXJTbGlkZUV2ZW50PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fZ2V0SXRlbUluZGV4KHQpLGk9dGhpcy5fZ2V0SXRlbUluZGV4KHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihYKSkscj1QLkV2ZW50KFEuU0xJREUse3JlbGF0ZWRUYXJnZXQ6dCxkaXJlY3Rpb246ZSxmcm9tOmksdG86bn0pO3JldHVybiBQKHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIocikscn0sdC5fc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudD1mdW5jdGlvbih0KXtpZih0aGlzLl9pbmRpY2F0b3JzRWxlbWVudCl7dmFyIGU9W10uc2xpY2UuY2FsbCh0aGlzLl9pbmRpY2F0b3JzRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCQpKTtQKGUpLnJlbW92ZUNsYXNzKFYpO3ZhciBuPXRoaXMuX2luZGljYXRvcnNFbGVtZW50LmNoaWxkcmVuW3RoaXMuX2dldEl0ZW1JbmRleCh0KV07biYmUChuKS5hZGRDbGFzcyhWKX19LHQuX3NsaWRlPWZ1bmN0aW9uKHQsZSl7dmFyIG4saSxyLG89dGhpcyxzPXRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihYKSxhPXRoaXMuX2dldEl0ZW1JbmRleChzKSxsPWV8fHMmJnRoaXMuX2dldEl0ZW1CeURpcmVjdGlvbih0LHMpLGM9dGhpcy5fZ2V0SXRlbUluZGV4KGwpLGg9Qm9vbGVhbih0aGlzLl9pbnRlcnZhbCk7aWYodD09PXE/KG49SixpPVoscj1LKToobj16LGk9RyxyPU0pLGwmJlAobCkuaGFzQ2xhc3MoVikpdGhpcy5faXNTbGlkaW5nPSExO2Vsc2UgaWYoIXRoaXMuX3RyaWdnZXJTbGlkZUV2ZW50KGwscikuaXNEZWZhdWx0UHJldmVudGVkKCkmJnMmJmwpe3RoaXMuX2lzU2xpZGluZz0hMCxoJiZ0aGlzLnBhdXNlKCksdGhpcy5fc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudChsKTt2YXIgdT1QLkV2ZW50KFEuU0xJRCx7cmVsYXRlZFRhcmdldDpsLGRpcmVjdGlvbjpyLGZyb206YSx0bzpjfSk7aWYoUCh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhZKSl7UChsKS5hZGRDbGFzcyhpKSxGbi5yZWZsb3cobCksUChzKS5hZGRDbGFzcyhuKSxQKGwpLmFkZENsYXNzKG4pO3ZhciBmPUZuLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHMpO1Aocykub25lKEZuLlRSQU5TSVRJT05fRU5ELGZ1bmN0aW9uKCl7UChsKS5yZW1vdmVDbGFzcyhuKyIgIitpKS5hZGRDbGFzcyhWKSxQKHMpLnJlbW92ZUNsYXNzKFYrIiAiK2krIiAiK24pLG8uX2lzU2xpZGluZz0hMSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIFAoby5fZWxlbWVudCkudHJpZ2dlcih1KX0sMCl9KS5lbXVsYXRlVHJhbnNpdGlvbkVuZChmKX1lbHNlIFAocykucmVtb3ZlQ2xhc3MoViksUChsKS5hZGRDbGFzcyhWKSx0aGlzLl9pc1NsaWRpbmc9ITEsUCh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKHUpO2gmJnRoaXMuY3ljbGUoKX19LG8uX2pRdWVyeUludGVyZmFjZT1mdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9UCh0aGlzKS5kYXRhKEgpLGU9bCh7fSxXLFAodGhpcykuZGF0YSgpKTsib2JqZWN0Ij09dHlwZW9mIGkmJihlPWwoe30sZSxpKSk7dmFyIG49InN0cmluZyI9PXR5cGVvZiBpP2k6ZS5zbGlkZTtpZih0fHwodD1uZXcgbyh0aGlzLGUpLFAodGhpcykuZGF0YShILHQpKSwibnVtYmVyIj09dHlwZW9mIGkpdC50byhpKTtlbHNlIGlmKCJzdHJpbmciPT10eXBlb2Ygbil7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiB0W25dKXRocm93IG5ldyBUeXBlRXJyb3IoJ05vIG1ldGhvZCBuYW1lZCAiJytuKyciJyk7dFtuXSgpfWVsc2UgZS5pbnRlcnZhbCYmKHQucGF1c2UoKSx0LmN5Y2xlKCkpfSl9LG8uX2RhdGFBcGlDbGlja0hhbmRsZXI9ZnVuY3Rpb24odCl7dmFyIGU9Rm4uZ2V0U2VsZWN0b3JGcm9tRWxlbWVudCh0aGlzKTtpZihlKXt2YXIgbj1QKGUpWzBdO2lmKG4mJlAobikuaGFzQ2xhc3MoQikpe3ZhciBpPWwoe30sUChuKS5kYXRhKCksUCh0aGlzKS5kYXRhKCkpLHI9dGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGUtdG8iKTtyJiYoaS5pbnRlcnZhbD0hMSksby5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoUChuKSxpKSxyJiZQKG4pLmRhdGEoSCkudG8ociksdC5wcmV2ZW50RGVmYXVsdCgpfX19LHMobyxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNC4xLjMifX0se2tleToiRGVmYXVsdCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFd9fV0pLG99KCksUChkb2N1bWVudCkub24oUS5DTElDS19EQVRBX0FQSSxpdCxvdC5fZGF0YUFwaUNsaWNrSGFuZGxlciksUCh3aW5kb3cpLm9uKFEuTE9BRF9EQVRBX0FQSSxmdW5jdGlvbigpe2Zvcih2YXIgdD1bXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocnQpKSxlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXt2YXIgaT1QKHRbZV0pO290Ll9qUXVlcnlJbnRlcmZhY2UuY2FsbChpLGkuZGF0YSgpKX19KSxQLmZuW2pdPW90Ll9qUXVlcnlJbnRlcmZhY2UsUC5mbltqXS5Db25zdHJ1Y3Rvcj1vdCxQLmZuW2pdLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gUC5mbltqXT14LG90Ll9qUXVlcnlJbnRlcmZhY2V9LG90KSxCbj0oYXQ9ImNvbGxhcHNlIixjdD0iLiIrKGx0PSJicy5jb2xsYXBzZSIpLGh0PShzdD1lKS5mblthdF0sdXQ9e3RvZ2dsZTohMCxwYXJlbnQ6IiJ9LGZ0PXt0b2dnbGU6ImJvb2xlYW4iLHBhcmVudDoiKHN0cmluZ3xlbGVtZW50KSJ9LGR0PXtTSE9XOiJzaG93IitjdCxTSE9XTjoic2hvd24iK2N0LEhJREU6ImhpZGUiK2N0LEhJRERFTjoiaGlkZGVuIitjdCxDTElDS19EQVRBX0FQSToiY2xpY2siK2N0KyIuZGF0YS1hcGkifSxndD0ic2hvdyIsX3Q9ImNvbGxhcHNlIixtdD0iY29sbGFwc2luZyIscHQ9ImNvbGxhcHNlZCIsdnQ9IndpZHRoIix5dD0iaGVpZ2h0IixFdD0iLnNob3csIC5jb2xsYXBzaW5nIixDdD0nW2RhdGEtdG9nZ2xlPSJjb2xsYXBzZSJdJyxUdD1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoZSx0KXt0aGlzLl9pc1RyYW5zaXRpb25pbmc9ITEsdGhpcy5fZWxlbWVudD1lLHRoaXMuX2NvbmZpZz10aGlzLl9nZXRDb25maWcodCksdGhpcy5fdHJpZ2dlckFycmF5PXN0Lm1ha2VBcnJheShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS10b2dnbGU9ImNvbGxhcHNlIl1baHJlZj0iIycrZS5pZCsnIl0sW2RhdGEtdG9nZ2xlPSJjb2xsYXBzZSJdW2RhdGEtdGFyZ2V0PSIjJytlLmlkKyciXScpKTtmb3IodmFyIG49W10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKEN0KSksaT0wLHI9bi5sZW5ndGg7aTxyO2krKyl7dmFyIG89bltpXSxzPUZuLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQobyksYT1bXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocykpLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdD09PWV9KTtudWxsIT09cyYmMDxhLmxlbmd0aCYmKHRoaXMuX3NlbGVjdG9yPXMsdGhpcy5fdHJpZ2dlckFycmF5LnB1c2gobykpfXRoaXMuX3BhcmVudD10aGlzLl9jb25maWcucGFyZW50P3RoaXMuX2dldFBhcmVudCgpOm51bGwsdGhpcy5fY29uZmlnLnBhcmVudHx8dGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRoaXMuX2VsZW1lbnQsdGhpcy5fdHJpZ2dlckFycmF5KSx0aGlzLl9jb25maWcudG9nZ2xlJiZ0aGlzLnRvZ2dsZSgpfXZhciB0PWEucHJvdG90eXBlO3JldHVybiB0LnRvZ2dsZT1mdW5jdGlvbigpe3N0KHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKGd0KT90aGlzLmhpZGUoKTp0aGlzLnNob3coKX0sdC5zaG93PWZ1bmN0aW9uKCl7dmFyIHQsZSxuPXRoaXM7aWYoIXRoaXMuX2lzVHJhbnNpdGlvbmluZyYmIXN0KHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKGd0KSYmKHRoaXMuX3BhcmVudCYmMD09PSh0PVtdLnNsaWNlLmNhbGwodGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoRXQpKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0QXR0cmlidXRlKCJkYXRhLXBhcmVudCIpPT09bi5fY29uZmlnLnBhcmVudH0pKS5sZW5ndGgmJih0PW51bGwpLCEodCYmKGU9c3QodCkubm90KHRoaXMuX3NlbGVjdG9yKS5kYXRhKGx0KSkmJmUuX2lzVHJhbnNpdGlvbmluZykpKXt2YXIgaT1zdC5FdmVudChkdC5TSE9XKTtpZihzdCh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKGkpLCFpLmlzRGVmYXVsdFByZXZlbnRlZCgpKXt0JiYoYS5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoc3QodCkubm90KHRoaXMuX3NlbGVjdG9yKSwiaGlkZSIpLGV8fHN0KHQpLmRhdGEobHQsbnVsbCkpO3ZhciByPXRoaXMuX2dldERpbWVuc2lvbigpO3N0KHRoaXMuX2VsZW1lbnQpLnJlbW92ZUNsYXNzKF90KS5hZGRDbGFzcyhtdCksdGhpcy5fZWxlbWVudC5zdHlsZVtyXT0wLHRoaXMuX3RyaWdnZXJBcnJheS5sZW5ndGgmJnN0KHRoaXMuX3RyaWdnZXJBcnJheSkucmVtb3ZlQ2xhc3MocHQpLmF0dHIoImFyaWEtZXhwYW5kZWQiLCEwKSx0aGlzLnNldFRyYW5zaXRpb25pbmcoITApO3ZhciBvPSJzY3JvbGwiKyhyWzBdLnRvVXBwZXJDYXNlKCkrci5zbGljZSgxKSkscz1Gbi5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTtzdCh0aGlzLl9lbGVtZW50KS5vbmUoRm4uVFJBTlNJVElPTl9FTkQsZnVuY3Rpb24oKXtzdChuLl9lbGVtZW50KS5yZW1vdmVDbGFzcyhtdCkuYWRkQ2xhc3MoX3QpLmFkZENsYXNzKGd0KSxuLl9lbGVtZW50LnN0eWxlW3JdPSIiLG4uc2V0VHJhbnNpdGlvbmluZyghMSksc3Qobi5fZWxlbWVudCkudHJpZ2dlcihkdC5TSE9XTil9KS5lbXVsYXRlVHJhbnNpdGlvbkVuZChzKSx0aGlzLl9lbGVtZW50LnN0eWxlW3JdPXRoaXMuX2VsZW1lbnRbb10rInB4In19fSx0LmhpZGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKCF0aGlzLl9pc1RyYW5zaXRpb25pbmcmJnN0KHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKGd0KSl7dmFyIGU9c3QuRXZlbnQoZHQuSElERSk7aWYoc3QodGhpcy5fZWxlbWVudCkudHJpZ2dlcihlKSwhZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSl7dmFyIG49dGhpcy5fZ2V0RGltZW5zaW9uKCk7dGhpcy5fZWxlbWVudC5zdHlsZVtuXT10aGlzLl9lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW25dKyJweCIsRm4ucmVmbG93KHRoaXMuX2VsZW1lbnQpLHN0KHRoaXMuX2VsZW1lbnQpLmFkZENsYXNzKG10KS5yZW1vdmVDbGFzcyhfdCkucmVtb3ZlQ2xhc3MoZ3QpO3ZhciBpPXRoaXMuX3RyaWdnZXJBcnJheS5sZW5ndGg7aWYoMDxpKWZvcih2YXIgcj0wO3I8aTtyKyspe3ZhciBvPXRoaXMuX3RyaWdnZXJBcnJheVtyXSxzPUZuLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQobyk7aWYobnVsbCE9PXMpc3QoW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHMpKSkuaGFzQ2xhc3MoZ3QpfHxzdChvKS5hZGRDbGFzcyhwdCkuYXR0cigiYXJpYS1leHBhbmRlZCIsITEpfXRoaXMuc2V0VHJhbnNpdGlvbmluZyghMCk7dGhpcy5fZWxlbWVudC5zdHlsZVtuXT0iIjt2YXIgYT1Gbi5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTtzdCh0aGlzLl9lbGVtZW50KS5vbmUoRm4uVFJBTlNJVElPTl9FTkQsZnVuY3Rpb24oKXt0LnNldFRyYW5zaXRpb25pbmcoITEpLHN0KHQuX2VsZW1lbnQpLnJlbW92ZUNsYXNzKG10KS5hZGRDbGFzcyhfdCkudHJpZ2dlcihkdC5ISURERU4pfSkuZW11bGF0ZVRyYW5zaXRpb25FbmQoYSl9fX0sdC5zZXRUcmFuc2l0aW9uaW5nPWZ1bmN0aW9uKHQpe3RoaXMuX2lzVHJhbnNpdGlvbmluZz10fSx0LmRpc3Bvc2U9ZnVuY3Rpb24oKXtzdC5yZW1vdmVEYXRhKHRoaXMuX2VsZW1lbnQsbHQpLHRoaXMuX2NvbmZpZz1udWxsLHRoaXMuX3BhcmVudD1udWxsLHRoaXMuX2VsZW1lbnQ9bnVsbCx0aGlzLl90cmlnZ2VyQXJyYXk9bnVsbCx0aGlzLl9pc1RyYW5zaXRpb25pbmc9bnVsbH0sdC5fZ2V0Q29uZmlnPWZ1bmN0aW9uKHQpe3JldHVybih0PWwoe30sdXQsdCkpLnRvZ2dsZT1Cb29sZWFuKHQudG9nZ2xlKSxGbi50eXBlQ2hlY2tDb25maWcoYXQsdCxmdCksdH0sdC5fZ2V0RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHN0KHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKHZ0KT92dDp5dH0sdC5fZ2V0UGFyZW50PWZ1bmN0aW9uKCl7dmFyIG49dGhpcyx0PW51bGw7Rm4uaXNFbGVtZW50KHRoaXMuX2NvbmZpZy5wYXJlbnQpPyh0PXRoaXMuX2NvbmZpZy5wYXJlbnQsInVuZGVmaW5lZCIhPXR5cGVvZiB0aGlzLl9jb25maWcucGFyZW50LmpxdWVyeSYmKHQ9dGhpcy5fY29uZmlnLnBhcmVudFswXSkpOnQ9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLl9jb25maWcucGFyZW50KTt2YXIgZT0nW2RhdGEtdG9nZ2xlPSJjb2xsYXBzZSJdW2RhdGEtcGFyZW50PSInK3RoaXMuX2NvbmZpZy5wYXJlbnQrJyJdJyxpPVtdLnNsaWNlLmNhbGwodC5xdWVyeVNlbGVjdG9yQWxsKGUpKTtyZXR1cm4gc3QoaSkuZWFjaChmdW5jdGlvbih0LGUpe24uX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyhhLl9nZXRUYXJnZXRGcm9tRWxlbWVudChlKSxbZV0pfSksdH0sdC5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzPWZ1bmN0aW9uKHQsZSl7aWYodCl7dmFyIG49c3QodCkuaGFzQ2xhc3MoZ3QpO2UubGVuZ3RoJiZzdChlKS50b2dnbGVDbGFzcyhwdCwhbikuYXR0cigiYXJpYS1leHBhbmRlZCIsbil9fSxhLl9nZXRUYXJnZXRGcm9tRWxlbWVudD1mdW5jdGlvbih0KXt2YXIgZT1Gbi5nZXRTZWxlY3RvckZyb21FbGVtZW50KHQpO3JldHVybiBlP2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZSk6bnVsbH0sYS5falF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKGkpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1zdCh0aGlzKSxlPXQuZGF0YShsdCksbj1sKHt9LHV0LHQuZGF0YSgpLCJvYmplY3QiPT10eXBlb2YgaSYmaT9pOnt9KTtpZighZSYmbi50b2dnbGUmJi9zaG93fGhpZGUvLnRlc3QoaSkmJihuLnRvZ2dsZT0hMSksZXx8KGU9bmV3IGEodGhpcyxuKSx0LmRhdGEobHQsZSkpLCJzdHJpbmciPT10eXBlb2YgaSl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBlW2ldKXRocm93IG5ldyBUeXBlRXJyb3IoJ05vIG1ldGhvZCBuYW1lZCAiJytpKyciJyk7ZVtpXSgpfX0pfSxzKGEsbnVsbCxbe2tleToiVkVSU0lPTiIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIjQuMS4zIn19LHtrZXk6IkRlZmF1bHQiLGdldDpmdW5jdGlvbigpe3JldHVybiB1dH19XSksYX0oKSxzdChkb2N1bWVudCkub24oZHQuQ0xJQ0tfREFUQV9BUEksQ3QsZnVuY3Rpb24odCl7IkEiPT09dC5jdXJyZW50VGFyZ2V0LnRhZ05hbWUmJnQucHJldmVudERlZmF1bHQoKTt2YXIgbj1zdCh0aGlzKSxlPUZuLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQodGhpcyksaT1bXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZSkpO3N0KGkpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1zdCh0aGlzKSxlPXQuZGF0YShsdCk/InRvZ2dsZSI6bi5kYXRhKCk7VHQuX2pRdWVyeUludGVyZmFjZS5jYWxsKHQsZSl9KX0pLHN0LmZuW2F0XT1UdC5falF1ZXJ5SW50ZXJmYWNlLHN0LmZuW2F0XS5Db25zdHJ1Y3Rvcj1UdCxzdC5mblthdF0ubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBzdC5mblthdF09aHQsVHQuX2pRdWVyeUludGVyZmFjZX0sVHQpLFZuPShTdD0iZHJvcGRvd24iLEF0PSIuIisoSXQ9ImJzLmRyb3Bkb3duIiksRHQ9Ii5kYXRhLWFwaSIsd3Q9KGJ0PWUpLmZuW1N0XSxOdD1uZXcgUmVnRXhwKCIzOHw0MHwyNyIpLE90PXtISURFOiJoaWRlIitBdCxISURERU46ImhpZGRlbiIrQXQsU0hPVzoic2hvdyIrQXQsU0hPV046InNob3duIitBdCxDTElDSzoiY2xpY2siK0F0LENMSUNLX0RBVEFfQVBJOiJjbGljayIrQXQrRHQsS0VZRE9XTl9EQVRBX0FQSToia2V5ZG93biIrQXQrRHQsS0VZVVBfREFUQV9BUEk6ImtleXVwIitBdCtEdH0sa3Q9ImRpc2FibGVkIixQdD0ic2hvdyIsanQ9ImRyb3B1cCIsSHQ9ImRyb3ByaWdodCIsTHQ9ImRyb3BsZWZ0IixSdD0iZHJvcGRvd24tbWVudS1yaWdodCIseHQ9InBvc2l0aW9uLXN0YXRpYyIsV3Q9J1tkYXRhLXRvZ2dsZT0iZHJvcGRvd24iXScsVXQ9Ii5kcm9wZG93biBmb3JtIixxdD0iLmRyb3Bkb3duLW1lbnUiLEZ0PSIubmF2YmFyLW5hdiIsS3Q9Ii5kcm9wZG93bi1tZW51IC5kcm9wZG93bi1pdGVtOm5vdCguZGlzYWJsZWQpOm5vdCg6ZGlzYWJsZWQpIixNdD0idG9wLXN0YXJ0IixRdD0idG9wLWVuZCIsQnQ9ImJvdHRvbS1zdGFydCIsVnQ9ImJvdHRvbS1lbmQiLFl0PSJyaWdodC1zdGFydCIsenQ9ImxlZnQtc3RhcnQiLEp0PXtvZmZzZXQ6MCxmbGlwOiEwLGJvdW5kYXJ5OiJzY3JvbGxQYXJlbnQiLHJlZmVyZW5jZToidG9nZ2xlIixkaXNwbGF5OiJkeW5hbWljIn0sWnQ9e29mZnNldDoiKG51bWJlcnxzdHJpbmd8ZnVuY3Rpb24pIixmbGlwOiJib29sZWFuIixib3VuZGFyeToiKHN0cmluZ3xlbGVtZW50KSIscmVmZXJlbmNlOiIoc3RyaW5nfGVsZW1lbnQpIixkaXNwbGF5OiJzdHJpbmcifSxHdD1mdW5jdGlvbigpe2Z1bmN0aW9uIGModCxlKXt0aGlzLl9lbGVtZW50PXQsdGhpcy5fcG9wcGVyPW51bGwsdGhpcy5fY29uZmlnPXRoaXMuX2dldENvbmZpZyhlKSx0aGlzLl9tZW51PXRoaXMuX2dldE1lbnVFbGVtZW50KCksdGhpcy5faW5OYXZiYXI9dGhpcy5fZGV0ZWN0TmF2YmFyKCksdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoKX12YXIgdD1jLnByb3RvdHlwZTtyZXR1cm4gdC50b2dnbGU9ZnVuY3Rpb24oKXtpZighdGhpcy5fZWxlbWVudC5kaXNhYmxlZCYmIWJ0KHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKGt0KSl7dmFyIHQ9Yy5fZ2V0UGFyZW50RnJvbUVsZW1lbnQodGhpcy5fZWxlbWVudCksZT1idCh0aGlzLl9tZW51KS5oYXNDbGFzcyhQdCk7aWYoYy5fY2xlYXJNZW51cygpLCFlKXt2YXIgbj17cmVsYXRlZFRhcmdldDp0aGlzLl9lbGVtZW50fSxpPWJ0LkV2ZW50KE90LlNIT1csbik7aWYoYnQodCkudHJpZ2dlcihpKSwhaS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSl7aWYoIXRoaXMuX2luTmF2YmFyKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiQm9vdHN0cmFwIGRyb3Bkb3duIHJlcXVpcmUgUG9wcGVyLmpzIChodHRwczovL3BvcHBlci5qcy5vcmcpIik7dmFyIHI9dGhpcy5fZWxlbWVudDsicGFyZW50Ij09PXRoaXMuX2NvbmZpZy5yZWZlcmVuY2U/cj10OkZuLmlzRWxlbWVudCh0aGlzLl9jb25maWcucmVmZXJlbmNlKSYmKHI9dGhpcy5fY29uZmlnLnJlZmVyZW5jZSwidW5kZWZpbmVkIiE9dHlwZW9mIHRoaXMuX2NvbmZpZy5yZWZlcmVuY2UuanF1ZXJ5JiYocj10aGlzLl9jb25maWcucmVmZXJlbmNlWzBdKSksInNjcm9sbFBhcmVudCIhPT10aGlzLl9jb25maWcuYm91bmRhcnkmJmJ0KHQpLmFkZENsYXNzKHh0KSx0aGlzLl9wb3BwZXI9bmV3IGgocix0aGlzLl9tZW51LHRoaXMuX2dldFBvcHBlckNvbmZpZygpKX0ib250b3VjaHN0YXJ0ImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmMD09PWJ0KHQpLmNsb3Nlc3QoRnQpLmxlbmd0aCYmYnQoZG9jdW1lbnQuYm9keSkuY2hpbGRyZW4oKS5vbigibW91c2VvdmVyIixudWxsLGJ0Lm5vb3ApLHRoaXMuX2VsZW1lbnQuZm9jdXMoKSx0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsITApLGJ0KHRoaXMuX21lbnUpLnRvZ2dsZUNsYXNzKFB0KSxidCh0KS50b2dnbGVDbGFzcyhQdCkudHJpZ2dlcihidC5FdmVudChPdC5TSE9XTixuKSl9fX19LHQuZGlzcG9zZT1mdW5jdGlvbigpe2J0LnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCxJdCksYnQodGhpcy5fZWxlbWVudCkub2ZmKEF0KSx0aGlzLl9lbGVtZW50PW51bGwsKHRoaXMuX21lbnU9bnVsbCkhPT10aGlzLl9wb3BwZXImJih0aGlzLl9wb3BwZXIuZGVzdHJveSgpLHRoaXMuX3BvcHBlcj1udWxsKX0sdC51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl9pbk5hdmJhcj10aGlzLl9kZXRlY3ROYXZiYXIoKSxudWxsIT09dGhpcy5fcG9wcGVyJiZ0aGlzLl9wb3BwZXIuc2NoZWR1bGVVcGRhdGUoKX0sdC5fYWRkRXZlbnRMaXN0ZW5lcnM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2J0KHRoaXMuX2VsZW1lbnQpLm9uKE90LkNMSUNLLGZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLGUudG9nZ2xlKCl9KX0sdC5fZ2V0Q29uZmlnPWZ1bmN0aW9uKHQpe3JldHVybiB0PWwoe30sdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0LGJ0KHRoaXMuX2VsZW1lbnQpLmRhdGEoKSx0KSxGbi50eXBlQ2hlY2tDb25maWcoU3QsdCx0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRUeXBlKSx0fSx0Ll9nZXRNZW51RWxlbWVudD1mdW5jdGlvbigpe2lmKCF0aGlzLl9tZW51KXt2YXIgdD1jLl9nZXRQYXJlbnRGcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTt0JiYodGhpcy5fbWVudT10LnF1ZXJ5U2VsZWN0b3IocXQpKX1yZXR1cm4gdGhpcy5fbWVudX0sdC5fZ2V0UGxhY2VtZW50PWZ1bmN0aW9uKCl7dmFyIHQ9YnQodGhpcy5fZWxlbWVudC5wYXJlbnROb2RlKSxlPUJ0O3JldHVybiB0Lmhhc0NsYXNzKGp0KT8oZT1NdCxidCh0aGlzLl9tZW51KS5oYXNDbGFzcyhSdCkmJihlPVF0KSk6dC5oYXNDbGFzcyhIdCk/ZT1ZdDp0Lmhhc0NsYXNzKEx0KT9lPXp0OmJ0KHRoaXMuX21lbnUpLmhhc0NsYXNzKFJ0KSYmKGU9VnQpLGV9LHQuX2RldGVjdE5hdmJhcj1mdW5jdGlvbigpe3JldHVybiAwPGJ0KHRoaXMuX2VsZW1lbnQpLmNsb3Nlc3QoIi5uYXZiYXIiKS5sZW5ndGh9LHQuX2dldFBvcHBlckNvbmZpZz1mdW5jdGlvbigpe3ZhciBlPXRoaXMsdD17fTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5fY29uZmlnLm9mZnNldD90LmZuPWZ1bmN0aW9uKHQpe3JldHVybiB0Lm9mZnNldHM9bCh7fSx0Lm9mZnNldHMsZS5fY29uZmlnLm9mZnNldCh0Lm9mZnNldHMpfHx7fSksdH06dC5vZmZzZXQ9dGhpcy5fY29uZmlnLm9mZnNldDt2YXIgbj17cGxhY2VtZW50OnRoaXMuX2dldFBsYWNlbWVudCgpLG1vZGlmaWVyczp7b2Zmc2V0OnQsZmxpcDp7ZW5hYmxlZDp0aGlzLl9jb25maWcuZmxpcH0scHJldmVudE92ZXJmbG93Ontib3VuZGFyaWVzRWxlbWVudDp0aGlzLl9jb25maWcuYm91bmRhcnl9fX07cmV0dXJuInN0YXRpYyI9PT10aGlzLl9jb25maWcuZGlzcGxheSYmKG4ubW9kaWZpZXJzLmFwcGx5U3R5bGU9e2VuYWJsZWQ6ITF9KSxufSxjLl9qUXVlcnlJbnRlcmZhY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PWJ0KHRoaXMpLmRhdGEoSXQpO2lmKHR8fCh0PW5ldyBjKHRoaXMsIm9iamVjdCI9PXR5cGVvZiBlP2U6bnVsbCksYnQodGhpcykuZGF0YShJdCx0KSksInN0cmluZyI9PXR5cGVvZiBlKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIHRbZV0pdGhyb3cgbmV3IFR5cGVFcnJvcignTm8gbWV0aG9kIG5hbWVkICInK2UrJyInKTt0W2VdKCl9fSl9LGMuX2NsZWFyTWVudXM9ZnVuY3Rpb24odCl7aWYoIXR8fDMhPT10LndoaWNoJiYoImtleXVwIiE9PXQudHlwZXx8OT09PXQud2hpY2gpKWZvcih2YXIgZT1bXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoV3QpKSxuPTAsaT1lLmxlbmd0aDtuPGk7bisrKXt2YXIgcj1jLl9nZXRQYXJlbnRGcm9tRWxlbWVudChlW25dKSxvPWJ0KGVbbl0pLmRhdGEoSXQpLHM9e3JlbGF0ZWRUYXJnZXQ6ZVtuXX07aWYodCYmImNsaWNrIj09PXQudHlwZSYmKHMuY2xpY2tFdmVudD10KSxvKXt2YXIgYT1vLl9tZW51O2lmKGJ0KHIpLmhhc0NsYXNzKFB0KSYmISh0JiYoImNsaWNrIj09PXQudHlwZSYmL2lucHV0fHRleHRhcmVhL2kudGVzdCh0LnRhcmdldC50YWdOYW1lKXx8ImtleXVwIj09PXQudHlwZSYmOT09PXQud2hpY2gpJiZidC5jb250YWlucyhyLHQudGFyZ2V0KSkpe3ZhciBsPWJ0LkV2ZW50KE90LkhJREUscyk7YnQocikudHJpZ2dlcihsKSxsLmlzRGVmYXVsdFByZXZlbnRlZCgpfHwoIm9udG91Y2hzdGFydCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQmJmJ0KGRvY3VtZW50LmJvZHkpLmNoaWxkcmVuKCkub2ZmKCJtb3VzZW92ZXIiLG51bGwsYnQubm9vcCksZVtuXS5zZXRBdHRyaWJ1dGUoImFyaWEtZXhwYW5kZWQiLCJmYWxzZSIpLGJ0KGEpLnJlbW92ZUNsYXNzKFB0KSxidChyKS5yZW1vdmVDbGFzcyhQdCkudHJpZ2dlcihidC5FdmVudChPdC5ISURERU4scykpKX19fX0sYy5fZ2V0UGFyZW50RnJvbUVsZW1lbnQ9ZnVuY3Rpb24odCl7dmFyIGUsbj1Gbi5nZXRTZWxlY3RvckZyb21FbGVtZW50KHQpO3JldHVybiBuJiYoZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKG4pKSxlfHx0LnBhcmVudE5vZGV9LGMuX2RhdGFBcGlLZXlkb3duSGFuZGxlcj1mdW5jdGlvbih0KXtpZigoL2lucHV0fHRleHRhcmVhL2kudGVzdCh0LnRhcmdldC50YWdOYW1lKT8hKDMyPT09dC53aGljaHx8MjchPT10LndoaWNoJiYoNDAhPT10LndoaWNoJiYzOCE9PXQud2hpY2h8fGJ0KHQudGFyZ2V0KS5jbG9zZXN0KHF0KS5sZW5ndGgpKTpOdC50ZXN0KHQud2hpY2gpKSYmKHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLCF0aGlzLmRpc2FibGVkJiYhYnQodGhpcykuaGFzQ2xhc3Moa3QpKSl7dmFyIGU9Yy5fZ2V0UGFyZW50RnJvbUVsZW1lbnQodGhpcyksbj1idChlKS5oYXNDbGFzcyhQdCk7aWYoKG58fDI3PT09dC53aGljaCYmMzI9PT10LndoaWNoKSYmKCFufHwyNyE9PXQud2hpY2gmJjMyIT09dC53aGljaCkpe3ZhciBpPVtdLnNsaWNlLmNhbGwoZS5xdWVyeVNlbGVjdG9yQWxsKEt0KSk7aWYoMCE9PWkubGVuZ3RoKXt2YXIgcj1pLmluZGV4T2YodC50YXJnZXQpOzM4PT09dC53aGljaCYmMDxyJiZyLS0sNDA9PT10LndoaWNoJiZyPGkubGVuZ3RoLTEmJnIrKyxyPDAmJihyPTApLGlbcl0uZm9jdXMoKX19ZWxzZXtpZigyNz09PXQud2hpY2gpe3ZhciBvPWUucXVlcnlTZWxlY3RvcihXdCk7YnQobykudHJpZ2dlcigiZm9jdXMiKX1idCh0aGlzKS50cmlnZ2VyKCJjbGljayIpfX19LHMoYyxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNC4xLjMifX0se2tleToiRGVmYXVsdCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEp0fX0se2tleToiRGVmYXVsdFR5cGUiLGdldDpmdW5jdGlvbigpe3JldHVybiBadH19XSksY30oKSxidChkb2N1bWVudCkub24oT3QuS0VZRE9XTl9EQVRBX0FQSSxXdCxHdC5fZGF0YUFwaUtleWRvd25IYW5kbGVyKS5vbihPdC5LRVlET1dOX0RBVEFfQVBJLHF0LEd0Ll9kYXRhQXBpS2V5ZG93bkhhbmRsZXIpLm9uKE90LkNMSUNLX0RBVEFfQVBJKyIgIitPdC5LRVlVUF9EQVRBX0FQSSxHdC5fY2xlYXJNZW51cykub24oT3QuQ0xJQ0tfREFUQV9BUEksV3QsZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksR3QuX2pRdWVyeUludGVyZmFjZS5jYWxsKGJ0KHRoaXMpLCJ0b2dnbGUiKX0pLm9uKE90LkNMSUNLX0RBVEFfQVBJLFV0LGZ1bmN0aW9uKHQpe3Quc3RvcFByb3BhZ2F0aW9uKCl9KSxidC5mbltTdF09R3QuX2pRdWVyeUludGVyZmFjZSxidC5mbltTdF0uQ29uc3RydWN0b3I9R3QsYnQuZm5bU3RdLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gYnQuZm5bU3RdPXd0LEd0Ll9qUXVlcnlJbnRlcmZhY2V9LEd0KSxZbj0oWHQ9Im1vZGFsIixlZT0iLiIrKHRlPSJicy5tb2RhbCIpLG5lPSgkdD1lKS5mbltYdF0saWU9e2JhY2tkcm9wOiEwLGtleWJvYXJkOiEwLGZvY3VzOiEwLHNob3c6ITB9LHJlPXtiYWNrZHJvcDoiKGJvb2xlYW58c3RyaW5nKSIsa2V5Ym9hcmQ6ImJvb2xlYW4iLGZvY3VzOiJib29sZWFuIixzaG93OiJib29sZWFuIn0sb2U9e0hJREU6ImhpZGUiK2VlLEhJRERFTjoiaGlkZGVuIitlZSxTSE9XOiJzaG93IitlZSxTSE9XTjoic2hvd24iK2VlLEZPQ1VTSU46ImZvY3VzaW4iK2VlLFJFU0laRToicmVzaXplIitlZSxDTElDS19ESVNNSVNTOiJjbGljay5kaXNtaXNzIitlZSxLRVlET1dOX0RJU01JU1M6ImtleWRvd24uZGlzbWlzcyIrZWUsTU9VU0VVUF9ESVNNSVNTOiJtb3VzZXVwLmRpc21pc3MiK2VlLE1PVVNFRE9XTl9ESVNNSVNTOiJtb3VzZWRvd24uZGlzbWlzcyIrZWUsQ0xJQ0tfREFUQV9BUEk6ImNsaWNrIitlZSsiLmRhdGEtYXBpIn0sc2U9Im1vZGFsLXNjcm9sbGJhci1tZWFzdXJlIixhZT0ibW9kYWwtYmFja2Ryb3AiLGxlPSJtb2RhbC1vcGVuIixjZT0iZmFkZSIsaGU9InNob3ciLHVlPSIubW9kYWwtZGlhbG9nIixmZT0nW2RhdGEtdG9nZ2xlPSJtb2RhbCJdJyxkZT0nW2RhdGEtZGlzbWlzcz0ibW9kYWwiXScsZ2U9Ii5maXhlZC10b3AsIC5maXhlZC1ib3R0b20sIC5pcy1maXhlZCwgLnN0aWNreS10b3AiLF9lPSIuc3RpY2t5LXRvcCIsbWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiByKHQsZSl7dGhpcy5fY29uZmlnPXRoaXMuX2dldENvbmZpZyhlKSx0aGlzLl9lbGVtZW50PXQsdGhpcy5fZGlhbG9nPXQucXVlcnlTZWxlY3Rvcih1ZSksdGhpcy5fYmFja2Ryb3A9bnVsbCx0aGlzLl9pc1Nob3duPSExLHRoaXMuX2lzQm9keU92ZXJmbG93aW5nPSExLHRoaXMuX2lnbm9yZUJhY2tkcm9wQ2xpY2s9ITEsdGhpcy5fc2Nyb2xsYmFyV2lkdGg9MH12YXIgdD1yLnByb3RvdHlwZTtyZXR1cm4gdC50b2dnbGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2lzU2hvd24/dGhpcy5oaWRlKCk6dGhpcy5zaG93KHQpfSx0LnNob3c9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZighdGhpcy5faXNUcmFuc2l0aW9uaW5nJiYhdGhpcy5faXNTaG93bil7JHQodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoY2UpJiYodGhpcy5faXNUcmFuc2l0aW9uaW5nPSEwKTt2YXIgbj0kdC5FdmVudChvZS5TSE9XLHtyZWxhdGVkVGFyZ2V0OnR9KTskdCh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKG4pLHRoaXMuX2lzU2hvd258fG4uaXNEZWZhdWx0UHJldmVudGVkKCl8fCh0aGlzLl9pc1Nob3duPSEwLHRoaXMuX2NoZWNrU2Nyb2xsYmFyKCksdGhpcy5fc2V0U2Nyb2xsYmFyKCksdGhpcy5fYWRqdXN0RGlhbG9nKCksJHQoZG9jdW1lbnQuYm9keSkuYWRkQ2xhc3MobGUpLHRoaXMuX3NldEVzY2FwZUV2ZW50KCksdGhpcy5fc2V0UmVzaXplRXZlbnQoKSwkdCh0aGlzLl9lbGVtZW50KS5vbihvZS5DTElDS19ESVNNSVNTLGRlLGZ1bmN0aW9uKHQpe3JldHVybiBlLmhpZGUodCl9KSwkdCh0aGlzLl9kaWFsb2cpLm9uKG9lLk1PVVNFRE9XTl9ESVNNSVNTLGZ1bmN0aW9uKCl7JHQoZS5fZWxlbWVudCkub25lKG9lLk1PVVNFVVBfRElTTUlTUyxmdW5jdGlvbih0KXskdCh0LnRhcmdldCkuaXMoZS5fZWxlbWVudCkmJihlLl9pZ25vcmVCYWNrZHJvcENsaWNrPSEwKX0pfSksdGhpcy5fc2hvd0JhY2tkcm9wKGZ1bmN0aW9uKCl7cmV0dXJuIGUuX3Nob3dFbGVtZW50KHQpfSkpfX0sdC5oaWRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYodCYmdC5wcmV2ZW50RGVmYXVsdCgpLCF0aGlzLl9pc1RyYW5zaXRpb25pbmcmJnRoaXMuX2lzU2hvd24pe3ZhciBuPSR0LkV2ZW50KG9lLkhJREUpO2lmKCR0KHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIobiksdGhpcy5faXNTaG93biYmIW4uaXNEZWZhdWx0UHJldmVudGVkKCkpe3RoaXMuX2lzU2hvd249ITE7dmFyIGk9JHQodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoY2UpO2lmKGkmJih0aGlzLl9pc1RyYW5zaXRpb25pbmc9ITApLHRoaXMuX3NldEVzY2FwZUV2ZW50KCksdGhpcy5fc2V0UmVzaXplRXZlbnQoKSwkdChkb2N1bWVudCkub2ZmKG9lLkZPQ1VTSU4pLCR0KHRoaXMuX2VsZW1lbnQpLnJlbW92ZUNsYXNzKGhlKSwkdCh0aGlzLl9lbGVtZW50KS5vZmYob2UuQ0xJQ0tfRElTTUlTUyksJHQodGhpcy5fZGlhbG9nKS5vZmYob2UuTU9VU0VET1dOX0RJU01JU1MpLGkpe3ZhciByPUZuLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpOyR0KHRoaXMuX2VsZW1lbnQpLm9uZShGbi5UUkFOU0lUSU9OX0VORCxmdW5jdGlvbih0KXtyZXR1cm4gZS5faGlkZU1vZGFsKHQpfSkuZW11bGF0ZVRyYW5zaXRpb25FbmQocil9ZWxzZSB0aGlzLl9oaWRlTW9kYWwoKX19fSx0LmRpc3Bvc2U9ZnVuY3Rpb24oKXskdC5yZW1vdmVEYXRhKHRoaXMuX2VsZW1lbnQsdGUpLCR0KHdpbmRvdyxkb2N1bWVudCx0aGlzLl9lbGVtZW50LHRoaXMuX2JhY2tkcm9wKS5vZmYoZWUpLHRoaXMuX2NvbmZpZz1udWxsLHRoaXMuX2VsZW1lbnQ9bnVsbCx0aGlzLl9kaWFsb2c9bnVsbCx0aGlzLl9iYWNrZHJvcD1udWxsLHRoaXMuX2lzU2hvd249bnVsbCx0aGlzLl9pc0JvZHlPdmVyZmxvd2luZz1udWxsLHRoaXMuX2lnbm9yZUJhY2tkcm9wQ2xpY2s9bnVsbCx0aGlzLl9zY3JvbGxiYXJXaWR0aD1udWxsfSx0LmhhbmRsZVVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuX2FkanVzdERpYWxvZygpfSx0Ll9nZXRDb25maWc9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bCh7fSxpZSx0KSxGbi50eXBlQ2hlY2tDb25maWcoWHQsdCxyZSksdH0sdC5fc2hvd0VsZW1lbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPSR0KHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKGNlKTt0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUmJnRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFfHxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnQpLHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpLHRoaXMuX2VsZW1lbnQuc2Nyb2xsVG9wPTAsbiYmRm4ucmVmbG93KHRoaXMuX2VsZW1lbnQpLCR0KHRoaXMuX2VsZW1lbnQpLmFkZENsYXNzKGhlKSx0aGlzLl9jb25maWcuZm9jdXMmJnRoaXMuX2VuZm9yY2VGb2N1cygpO3ZhciBpPSR0LkV2ZW50KG9lLlNIT1dOLHtyZWxhdGVkVGFyZ2V0OnR9KSxyPWZ1bmN0aW9uKCl7ZS5fY29uZmlnLmZvY3VzJiZlLl9lbGVtZW50LmZvY3VzKCksZS5faXNUcmFuc2l0aW9uaW5nPSExLCR0KGUuX2VsZW1lbnQpLnRyaWdnZXIoaSl9O2lmKG4pe3ZhciBvPUZuLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpOyR0KHRoaXMuX2RpYWxvZykub25lKEZuLlRSQU5TSVRJT05fRU5ELHIpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKG8pfWVsc2UgcigpfSx0Ll9lbmZvcmNlRm9jdXM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzOyR0KGRvY3VtZW50KS5vZmYob2UuRk9DVVNJTikub24ob2UuRk9DVVNJTixmdW5jdGlvbih0KXtkb2N1bWVudCE9PXQudGFyZ2V0JiZlLl9lbGVtZW50IT09dC50YXJnZXQmJjA9PT0kdChlLl9lbGVtZW50KS5oYXModC50YXJnZXQpLmxlbmd0aCYmZS5fZWxlbWVudC5mb2N1cygpfSl9LHQuX3NldEVzY2FwZUV2ZW50PWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl9pc1Nob3duJiZ0aGlzLl9jb25maWcua2V5Ym9hcmQ/JHQodGhpcy5fZWxlbWVudCkub24ob2UuS0VZRE9XTl9ESVNNSVNTLGZ1bmN0aW9uKHQpezI3PT09dC53aGljaCYmKHQucHJldmVudERlZmF1bHQoKSxlLmhpZGUoKSl9KTp0aGlzLl9pc1Nob3dufHwkdCh0aGlzLl9lbGVtZW50KS5vZmYob2UuS0VZRE9XTl9ESVNNSVNTKX0sdC5fc2V0UmVzaXplRXZlbnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuX2lzU2hvd24/JHQod2luZG93KS5vbihvZS5SRVNJWkUsZnVuY3Rpb24odCl7cmV0dXJuIGUuaGFuZGxlVXBkYXRlKHQpfSk6JHQod2luZG93KS5vZmYob2UuUkVTSVpFKX0sdC5faGlkZU1vZGFsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsITApLHRoaXMuX2lzVHJhbnNpdGlvbmluZz0hMSx0aGlzLl9zaG93QmFja2Ryb3AoZnVuY3Rpb24oKXskdChkb2N1bWVudC5ib2R5KS5yZW1vdmVDbGFzcyhsZSksdC5fcmVzZXRBZGp1c3RtZW50cygpLHQuX3Jlc2V0U2Nyb2xsYmFyKCksJHQodC5fZWxlbWVudCkudHJpZ2dlcihvZS5ISURERU4pfSl9LHQuX3JlbW92ZUJhY2tkcm9wPWZ1bmN0aW9uKCl7dGhpcy5fYmFja2Ryb3AmJigkdCh0aGlzLl9iYWNrZHJvcCkucmVtb3ZlKCksdGhpcy5fYmFja2Ryb3A9bnVsbCl9LHQuX3Nob3dCYWNrZHJvcD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49JHQodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoY2UpP2NlOiIiO2lmKHRoaXMuX2lzU2hvd24mJnRoaXMuX2NvbmZpZy5iYWNrZHJvcCl7aWYodGhpcy5fYmFja2Ryb3A9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5fYmFja2Ryb3AuY2xhc3NOYW1lPWFlLG4mJnRoaXMuX2JhY2tkcm9wLmNsYXNzTGlzdC5hZGQobiksJHQodGhpcy5fYmFja2Ryb3ApLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpLCR0KHRoaXMuX2VsZW1lbnQpLm9uKG9lLkNMSUNLX0RJU01JU1MsZnVuY3Rpb24odCl7ZS5faWdub3JlQmFja2Ryb3BDbGljaz9lLl9pZ25vcmVCYWNrZHJvcENsaWNrPSExOnQudGFyZ2V0PT09dC5jdXJyZW50VGFyZ2V0JiYoInN0YXRpYyI9PT1lLl9jb25maWcuYmFja2Ryb3A/ZS5fZWxlbWVudC5mb2N1cygpOmUuaGlkZSgpKX0pLG4mJkZuLnJlZmxvdyh0aGlzLl9iYWNrZHJvcCksJHQodGhpcy5fYmFja2Ryb3ApLmFkZENsYXNzKGhlKSwhdClyZXR1cm47aWYoIW4pcmV0dXJuIHZvaWQgdCgpO3ZhciBpPUZuLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMuX2JhY2tkcm9wKTskdCh0aGlzLl9iYWNrZHJvcCkub25lKEZuLlRSQU5TSVRJT05fRU5ELHQpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGkpfWVsc2UgaWYoIXRoaXMuX2lzU2hvd24mJnRoaXMuX2JhY2tkcm9wKXskdCh0aGlzLl9iYWNrZHJvcCkucmVtb3ZlQ2xhc3MoaGUpO3ZhciByPWZ1bmN0aW9uKCl7ZS5fcmVtb3ZlQmFja2Ryb3AoKSx0JiZ0KCl9O2lmKCR0KHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKGNlKSl7dmFyIG89Rm4uZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodGhpcy5fYmFja2Ryb3ApOyR0KHRoaXMuX2JhY2tkcm9wKS5vbmUoRm4uVFJBTlNJVElPTl9FTkQscikuZW11bGF0ZVRyYW5zaXRpb25FbmQobyl9ZWxzZSByKCl9ZWxzZSB0JiZ0KCl9LHQuX2FkanVzdERpYWxvZz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2VsZW1lbnQuc2Nyb2xsSGVpZ2h0PmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7IXRoaXMuX2lzQm9keU92ZXJmbG93aW5nJiZ0JiYodGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nTGVmdD10aGlzLl9zY3JvbGxiYXJXaWR0aCsicHgiKSx0aGlzLl9pc0JvZHlPdmVyZmxvd2luZyYmIXQmJih0aGlzLl9lbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodD10aGlzLl9zY3JvbGxiYXJXaWR0aCsicHgiKX0sdC5fcmVzZXRBZGp1c3RtZW50cz1mdW5jdGlvbigpe3RoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ0xlZnQ9IiIsdGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQ9IiJ9LHQuX2NoZWNrU2Nyb2xsYmFyPWZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLl9pc0JvZHlPdmVyZmxvd2luZz10LmxlZnQrdC5yaWdodDx3aW5kb3cuaW5uZXJXaWR0aCx0aGlzLl9zY3JvbGxiYXJXaWR0aD10aGlzLl9nZXRTY3JvbGxiYXJXaWR0aCgpfSx0Ll9zZXRTY3JvbGxiYXI9ZnVuY3Rpb24oKXt2YXIgcj10aGlzO2lmKHRoaXMuX2lzQm9keU92ZXJmbG93aW5nKXt2YXIgdD1bXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZ2UpKSxlPVtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChfZSkpOyR0KHQpLmVhY2goZnVuY3Rpb24odCxlKXt2YXIgbj1lLnN0eWxlLnBhZGRpbmdSaWdodCxpPSR0KGUpLmNzcygicGFkZGluZy1yaWdodCIpOyR0KGUpLmRhdGEoInBhZGRpbmctcmlnaHQiLG4pLmNzcygicGFkZGluZy1yaWdodCIscGFyc2VGbG9hdChpKStyLl9zY3JvbGxiYXJXaWR0aCsicHgiKX0pLCR0KGUpLmVhY2goZnVuY3Rpb24odCxlKXt2YXIgbj1lLnN0eWxlLm1hcmdpblJpZ2h0LGk9JHQoZSkuY3NzKCJtYXJnaW4tcmlnaHQiKTskdChlKS5kYXRhKCJtYXJnaW4tcmlnaHQiLG4pLmNzcygibWFyZ2luLXJpZ2h0IixwYXJzZUZsb2F0KGkpLXIuX3Njcm9sbGJhcldpZHRoKyJweCIpfSk7dmFyIG49ZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQsaT0kdChkb2N1bWVudC5ib2R5KS5jc3MoInBhZGRpbmctcmlnaHQiKTskdChkb2N1bWVudC5ib2R5KS5kYXRhKCJwYWRkaW5nLXJpZ2h0IixuKS5jc3MoInBhZGRpbmctcmlnaHQiLHBhcnNlRmxvYXQoaSkrdGhpcy5fc2Nyb2xsYmFyV2lkdGgrInB4Iil9fSx0Ll9yZXNldFNjcm9sbGJhcj1mdW5jdGlvbigpe3ZhciB0PVtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChnZSkpOyR0KHQpLmVhY2goZnVuY3Rpb24odCxlKXt2YXIgbj0kdChlKS5kYXRhKCJwYWRkaW5nLXJpZ2h0Iik7JHQoZSkucmVtb3ZlRGF0YSgicGFkZGluZy1yaWdodCIpLGUuc3R5bGUucGFkZGluZ1JpZ2h0PW58fCIifSk7dmFyIGU9W10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIiK19lKSk7JHQoZSkuZWFjaChmdW5jdGlvbih0LGUpe3ZhciBuPSR0KGUpLmRhdGEoIm1hcmdpbi1yaWdodCIpOyJ1bmRlZmluZWQiIT10eXBlb2YgbiYmJHQoZSkuY3NzKCJtYXJnaW4tcmlnaHQiLG4pLnJlbW92ZURhdGEoIm1hcmdpbi1yaWdodCIpfSk7dmFyIG49JHQoZG9jdW1lbnQuYm9keSkuZGF0YSgicGFkZGluZy1yaWdodCIpOyR0KGRvY3VtZW50LmJvZHkpLnJlbW92ZURhdGEoInBhZGRpbmctcmlnaHQiKSxkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD1ufHwiIn0sdC5fZ2V0U2Nyb2xsYmFyV2lkdGg9ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LmNsYXNzTmFtZT1zZSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHQpO3ZhciBlPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgtdC5jbGllbnRXaWR0aDtyZXR1cm4gZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0KSxlfSxyLl9qUXVlcnlJbnRlcmZhY2U9ZnVuY3Rpb24obixpKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9JHQodGhpcykuZGF0YSh0ZSksZT1sKHt9LGllLCR0KHRoaXMpLmRhdGEoKSwib2JqZWN0Ij09dHlwZW9mIG4mJm4/bjp7fSk7aWYodHx8KHQ9bmV3IHIodGhpcyxlKSwkdCh0aGlzKS5kYXRhKHRlLHQpKSwic3RyaW5nIj09dHlwZW9mIG4pe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgdFtuXSl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBtZXRob2QgbmFtZWQgIicrbisnIicpO3Rbbl0oaSl9ZWxzZSBlLnNob3cmJnQuc2hvdyhpKX0pfSxzKHIsbnVsbCxbe2tleToiVkVSU0lPTiIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIjQuMS4zIn19LHtrZXk6IkRlZmF1bHQiLGdldDpmdW5jdGlvbigpe3JldHVybiBpZX19XSkscn0oKSwkdChkb2N1bWVudCkub24ob2UuQ0xJQ0tfREFUQV9BUEksZmUsZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzLGk9Rm4uZ2V0U2VsZWN0b3JGcm9tRWxlbWVudCh0aGlzKTtpJiYoZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGkpKTt2YXIgcj0kdChlKS5kYXRhKHRlKT8idG9nZ2xlIjpsKHt9LCR0KGUpLmRhdGEoKSwkdCh0aGlzKS5kYXRhKCkpOyJBIiE9PXRoaXMudGFnTmFtZSYmIkFSRUEiIT09dGhpcy50YWdOYW1lfHx0LnByZXZlbnREZWZhdWx0KCk7dmFyIG89JHQoZSkub25lKG9lLlNIT1csZnVuY3Rpb24odCl7dC5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8by5vbmUob2UuSElEREVOLGZ1bmN0aW9uKCl7JHQobikuaXMoIjp2aXNpYmxlIikmJm4uZm9jdXMoKX0pfSk7bWUuX2pRdWVyeUludGVyZmFjZS5jYWxsKCR0KGUpLHIsdGhpcyl9KSwkdC5mbltYdF09bWUuX2pRdWVyeUludGVyZmFjZSwkdC5mbltYdF0uQ29uc3RydWN0b3I9bWUsJHQuZm5bWHRdLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gJHQuZm5bWHRdPW5lLG1lLl9qUXVlcnlJbnRlcmZhY2V9LG1lKSx6bj0odmU9InRvb2x0aXAiLEVlPSIuIisoeWU9ImJzLnRvb2x0aXAiKSxDZT0ocGU9ZSkuZm5bdmVdLFRlPSJicy10b29sdGlwIixiZT1uZXcgUmVnRXhwKCIoXnxcXHMpIitUZSsiXFxTKyIsImciKSxBZT17YW5pbWF0aW9uOiEwLHRlbXBsYXRlOic8ZGl2IGNsYXNzPSJ0b29sdGlwIiByb2xlPSJ0b29sdGlwIj48ZGl2IGNsYXNzPSJhcnJvdyI+PC9kaXY+PGRpdiBjbGFzcz0idG9vbHRpcC1pbm5lciI+PC9kaXY+PC9kaXY+Jyx0cmlnZ2VyOiJob3ZlciBmb2N1cyIsdGl0bGU6IiIsZGVsYXk6MCxodG1sOiEoSWU9e0FVVE86ImF1dG8iLFRPUDoidG9wIixSSUdIVDoicmlnaHQiLEJPVFRPTToiYm90dG9tIixMRUZUOiJsZWZ0In0pLHNlbGVjdG9yOiEoU2U9e2FuaW1hdGlvbjoiYm9vbGVhbiIsdGVtcGxhdGU6InN0cmluZyIsdGl0bGU6IihzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbikiLHRyaWdnZXI6InN0cmluZyIsZGVsYXk6IihudW1iZXJ8b2JqZWN0KSIsaHRtbDoiYm9vbGVhbiIsc2VsZWN0b3I6IihzdHJpbmd8Ym9vbGVhbikiLHBsYWNlbWVudDoiKHN0cmluZ3xmdW5jdGlvbikiLG9mZnNldDoiKG51bWJlcnxzdHJpbmcpIixjb250YWluZXI6IihzdHJpbmd8ZWxlbWVudHxib29sZWFuKSIsZmFsbGJhY2tQbGFjZW1lbnQ6IihzdHJpbmd8YXJyYXkpIixib3VuZGFyeToiKHN0cmluZ3xlbGVtZW50KSJ9KSxwbGFjZW1lbnQ6InRvcCIsb2Zmc2V0OjAsY29udGFpbmVyOiExLGZhbGxiYWNrUGxhY2VtZW50OiJmbGlwIixib3VuZGFyeToic2Nyb2xsUGFyZW50In0sd2U9Im91dCIsTmU9e0hJREU6ImhpZGUiK0VlLEhJRERFTjoiaGlkZGVuIitFZSxTSE9XOihEZT0ic2hvdyIpK0VlLFNIT1dOOiJzaG93biIrRWUsSU5TRVJURUQ6Imluc2VydGVkIitFZSxDTElDSzoiY2xpY2siK0VlLEZPQ1VTSU46ImZvY3VzaW4iK0VlLEZPQ1VTT1VUOiJmb2N1c291dCIrRWUsTU9VU0VFTlRFUjoibW91c2VlbnRlciIrRWUsTU9VU0VMRUFWRToibW91c2VsZWF2ZSIrRWV9LE9lPSJmYWRlIixrZT0ic2hvdyIsUGU9Ii50b29sdGlwLWlubmVyIixqZT0iLmFycm93IixIZT0iaG92ZXIiLExlPSJmb2N1cyIsUmU9ImNsaWNrIix4ZT0ibWFudWFsIixXZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGkodCxlKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiQm9vdHN0cmFwIHRvb2x0aXBzIHJlcXVpcmUgUG9wcGVyLmpzIChodHRwczovL3BvcHBlci5qcy5vcmcpIik7dGhpcy5faXNFbmFibGVkPSEwLHRoaXMuX3RpbWVvdXQ9MCx0aGlzLl9ob3ZlclN0YXRlPSIiLHRoaXMuX2FjdGl2ZVRyaWdnZXI9e30sdGhpcy5fcG9wcGVyPW51bGwsdGhpcy5lbGVtZW50PXQsdGhpcy5jb25maWc9dGhpcy5fZ2V0Q29uZmlnKGUpLHRoaXMudGlwPW51bGwsdGhpcy5fc2V0TGlzdGVuZXJzKCl9dmFyIHQ9aS5wcm90b3R5cGU7cmV0dXJuIHQuZW5hYmxlPWZ1bmN0aW9uKCl7dGhpcy5faXNFbmFibGVkPSEwfSx0LmRpc2FibGU9ZnVuY3Rpb24oKXt0aGlzLl9pc0VuYWJsZWQ9ITF9LHQudG9nZ2xlRW5hYmxlZD1mdW5jdGlvbigpe3RoaXMuX2lzRW5hYmxlZD0hdGhpcy5faXNFbmFibGVkfSx0LnRvZ2dsZT1mdW5jdGlvbih0KXtpZih0aGlzLl9pc0VuYWJsZWQpaWYodCl7dmFyIGU9dGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSxuPXBlKHQuY3VycmVudFRhcmdldCkuZGF0YShlKTtufHwobj1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih0LmN1cnJlbnRUYXJnZXQsdGhpcy5fZ2V0RGVsZWdhdGVDb25maWcoKSkscGUodC5jdXJyZW50VGFyZ2V0KS5kYXRhKGUsbikpLG4uX2FjdGl2ZVRyaWdnZXIuY2xpY2s9IW4uX2FjdGl2ZVRyaWdnZXIuY2xpY2ssbi5faXNXaXRoQWN0aXZlVHJpZ2dlcigpP24uX2VudGVyKG51bGwsbik6bi5fbGVhdmUobnVsbCxuKX1lbHNle2lmKHBlKHRoaXMuZ2V0VGlwRWxlbWVudCgpKS5oYXNDbGFzcyhrZSkpcmV0dXJuIHZvaWQgdGhpcy5fbGVhdmUobnVsbCx0aGlzKTt0aGlzLl9lbnRlcihudWxsLHRoaXMpfX0sdC5kaXNwb3NlPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpLHBlLnJlbW92ZURhdGEodGhpcy5lbGVtZW50LHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVkpLHBlKHRoaXMuZWxlbWVudCkub2ZmKHRoaXMuY29uc3RydWN0b3IuRVZFTlRfS0VZKSxwZSh0aGlzLmVsZW1lbnQpLmNsb3Nlc3QoIi5tb2RhbCIpLm9mZigiaGlkZS5icy5tb2RhbCIpLHRoaXMudGlwJiZwZSh0aGlzLnRpcCkucmVtb3ZlKCksdGhpcy5faXNFbmFibGVkPW51bGwsdGhpcy5fdGltZW91dD1udWxsLHRoaXMuX2hvdmVyU3RhdGU9bnVsbCwodGhpcy5fYWN0aXZlVHJpZ2dlcj1udWxsKSE9PXRoaXMuX3BvcHBlciYmdGhpcy5fcG9wcGVyLmRlc3Ryb3koKSx0aGlzLl9wb3BwZXI9bnVsbCx0aGlzLmVsZW1lbnQ9bnVsbCx0aGlzLmNvbmZpZz1udWxsLHRoaXMudGlwPW51bGx9LHQuc2hvdz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYoIm5vbmUiPT09cGUodGhpcy5lbGVtZW50KS5jc3MoImRpc3BsYXkiKSl0aHJvdyBuZXcgRXJyb3IoIlBsZWFzZSB1c2Ugc2hvdyBvbiB2aXNpYmxlIGVsZW1lbnRzIik7dmFyIHQ9cGUuRXZlbnQodGhpcy5jb25zdHJ1Y3Rvci5FdmVudC5TSE9XKTtpZih0aGlzLmlzV2l0aENvbnRlbnQoKSYmdGhpcy5faXNFbmFibGVkKXtwZSh0aGlzLmVsZW1lbnQpLnRyaWdnZXIodCk7dmFyIG49cGUuY29udGFpbnModGhpcy5lbGVtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LHRoaXMuZWxlbWVudCk7aWYodC5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8IW4pcmV0dXJuO3ZhciBpPXRoaXMuZ2V0VGlwRWxlbWVudCgpLHI9Rm4uZ2V0VUlEKHRoaXMuY29uc3RydWN0b3IuTkFNRSk7aS5zZXRBdHRyaWJ1dGUoImlkIixyKSx0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZGJ5IixyKSx0aGlzLnNldENvbnRlbnQoKSx0aGlzLmNvbmZpZy5hbmltYXRpb24mJnBlKGkpLmFkZENsYXNzKE9lKTt2YXIgbz0iZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5jb25maWcucGxhY2VtZW50P3RoaXMuY29uZmlnLnBsYWNlbWVudC5jYWxsKHRoaXMsaSx0aGlzLmVsZW1lbnQpOnRoaXMuY29uZmlnLnBsYWNlbWVudCxzPXRoaXMuX2dldEF0dGFjaG1lbnQobyk7dGhpcy5hZGRBdHRhY2htZW50Q2xhc3Mocyk7dmFyIGE9ITE9PT10aGlzLmNvbmZpZy5jb250YWluZXI/ZG9jdW1lbnQuYm9keTpwZShkb2N1bWVudCkuZmluZCh0aGlzLmNvbmZpZy5jb250YWluZXIpO3BlKGkpLmRhdGEodGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSx0aGlzKSxwZS5jb250YWlucyh0aGlzLmVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsdGhpcy50aXApfHxwZShpKS5hcHBlbmRUbyhhKSxwZSh0aGlzLmVsZW1lbnQpLnRyaWdnZXIodGhpcy5jb25zdHJ1Y3Rvci5FdmVudC5JTlNFUlRFRCksdGhpcy5fcG9wcGVyPW5ldyBoKHRoaXMuZWxlbWVudCxpLHtwbGFjZW1lbnQ6cyxtb2RpZmllcnM6e29mZnNldDp7b2Zmc2V0OnRoaXMuY29uZmlnLm9mZnNldH0sZmxpcDp7YmVoYXZpb3I6dGhpcy5jb25maWcuZmFsbGJhY2tQbGFjZW1lbnR9LGFycm93OntlbGVtZW50OmplfSxwcmV2ZW50T3ZlcmZsb3c6e2JvdW5kYXJpZXNFbGVtZW50OnRoaXMuY29uZmlnLmJvdW5kYXJ5fX0sb25DcmVhdGU6ZnVuY3Rpb24odCl7dC5vcmlnaW5hbFBsYWNlbWVudCE9PXQucGxhY2VtZW50JiZlLl9oYW5kbGVQb3BwZXJQbGFjZW1lbnRDaGFuZ2UodCl9LG9uVXBkYXRlOmZ1bmN0aW9uKHQpe2UuX2hhbmRsZVBvcHBlclBsYWNlbWVudENoYW5nZSh0KX19KSxwZShpKS5hZGRDbGFzcyhrZSksIm9udG91Y2hzdGFydCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQmJnBlKGRvY3VtZW50LmJvZHkpLmNoaWxkcmVuKCkub24oIm1vdXNlb3ZlciIsbnVsbCxwZS5ub29wKTt2YXIgbD1mdW5jdGlvbigpe2UuY29uZmlnLmFuaW1hdGlvbiYmZS5fZml4VHJhbnNpdGlvbigpO3ZhciB0PWUuX2hvdmVyU3RhdGU7ZS5faG92ZXJTdGF0ZT1udWxsLHBlKGUuZWxlbWVudCkudHJpZ2dlcihlLmNvbnN0cnVjdG9yLkV2ZW50LlNIT1dOKSx0PT09d2UmJmUuX2xlYXZlKG51bGwsZSl9O2lmKHBlKHRoaXMudGlwKS5oYXNDbGFzcyhPZSkpe3ZhciBjPUZuLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMudGlwKTtwZSh0aGlzLnRpcCkub25lKEZuLlRSQU5TSVRJT05fRU5ELGwpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGMpfWVsc2UgbCgpfX0sdC5oaWRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10aGlzLmdldFRpcEVsZW1lbnQoKSxpPXBlLkV2ZW50KHRoaXMuY29uc3RydWN0b3IuRXZlbnQuSElERSkscj1mdW5jdGlvbigpe2UuX2hvdmVyU3RhdGUhPT1EZSYmbi5wYXJlbnROb2RlJiZuLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobiksZS5fY2xlYW5UaXBDbGFzcygpLGUuZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtZGVzY3JpYmVkYnkiKSxwZShlLmVsZW1lbnQpLnRyaWdnZXIoZS5jb25zdHJ1Y3Rvci5FdmVudC5ISURERU4pLG51bGwhPT1lLl9wb3BwZXImJmUuX3BvcHBlci5kZXN0cm95KCksdCYmdCgpfTtpZihwZSh0aGlzLmVsZW1lbnQpLnRyaWdnZXIoaSksIWkuaXNEZWZhdWx0UHJldmVudGVkKCkpe2lmKHBlKG4pLnJlbW92ZUNsYXNzKGtlKSwib250b3VjaHN0YXJ0ImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmcGUoZG9jdW1lbnQuYm9keSkuY2hpbGRyZW4oKS5vZmYoIm1vdXNlb3ZlciIsbnVsbCxwZS5ub29wKSx0aGlzLl9hY3RpdmVUcmlnZ2VyW1JlXT0hMSx0aGlzLl9hY3RpdmVUcmlnZ2VyW0xlXT0hMSx0aGlzLl9hY3RpdmVUcmlnZ2VyW0hlXT0hMSxwZSh0aGlzLnRpcCkuaGFzQ2xhc3MoT2UpKXt2YXIgbz1Gbi5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudChuKTtwZShuKS5vbmUoRm4uVFJBTlNJVElPTl9FTkQscikuZW11bGF0ZVRyYW5zaXRpb25FbmQobyl9ZWxzZSByKCk7dGhpcy5faG92ZXJTdGF0ZT0iIn19LHQudXBkYXRlPWZ1bmN0aW9uKCl7bnVsbCE9PXRoaXMuX3BvcHBlciYmdGhpcy5fcG9wcGVyLnNjaGVkdWxlVXBkYXRlKCl9LHQuaXNXaXRoQ29udGVudD1mdW5jdGlvbigpe3JldHVybiBCb29sZWFuKHRoaXMuZ2V0VGl0bGUoKSl9LHQuYWRkQXR0YWNobWVudENsYXNzPWZ1bmN0aW9uKHQpe3BlKHRoaXMuZ2V0VGlwRWxlbWVudCgpKS5hZGRDbGFzcyhUZSsiLSIrdCl9LHQuZ2V0VGlwRWxlbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpcD10aGlzLnRpcHx8cGUodGhpcy5jb25maWcudGVtcGxhdGUpWzBdLHRoaXMudGlwfSx0LnNldENvbnRlbnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFRpcEVsZW1lbnQoKTt0aGlzLnNldEVsZW1lbnRDb250ZW50KHBlKHQucXVlcnlTZWxlY3RvckFsbChQZSkpLHRoaXMuZ2V0VGl0bGUoKSkscGUodCkucmVtb3ZlQ2xhc3MoT2UrIiAiK2tlKX0sdC5zZXRFbGVtZW50Q29udGVudD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuY29uZmlnLmh0bWw7Im9iamVjdCI9PXR5cGVvZiBlJiYoZS5ub2RlVHlwZXx8ZS5qcXVlcnkpP24/cGUoZSkucGFyZW50KCkuaXModCl8fHQuZW1wdHkoKS5hcHBlbmQoZSk6dC50ZXh0KHBlKGUpLnRleHQoKSk6dFtuPyJodG1sIjoidGV4dCJdKGUpfSx0LmdldFRpdGxlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS1vcmlnaW5hbC10aXRsZSIpO3JldHVybiB0fHwodD0iZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5jb25maWcudGl0bGU/dGhpcy5jb25maWcudGl0bGUuY2FsbCh0aGlzLmVsZW1lbnQpOnRoaXMuY29uZmlnLnRpdGxlKSx0fSx0Ll9nZXRBdHRhY2htZW50PWZ1bmN0aW9uKHQpe3JldHVybiBJZVt0LnRvVXBwZXJDYXNlKCldfSx0Ll9zZXRMaXN0ZW5lcnM9ZnVuY3Rpb24oKXt2YXIgaT10aGlzO3RoaXMuY29uZmlnLnRyaWdnZXIuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKCJjbGljayI9PT10KXBlKGkuZWxlbWVudCkub24oaS5jb25zdHJ1Y3Rvci5FdmVudC5DTElDSyxpLmNvbmZpZy5zZWxlY3RvcixmdW5jdGlvbih0KXtyZXR1cm4gaS50b2dnbGUodCl9KTtlbHNlIGlmKHQhPT14ZSl7dmFyIGU9dD09PUhlP2kuY29uc3RydWN0b3IuRXZlbnQuTU9VU0VFTlRFUjppLmNvbnN0cnVjdG9yLkV2ZW50LkZPQ1VTSU4sbj10PT09SGU/aS5jb25zdHJ1Y3Rvci5FdmVudC5NT1VTRUxFQVZFOmkuY29uc3RydWN0b3IuRXZlbnQuRk9DVVNPVVQ7cGUoaS5lbGVtZW50KS5vbihlLGkuY29uZmlnLnNlbGVjdG9yLGZ1bmN0aW9uKHQpe3JldHVybiBpLl9lbnRlcih0KX0pLm9uKG4saS5jb25maWcuc2VsZWN0b3IsZnVuY3Rpb24odCl7cmV0dXJuIGkuX2xlYXZlKHQpfSl9cGUoaS5lbGVtZW50KS5jbG9zZXN0KCIubW9kYWwiKS5vbigiaGlkZS5icy5tb2RhbCIsZnVuY3Rpb24oKXtyZXR1cm4gaS5oaWRlKCl9KX0pLHRoaXMuY29uZmlnLnNlbGVjdG9yP3RoaXMuY29uZmlnPWwoe30sdGhpcy5jb25maWcse3RyaWdnZXI6Im1hbnVhbCIsc2VsZWN0b3I6IiJ9KTp0aGlzLl9maXhUaXRsZSgpfSx0Ll9maXhUaXRsZT1mdW5jdGlvbigpe3ZhciB0PXR5cGVvZiB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsLXRpdGxlIik7KHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoInRpdGxlIil8fCJzdHJpbmciIT09dCkmJih0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsLXRpdGxlIix0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpfHwiIiksdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgidGl0bGUiLCIiKSl9LHQuX2VudGVyPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWTsoZT1lfHxwZSh0LmN1cnJlbnRUYXJnZXQpLmRhdGEobikpfHwoZT1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih0LmN1cnJlbnRUYXJnZXQsdGhpcy5fZ2V0RGVsZWdhdGVDb25maWcoKSkscGUodC5jdXJyZW50VGFyZ2V0KS5kYXRhKG4sZSkpLHQmJihlLl9hY3RpdmVUcmlnZ2VyWyJmb2N1c2luIj09PXQudHlwZT9MZTpIZV09ITApLHBlKGUuZ2V0VGlwRWxlbWVudCgpKS5oYXNDbGFzcyhrZSl8fGUuX2hvdmVyU3RhdGU9PT1EZT9lLl9ob3ZlclN0YXRlPURlOihjbGVhclRpbWVvdXQoZS5fdGltZW91dCksZS5faG92ZXJTdGF0ZT1EZSxlLmNvbmZpZy5kZWxheSYmZS5jb25maWcuZGVsYXkuc2hvdz9lLl90aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLl9ob3ZlclN0YXRlPT09RGUmJmUuc2hvdygpfSxlLmNvbmZpZy5kZWxheS5zaG93KTplLnNob3coKSl9LHQuX2xlYXZlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWTsoZT1lfHxwZSh0LmN1cnJlbnRUYXJnZXQpLmRhdGEobikpfHwoZT1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih0LmN1cnJlbnRUYXJnZXQsdGhpcy5fZ2V0RGVsZWdhdGVDb25maWcoKSkscGUodC5jdXJyZW50VGFyZ2V0KS5kYXRhKG4sZSkpLHQmJihlLl9hY3RpdmVUcmlnZ2VyWyJmb2N1c291dCI9PT10LnR5cGU/TGU6SGVdPSExKSxlLl9pc1dpdGhBY3RpdmVUcmlnZ2VyKCl8fChjbGVhclRpbWVvdXQoZS5fdGltZW91dCksZS5faG92ZXJTdGF0ZT13ZSxlLmNvbmZpZy5kZWxheSYmZS5jb25maWcuZGVsYXkuaGlkZT9lLl90aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLl9ob3ZlclN0YXRlPT09d2UmJmUuaGlkZSgpfSxlLmNvbmZpZy5kZWxheS5oaWRlKTplLmhpZGUoKSl9LHQuX2lzV2l0aEFjdGl2ZVRyaWdnZXI9ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5fYWN0aXZlVHJpZ2dlcilpZih0aGlzLl9hY3RpdmVUcmlnZ2VyW3RdKXJldHVybiEwO3JldHVybiExfSx0Ll9nZXRDb25maWc9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZih0PWwoe30sdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0LHBlKHRoaXMuZWxlbWVudCkuZGF0YSgpLCJvYmplY3QiPT10eXBlb2YgdCYmdD90Ont9KSkuZGVsYXkmJih0LmRlbGF5PXtzaG93OnQuZGVsYXksaGlkZTp0LmRlbGF5fSksIm51bWJlciI9PXR5cGVvZiB0LnRpdGxlJiYodC50aXRsZT10LnRpdGxlLnRvU3RyaW5nKCkpLCJudW1iZXIiPT10eXBlb2YgdC5jb250ZW50JiYodC5jb250ZW50PXQuY29udGVudC50b1N0cmluZygpKSxGbi50eXBlQ2hlY2tDb25maWcodmUsdCx0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRUeXBlKSx0fSx0Ll9nZXREZWxlZ2F0ZUNvbmZpZz1mdW5jdGlvbigpe3ZhciB0PXt9O2lmKHRoaXMuY29uZmlnKWZvcih2YXIgZSBpbiB0aGlzLmNvbmZpZyl0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRbZV0hPT10aGlzLmNvbmZpZ1tlXSYmKHRbZV09dGhpcy5jb25maWdbZV0pO3JldHVybiB0fSx0Ll9jbGVhblRpcENsYXNzPWZ1bmN0aW9uKCl7dmFyIHQ9cGUodGhpcy5nZXRUaXBFbGVtZW50KCkpLGU9dC5hdHRyKCJjbGFzcyIpLm1hdGNoKGJlKTtudWxsIT09ZSYmZS5sZW5ndGgmJnQucmVtb3ZlQ2xhc3MoZS5qb2luKCIiKSl9LHQuX2hhbmRsZVBvcHBlclBsYWNlbWVudENoYW5nZT1mdW5jdGlvbih0KXt2YXIgZT10Lmluc3RhbmNlO3RoaXMudGlwPWUucG9wcGVyLHRoaXMuX2NsZWFuVGlwQ2xhc3MoKSx0aGlzLmFkZEF0dGFjaG1lbnRDbGFzcyh0aGlzLl9nZXRBdHRhY2htZW50KHQucGxhY2VtZW50KSl9LHQuX2ZpeFRyYW5zaXRpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFRpcEVsZW1lbnQoKSxlPXRoaXMuY29uZmlnLmFuaW1hdGlvbjtudWxsPT09dC5nZXRBdHRyaWJ1dGUoIngtcGxhY2VtZW50IikmJihwZSh0KS5yZW1vdmVDbGFzcyhPZSksdGhpcy5jb25maWcuYW5pbWF0aW9uPSExLHRoaXMuaGlkZSgpLHRoaXMuc2hvdygpLHRoaXMuY29uZmlnLmFuaW1hdGlvbj1lKX0saS5falF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1wZSh0aGlzKS5kYXRhKHllKSxlPSJvYmplY3QiPT10eXBlb2YgbiYmbjtpZigodHx8IS9kaXNwb3NlfGhpZGUvLnRlc3QobikpJiYodHx8KHQ9bmV3IGkodGhpcyxlKSxwZSh0aGlzKS5kYXRhKHllLHQpKSwic3RyaW5nIj09dHlwZW9mIG4pKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIHRbbl0pdGhyb3cgbmV3IFR5cGVFcnJvcignTm8gbWV0aG9kIG5hbWVkICInK24rJyInKTt0W25dKCl9fSl9LHMoaSxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNC4xLjMifX0se2tleToiRGVmYXVsdCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEFlfX0se2tleToiTkFNRSIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHZlfX0se2tleToiREFUQV9LRVkiLGdldDpmdW5jdGlvbigpe3JldHVybiB5ZX19LHtrZXk6IkV2ZW50IixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gTmV9fSx7a2V5OiJFVkVOVF9LRVkiLGdldDpmdW5jdGlvbigpe3JldHVybiBFZX19LHtrZXk6IkRlZmF1bHRUeXBlIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gU2V9fV0pLGl9KCkscGUuZm5bdmVdPVdlLl9qUXVlcnlJbnRlcmZhY2UscGUuZm5bdmVdLkNvbnN0cnVjdG9yPVdlLHBlLmZuW3ZlXS5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHBlLmZuW3ZlXT1DZSxXZS5falF1ZXJ5SW50ZXJmYWNlfSxXZSksSm49KHFlPSJwb3BvdmVyIixLZT0iLiIrKEZlPSJicy5wb3BvdmVyIiksTWU9KFVlPWUpLmZuW3FlXSxRZT0iYnMtcG9wb3ZlciIsQmU9bmV3IFJlZ0V4cCgiKF58XFxzKSIrUWUrIlxcUysiLCJnIiksVmU9bCh7fSx6bi5EZWZhdWx0LHtwbGFjZW1lbnQ6InJpZ2h0Iix0cmlnZ2VyOiJjbGljayIsY29udGVudDoiIix0ZW1wbGF0ZTonPGRpdiBjbGFzcz0icG9wb3ZlciIgcm9sZT0idG9vbHRpcCI+PGRpdiBjbGFzcz0iYXJyb3ciPjwvZGl2PjxoMyBjbGFzcz0icG9wb3Zlci1oZWFkZXIiPjwvaDM+PGRpdiBjbGFzcz0icG9wb3Zlci1ib2R5Ij48L2Rpdj48L2Rpdj4nfSksWWU9bCh7fSx6bi5EZWZhdWx0VHlwZSx7Y29udGVudDoiKHN0cmluZ3xlbGVtZW50fGZ1bmN0aW9uKSJ9KSx6ZT0iZmFkZSIsWmU9Ii5wb3BvdmVyLWhlYWRlciIsR2U9Ii5wb3BvdmVyLWJvZHkiLCRlPXtISURFOiJoaWRlIitLZSxISURERU46ImhpZGRlbiIrS2UsU0hPVzooSmU9InNob3ciKStLZSxTSE9XTjoic2hvd24iK0tlLElOU0VSVEVEOiJpbnNlcnRlZCIrS2UsQ0xJQ0s6ImNsaWNrIitLZSxGT0NVU0lOOiJmb2N1c2luIitLZSxGT0NVU09VVDoiZm9jdXNvdXQiK0tlLE1PVVNFRU5URVI6Im1vdXNlZW50ZXIiK0tlLE1PVVNFTEVBVkU6Im1vdXNlbGVhdmUiK0tlfSxYZT1mdW5jdGlvbih0KXt2YXIgZSxuO2Z1bmN0aW9uIGkoKXtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9bj10LChlPWkpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSwoZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSkuX19wcm90b19fPW47dmFyIHI9aS5wcm90b3R5cGU7cmV0dXJuIHIuaXNXaXRoQ29udGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFRpdGxlKCl8fHRoaXMuX2dldENvbnRlbnQoKX0sci5hZGRBdHRhY2htZW50Q2xhc3M9ZnVuY3Rpb24odCl7VWUodGhpcy5nZXRUaXBFbGVtZW50KCkpLmFkZENsYXNzKFFlKyItIit0KX0sci5nZXRUaXBFbGVtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGlwPXRoaXMudGlwfHxVZSh0aGlzLmNvbmZpZy50ZW1wbGF0ZSlbMF0sdGhpcy50aXB9LHIuc2V0Q29udGVudD1mdW5jdGlvbigpe3ZhciB0PVVlKHRoaXMuZ2V0VGlwRWxlbWVudCgpKTt0aGlzLnNldEVsZW1lbnRDb250ZW50KHQuZmluZChaZSksdGhpcy5nZXRUaXRsZSgpKTt2YXIgZT10aGlzLl9nZXRDb250ZW50KCk7ImZ1bmN0aW9uIj09dHlwZW9mIGUmJihlPWUuY2FsbCh0aGlzLmVsZW1lbnQpKSx0aGlzLnNldEVsZW1lbnRDb250ZW50KHQuZmluZChHZSksZSksdC5yZW1vdmVDbGFzcyh6ZSsiICIrSmUpfSxyLl9nZXRDb250ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoImRhdGEtY29udGVudCIpfHx0aGlzLmNvbmZpZy5jb250ZW50fSxyLl9jbGVhblRpcENsYXNzPWZ1bmN0aW9uKCl7dmFyIHQ9VWUodGhpcy5nZXRUaXBFbGVtZW50KCkpLGU9dC5hdHRyKCJjbGFzcyIpLm1hdGNoKEJlKTtudWxsIT09ZSYmMDxlLmxlbmd0aCYmdC5yZW1vdmVDbGFzcyhlLmpvaW4oIiIpKX0saS5falF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1VZSh0aGlzKS5kYXRhKEZlKSxlPSJvYmplY3QiPT10eXBlb2Ygbj9uOm51bGw7aWYoKHR8fCEvZGVzdHJveXxoaWRlLy50ZXN0KG4pKSYmKHR8fCh0PW5ldyBpKHRoaXMsZSksVWUodGhpcykuZGF0YShGZSx0KSksInN0cmluZyI9PXR5cGVvZiBuKSl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiB0W25dKXRocm93IG5ldyBUeXBlRXJyb3IoJ05vIG1ldGhvZCBuYW1lZCAiJytuKyciJyk7dFtuXSgpfX0pfSxzKGksbnVsbCxbe2tleToiVkVSU0lPTiIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIjQuMS4zIn19LHtrZXk6IkRlZmF1bHQiLGdldDpmdW5jdGlvbigpe3JldHVybiBWZX19LHtrZXk6Ik5BTUUiLGdldDpmdW5jdGlvbigpe3JldHVybiBxZX19LHtrZXk6IkRBVEFfS0VZIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gRmV9fSx7a2V5OiJFdmVudCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuICRlfX0se2tleToiRVZFTlRfS0VZIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gS2V9fSx7a2V5OiJEZWZhdWx0VHlwZSIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFllfX1dKSxpfSh6biksVWUuZm5bcWVdPVhlLl9qUXVlcnlJbnRlcmZhY2UsVWUuZm5bcWVdLkNvbnN0cnVjdG9yPVhlLFVlLmZuW3FlXS5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIFVlLmZuW3FlXT1NZSxYZS5falF1ZXJ5SW50ZXJmYWNlfSxYZSksWm49KGVuPSJzY3JvbGxzcHkiLHJuPSIuIisobm49ImJzLnNjcm9sbHNweSIpLG9uPSh0bj1lKS5mbltlbl0sc249e29mZnNldDoxMCxtZXRob2Q6ImF1dG8iLHRhcmdldDoiIn0sYW49e29mZnNldDoibnVtYmVyIixtZXRob2Q6InN0cmluZyIsdGFyZ2V0OiIoc3RyaW5nfGVsZW1lbnQpIn0sbG49e0FDVElWQVRFOiJhY3RpdmF0ZSIrcm4sU0NST0xMOiJzY3JvbGwiK3JuLExPQURfREFUQV9BUEk6ImxvYWQiK3JuKyIuZGF0YS1hcGkifSxjbj0iZHJvcGRvd24taXRlbSIsaG49ImFjdGl2ZSIsdW49J1tkYXRhLXNweT0ic2Nyb2xsIl0nLGZuPSIuYWN0aXZlIixkbj0iLm5hdiwgLmxpc3QtZ3JvdXAiLGduPSIubmF2LWxpbmsiLF9uPSIubmF2LWl0ZW0iLG1uPSIubGlzdC1ncm91cC1pdGVtIixwbj0iLmRyb3Bkb3duIix2bj0iLmRyb3Bkb3duLWl0ZW0iLHluPSIuZHJvcGRvd24tdG9nZ2xlIixFbj0ib2Zmc2V0IixDbj0icG9zaXRpb24iLFRuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih0LGUpe3ZhciBuPXRoaXM7dGhpcy5fZWxlbWVudD10LHRoaXMuX3Njcm9sbEVsZW1lbnQ9IkJPRFkiPT09dC50YWdOYW1lP3dpbmRvdzp0LHRoaXMuX2NvbmZpZz10aGlzLl9nZXRDb25maWcoZSksdGhpcy5fc2VsZWN0b3I9dGhpcy5fY29uZmlnLnRhcmdldCsiICIrZ24rIiwiK3RoaXMuX2NvbmZpZy50YXJnZXQrIiAiK21uKyIsIit0aGlzLl9jb25maWcudGFyZ2V0KyIgIit2bix0aGlzLl9vZmZzZXRzPVtdLHRoaXMuX3RhcmdldHM9W10sdGhpcy5fYWN0aXZlVGFyZ2V0PW51bGwsdGhpcy5fc2Nyb2xsSGVpZ2h0PTAsdG4odGhpcy5fc2Nyb2xsRWxlbWVudCkub24obG4uU0NST0xMLGZ1bmN0aW9uKHQpe3JldHVybiBuLl9wcm9jZXNzKHQpfSksdGhpcy5yZWZyZXNoKCksdGhpcy5fcHJvY2VzcygpfXZhciB0PW4ucHJvdG90eXBlO3JldHVybiB0LnJlZnJlc2g9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5fc2Nyb2xsRWxlbWVudD09PXRoaXMuX3Njcm9sbEVsZW1lbnQud2luZG93P0VuOkNuLHI9ImF1dG8iPT09dGhpcy5fY29uZmlnLm1ldGhvZD90OnRoaXMuX2NvbmZpZy5tZXRob2Qsbz1yPT09Q24/dGhpcy5fZ2V0U2Nyb2xsVG9wKCk6MDt0aGlzLl9vZmZzZXRzPVtdLHRoaXMuX3RhcmdldHM9W10sdGhpcy5fc2Nyb2xsSGVpZ2h0PXRoaXMuX2dldFNjcm9sbEhlaWdodCgpLFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLl9zZWxlY3RvcikpLm1hcChmdW5jdGlvbih0KXt2YXIgZSxuPUZuLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQodCk7aWYobiYmKGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihuKSksZSl7dmFyIGk9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihpLndpZHRofHxpLmhlaWdodClyZXR1cm5bdG4oZSlbcl0oKS50b3ArbyxuXX1yZXR1cm4gbnVsbH0pLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdH0pLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXS1lWzBdfSkuZm9yRWFjaChmdW5jdGlvbih0KXtlLl9vZmZzZXRzLnB1c2godFswXSksZS5fdGFyZ2V0cy5wdXNoKHRbMV0pfSl9LHQuZGlzcG9zZT1mdW5jdGlvbigpe3RuLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCxubiksdG4odGhpcy5fc2Nyb2xsRWxlbWVudCkub2ZmKHJuKSx0aGlzLl9lbGVtZW50PW51bGwsdGhpcy5fc2Nyb2xsRWxlbWVudD1udWxsLHRoaXMuX2NvbmZpZz1udWxsLHRoaXMuX3NlbGVjdG9yPW51bGwsdGhpcy5fb2Zmc2V0cz1udWxsLHRoaXMuX3RhcmdldHM9bnVsbCx0aGlzLl9hY3RpdmVUYXJnZXQ9bnVsbCx0aGlzLl9zY3JvbGxIZWlnaHQ9bnVsbH0sdC5fZ2V0Q29uZmlnPWZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciIT10eXBlb2YodD1sKHt9LHNuLCJvYmplY3QiPT10eXBlb2YgdCYmdD90Ont9KSkudGFyZ2V0KXt2YXIgZT10bih0LnRhcmdldCkuYXR0cigiaWQiKTtlfHwoZT1Gbi5nZXRVSUQoZW4pLHRuKHQudGFyZ2V0KS5hdHRyKCJpZCIsZSkpLHQudGFyZ2V0PSIjIitlfXJldHVybiBGbi50eXBlQ2hlY2tDb25maWcoZW4sdCxhbiksdH0sdC5fZ2V0U2Nyb2xsVG9wPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Njcm9sbEVsZW1lbnQ9PT13aW5kb3c/dGhpcy5fc2Nyb2xsRWxlbWVudC5wYWdlWU9mZnNldDp0aGlzLl9zY3JvbGxFbGVtZW50LnNjcm9sbFRvcH0sdC5fZ2V0U2Nyb2xsSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Njcm9sbEVsZW1lbnQuc2Nyb2xsSGVpZ2h0fHxNYXRoLm1heChkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0KX0sdC5fZ2V0T2Zmc2V0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Njcm9sbEVsZW1lbnQ9PT13aW5kb3c/d2luZG93LmlubmVySGVpZ2h0OnRoaXMuX3Njcm9sbEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0fSx0Ll9wcm9jZXNzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZ2V0U2Nyb2xsVG9wKCkrdGhpcy5fY29uZmlnLm9mZnNldCxlPXRoaXMuX2dldFNjcm9sbEhlaWdodCgpLG49dGhpcy5fY29uZmlnLm9mZnNldCtlLXRoaXMuX2dldE9mZnNldEhlaWdodCgpO2lmKHRoaXMuX3Njcm9sbEhlaWdodCE9PWUmJnRoaXMucmVmcmVzaCgpLG48PXQpe3ZhciBpPXRoaXMuX3RhcmdldHNbdGhpcy5fdGFyZ2V0cy5sZW5ndGgtMV07dGhpcy5fYWN0aXZlVGFyZ2V0IT09aSYmdGhpcy5fYWN0aXZhdGUoaSl9ZWxzZXtpZih0aGlzLl9hY3RpdmVUYXJnZXQmJnQ8dGhpcy5fb2Zmc2V0c1swXSYmMDx0aGlzLl9vZmZzZXRzWzBdKXJldHVybiB0aGlzLl9hY3RpdmVUYXJnZXQ9bnVsbCx2b2lkIHRoaXMuX2NsZWFyKCk7Zm9yKHZhciByPXRoaXMuX29mZnNldHMubGVuZ3RoO3ItLTspe3RoaXMuX2FjdGl2ZVRhcmdldCE9PXRoaXMuX3RhcmdldHNbcl0mJnQ+PXRoaXMuX29mZnNldHNbcl0mJigidW5kZWZpbmVkIj09dHlwZW9mIHRoaXMuX29mZnNldHNbcisxXXx8dDx0aGlzLl9vZmZzZXRzW3IrMV0pJiZ0aGlzLl9hY3RpdmF0ZSh0aGlzLl90YXJnZXRzW3JdKX19fSx0Ll9hY3RpdmF0ZT1mdW5jdGlvbihlKXt0aGlzLl9hY3RpdmVUYXJnZXQ9ZSx0aGlzLl9jbGVhcigpO3ZhciB0PXRoaXMuX3NlbGVjdG9yLnNwbGl0KCIsIik7dD10Lm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdCsnW2RhdGEtdGFyZ2V0PSInK2UrJyJdLCcrdCsnW2hyZWY9IicrZSsnIl0nfSk7dmFyIG49dG4oW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHQuam9pbigiLCIpKSkpO24uaGFzQ2xhc3MoY24pPyhuLmNsb3Nlc3QocG4pLmZpbmQoeW4pLmFkZENsYXNzKGhuKSxuLmFkZENsYXNzKGhuKSk6KG4uYWRkQ2xhc3MoaG4pLG4ucGFyZW50cyhkbikucHJldihnbisiLCAiK21uKS5hZGRDbGFzcyhobiksbi5wYXJlbnRzKGRuKS5wcmV2KF9uKS5jaGlsZHJlbihnbikuYWRkQ2xhc3MoaG4pKSx0bih0aGlzLl9zY3JvbGxFbGVtZW50KS50cmlnZ2VyKGxuLkFDVElWQVRFLHtyZWxhdGVkVGFyZ2V0OmV9KX0sdC5fY2xlYXI9ZnVuY3Rpb24oKXt2YXIgdD1bXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5fc2VsZWN0b3IpKTt0bih0KS5maWx0ZXIoZm4pLnJlbW92ZUNsYXNzKGhuKX0sbi5falF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD10bih0aGlzKS5kYXRhKG5uKTtpZih0fHwodD1uZXcgbih0aGlzLCJvYmplY3QiPT10eXBlb2YgZSYmZSksdG4odGhpcykuZGF0YShubix0KSksInN0cmluZyI9PXR5cGVvZiBlKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIHRbZV0pdGhyb3cgbmV3IFR5cGVFcnJvcignTm8gbWV0aG9kIG5hbWVkICInK2UrJyInKTt0W2VdKCl9fSl9LHMobixudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNC4xLjMifX0se2tleToiRGVmYXVsdCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHNufX1dKSxufSgpLHRuKHdpbmRvdykub24obG4uTE9BRF9EQVRBX0FQSSxmdW5jdGlvbigpe2Zvcih2YXIgdD1bXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodW4pKSxlPXQubGVuZ3RoO2UtLTspe3ZhciBuPXRuKHRbZV0pO1RuLl9qUXVlcnlJbnRlcmZhY2UuY2FsbChuLG4uZGF0YSgpKX19KSx0bi5mbltlbl09VG4uX2pRdWVyeUludGVyZmFjZSx0bi5mbltlbl0uQ29uc3RydWN0b3I9VG4sdG4uZm5bZW5dLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdG4uZm5bZW5dPW9uLFRuLl9qUXVlcnlJbnRlcmZhY2V9LFRuKSxHbj0oSW49Ii4iKyhTbj0iYnMudGFiIiksQW49KGJuPWUpLmZuLnRhYixEbj17SElERToiaGlkZSIrSW4sSElEREVOOiJoaWRkZW4iK0luLFNIT1c6InNob3ciK0luLFNIT1dOOiJzaG93biIrSW4sQ0xJQ0tfREFUQV9BUEk6ImNsaWNrIitJbisiLmRhdGEtYXBpIn0sd249ImRyb3Bkb3duLW1lbnUiLE5uPSJhY3RpdmUiLE9uPSJkaXNhYmxlZCIsa249ImZhZGUiLFBuPSJzaG93Iixqbj0iLmRyb3Bkb3duIixIbj0iLm5hdiwgLmxpc3QtZ3JvdXAiLExuPSIuYWN0aXZlIixSbj0iPiBsaSA+IC5hY3RpdmUiLHhuPSdbZGF0YS10b2dnbGU9InRhYiJdLCBbZGF0YS10b2dnbGU9InBpbGwiXSwgW2RhdGEtdG9nZ2xlPSJsaXN0Il0nLFduPSIuZHJvcGRvd24tdG9nZ2xlIixVbj0iPiAuZHJvcGRvd24tbWVudSAuYWN0aXZlIixxbj1mdW5jdGlvbigpe2Z1bmN0aW9uIGkodCl7dGhpcy5fZWxlbWVudD10fXZhciB0PWkucHJvdG90eXBlO3JldHVybiB0LnNob3c9ZnVuY3Rpb24oKXt2YXIgbj10aGlzO2lmKCEodGhpcy5fZWxlbWVudC5wYXJlbnROb2RlJiZ0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmYm4odGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoTm4pfHxibih0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhPbikpKXt2YXIgdCxpLGU9Ym4odGhpcy5fZWxlbWVudCkuY2xvc2VzdChIbilbMF0scj1Gbi5nZXRTZWxlY3RvckZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpO2lmKGUpe3ZhciBvPSJVTCI9PT1lLm5vZGVOYW1lP1JuOkxuO2k9KGk9Ym4ubWFrZUFycmF5KGJuKGUpLmZpbmQobykpKVtpLmxlbmd0aC0xXX12YXIgcz1ibi5FdmVudChEbi5ISURFLHtyZWxhdGVkVGFyZ2V0OnRoaXMuX2VsZW1lbnR9KSxhPWJuLkV2ZW50KERuLlNIT1cse3JlbGF0ZWRUYXJnZXQ6aX0pO2lmKGkmJmJuKGkpLnRyaWdnZXIocyksYm4odGhpcy5fZWxlbWVudCkudHJpZ2dlcihhKSwhYS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmIXMuaXNEZWZhdWx0UHJldmVudGVkKCkpe3ImJih0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocikpLHRoaXMuX2FjdGl2YXRlKHRoaXMuX2VsZW1lbnQsZSk7dmFyIGw9ZnVuY3Rpb24oKXt2YXIgdD1ibi5FdmVudChEbi5ISURERU4se3JlbGF0ZWRUYXJnZXQ6bi5fZWxlbWVudH0pLGU9Ym4uRXZlbnQoRG4uU0hPV04se3JlbGF0ZWRUYXJnZXQ6aX0pO2JuKGkpLnRyaWdnZXIodCksYm4obi5fZWxlbWVudCkudHJpZ2dlcihlKX07dD90aGlzLl9hY3RpdmF0ZSh0LHQucGFyZW50Tm9kZSxsKTpsKCl9fX0sdC5kaXNwb3NlPWZ1bmN0aW9uKCl7Ym4ucmVtb3ZlRGF0YSh0aGlzLl9lbGVtZW50LFNuKSx0aGlzLl9lbGVtZW50PW51bGx9LHQuX2FjdGl2YXRlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLHI9KCJVTCI9PT1lLm5vZGVOYW1lP2JuKGUpLmZpbmQoUm4pOmJuKGUpLmNoaWxkcmVuKExuKSlbMF0sbz1uJiZyJiZibihyKS5oYXNDbGFzcyhrbikscz1mdW5jdGlvbigpe3JldHVybiBpLl90cmFuc2l0aW9uQ29tcGxldGUodCxyLG4pfTtpZihyJiZvKXt2YXIgYT1Gbi5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudChyKTtibihyKS5vbmUoRm4uVFJBTlNJVElPTl9FTkQscykuZW11bGF0ZVRyYW5zaXRpb25FbmQoYSl9ZWxzZSBzKCl9LHQuX3RyYW5zaXRpb25Db21wbGV0ZT1mdW5jdGlvbih0LGUsbil7aWYoZSl7Ym4oZSkucmVtb3ZlQ2xhc3MoUG4rIiAiK05uKTt2YXIgaT1ibihlLnBhcmVudE5vZGUpLmZpbmQoVW4pWzBdO2kmJmJuKGkpLnJlbW92ZUNsYXNzKE5uKSwidGFiIj09PWUuZ2V0QXR0cmlidXRlKCJyb2xlIikmJmUuc2V0QXR0cmlidXRlKCJhcmlhLXNlbGVjdGVkIiwhMSl9aWYoYm4odCkuYWRkQ2xhc3MoTm4pLCJ0YWIiPT09dC5nZXRBdHRyaWJ1dGUoInJvbGUiKSYmdC5zZXRBdHRyaWJ1dGUoImFyaWEtc2VsZWN0ZWQiLCEwKSxGbi5yZWZsb3codCksYm4odCkuYWRkQ2xhc3MoUG4pLHQucGFyZW50Tm9kZSYmYm4odC5wYXJlbnROb2RlKS5oYXNDbGFzcyh3bikpe3ZhciByPWJuKHQpLmNsb3Nlc3Qoam4pWzBdO2lmKHIpe3ZhciBvPVtdLnNsaWNlLmNhbGwoci5xdWVyeVNlbGVjdG9yQWxsKFduKSk7Ym4obykuYWRkQ2xhc3MoTm4pfXQuc2V0QXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIiwhMCl9biYmbigpfSxpLl9qUXVlcnlJbnRlcmZhY2U9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PWJuKHRoaXMpLGU9dC5kYXRhKFNuKTtpZihlfHwoZT1uZXcgaSh0aGlzKSx0LmRhdGEoU24sZSkpLCJzdHJpbmciPT10eXBlb2Ygbil7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBlW25dKXRocm93IG5ldyBUeXBlRXJyb3IoJ05vIG1ldGhvZCBuYW1lZCAiJytuKyciJyk7ZVtuXSgpfX0pfSxzKGksbnVsbCxbe2tleToiVkVSU0lPTiIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIjQuMS4zIn19XSksaX0oKSxibihkb2N1bWVudCkub24oRG4uQ0xJQ0tfREFUQV9BUEkseG4sZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHFuLl9qUXVlcnlJbnRlcmZhY2UuY2FsbChibih0aGlzKSwic2hvdyIpfSksYm4uZm4udGFiPXFuLl9qUXVlcnlJbnRlcmZhY2UsYm4uZm4udGFiLkNvbnN0cnVjdG9yPXFuLGJuLmZuLnRhYi5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGJuLmZuLnRhYj1Bbixxbi5falF1ZXJ5SW50ZXJmYWNlfSxxbik7IWZ1bmN0aW9uKHQpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJCb290c3RyYXAncyBKYXZhU2NyaXB0IHJlcXVpcmVzIGpRdWVyeS4galF1ZXJ5IG11c3QgYmUgaW5jbHVkZWQgYmVmb3JlIEJvb3RzdHJhcCdzIEphdmFTY3JpcHQuIik7dmFyIGU9dC5mbi5qcXVlcnkuc3BsaXQoIiAiKVswXS5zcGxpdCgiLiIpO2lmKGVbMF08MiYmZVsxXTw5fHwxPT09ZVswXSYmOT09PWVbMV0mJmVbMl08MXx8NDw9ZVswXSl0aHJvdyBuZXcgRXJyb3IoIkJvb3RzdHJhcCdzIEphdmFTY3JpcHQgcmVxdWlyZXMgYXQgbGVhc3QgalF1ZXJ5IHYxLjkuMSBidXQgbGVzcyB0aGFuIHY0LjAuMCIpfShlKSx0LlV0aWw9Rm4sdC5BbGVydD1Lbix0LkJ1dHRvbj1Nbix0LkNhcm91c2VsPVFuLHQuQ29sbGFwc2U9Qm4sdC5Ecm9wZG93bj1Wbix0Lk1vZGFsPVluLHQuUG9wb3Zlcj1Kbix0LlNjcm9sbHNweT1abix0LlRhYj1Hbix0LlRvb2x0aXA9em4sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfSk7DQovLyMgc291cmNlTWFwcGluZ1VSTD1ib290c3RyYXAubWluLmpzLm1hcAkJ"></script> <div id="nav-menu" class="container all-height-fcsi-header-height position-fixed right-0 left-0 z-index-1"><div class="row h-100 all-width-outer-horizontal-bounds m-auto"><div class="col pt-0 h-100 all-width-fcsi-header-logo d-flex align-items-center"> <a href="https://fletchercsi.com" class="nav-menu-link"><div class="row fletcher-logo h-100"><div class="col fletcher-icon all-width-fit-content"> <img src="https://fletchercsi.com/wp-content/uploads/2023/03/FletcherCSI_Logo-Mark_White.png" alt="Fletcher/CSI - Global Strategy Consulting Firm" class="logo-file" /></div><div class="col fletcher-branding"><div class="row h-66"><div class="col h-100"> <span class="fletcher-name"> FLETCHER </span></div></div><div class="row h-33"><div class="col d-flex flex-column justify-content-end h-100"> <span class="fletcher-tagline"> COMPETITIVE. STRATEGIC. INSIGHT. </span></div></div></div></div> </a></div><div class="col"><div class="row h-33 justify-content-end portal-login-parent"><div class="col all-width-fit-content dropdown"><div class="row h-100"><div class="col all-width-fit-content nav-menu-item parent"> <a href="https://fcsiwinloss.com/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> LiveInsights<sup>tm</sup> Win/Loss Portal - <b>Login</b></div></div></div> </a></div></div></div></div><div class="row h-66 justify-content-end links-parent"><div class="col all-width-fit-content nav-menu-item parent"> <a href="https://fletchercsi.com/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Home</div></div></div> </a></div><div class="col all-width-fit-content nav-menu-item parent active"> <a href="https://fletchercsi.com/about/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> About</div></div></div> </a><div class="container all-width-fit-content sub-nav-menu"><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/about/#company">Company</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/about/#careers">Careers</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/about/#privacypolicy">Privacy Policy</a></div></div></div></div><div class="col all-width-fit-content nav-menu-item parent"> <a href="https://fletchercsi.com/industries/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Industries</div></div></div> </a><div class="container all-width-fit-content sub-nav-menu"><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/industries/financial-services/">Financial Services</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/industries/life-sciences/">Life Sciences</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/industries/technology/">Technology</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/industries/consumer-packaged-goods/">Consumer Packaged Goods</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/industries/industrial/">Industrial Services</a></div></div></div></div><div class="col all-width-fit-content nav-menu-item parent"> <a href="https://fletchercsi.com/services/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Services</div></div></div> </a><div class="container all-width-fit-content sub-nav-menu"><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/services/primary-research/">Primary Research</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/services/winloss-analysis/">Win/Loss Analysis</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/services/strategy-workshops/">Strategy Workshops</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/services/trade-show-intelligence/">Trade Show Intelligence</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/services/market-intelligence-platform/">Market Intelligence Platform</a></div></div></div></div><div class="col all-width-fit-content nav-menu-item parent"> <a href="https://fletchercsi.com/resources/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Resources</div></div></div> </a><div class="container all-width-fit-content sub-nav-menu"><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/resources/blogs/">Blogs</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/resources/webinars-and-videos/">Webinars and Videos</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/resources/white-papers-and-publications/">White Papers and Publications</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/resources/presentations/">Presentations</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/resources/ci-tips/">CI Tips</a></div></div></div></div><div class="col all-width-fit-content nav-menu-item parent"> <a href="https://fletchercsi.com/contact/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Contact Us</div></div></div> </a></div><div class="col all-width-fit-content align-items-center mobile-toggle-parent"> <button id="mobile-nav-menu-toggle" type="button" expanded="false"> <i class="fa fa-bars burger" aria-hidden="true"></i> <i class="fa fa-times x-icon" aria-hidden="true"></i> </button></div></div></div></div><div id="mobile-nav-menu" class="row"><div class="col"><div class="container"><div class="row mobile-nav-menu-item parent winloss-portal d-none"><div class="col"><div class="row parent-item"><div class="col"> <a href="https://fcsiwinloss.com/"><div class="container h-100"><div class="row h-100 align-items-center justify-content-end"><div class="col all-width-fit-content color-fcsi-primary-green"> LiveInsights<sup>tm</sup> Win/Loss Portal Login</div></div></div> </a></div></div></div></div><div class="row mobile-nav-menu-item parent"><div class="col"><div class="row parent-item"><div class="col"> <a href="https://fletchercsi.com/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Home</div></div></div> </a></div></div></div></div><div class="row mobile-nav-menu-item parent active"><div class="col"><div class="row parent-item"><div class="col"> <a href="https://fletchercsi.com/about/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> About</div></div></div> </a></div></div><div class="row sub-mobile-nav-menu"><div class="col"><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/about/#company">Company</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/about/#careers">Careers</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/about/#privacypolicy">Privacy Policy</a></div></div></div></div></div></div><div class="row mobile-nav-menu-item parent"><div class="col"><div class="row parent-item"><div class="col"> <a href="https://fletchercsi.com/industries/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Industries</div></div></div> </a></div></div><div class="row sub-mobile-nav-menu"><div class="col"><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/industries/financial-services/">Financial Services</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/industries/life-sciences/">Life Sciences</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/industries/technology/">Technology</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/industries/consumer-packaged-goods/">Consumer Packaged Goods</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/industries/industrial/">Industrial Services</a></div></div></div></div></div></div><div class="row mobile-nav-menu-item parent"><div class="col"><div class="row parent-item"><div class="col"> <a href="https://fletchercsi.com/services/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Services</div></div></div> </a></div></div><div class="row sub-mobile-nav-menu"><div class="col"><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/services/primary-research/">Primary Research</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/services/winloss-analysis/">Win/Loss Analysis</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/services/strategy-workshops/">Strategy Workshops</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/services/trade-show-intelligence/">Trade Show Intelligence</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/services/market-intelligence-platform/">Market Intelligence Platform</a></div></div></div></div></div></div><div class="row mobile-nav-menu-item parent"><div class="col"><div class="row parent-item"><div class="col"> <a href="https://fletchercsi.com/resources/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Resources</div></div></div> </a></div></div><div class="row sub-mobile-nav-menu"><div class="col"><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/resources/blogs/">Blogs</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/resources/webinars-and-videos/">Webinars and Videos</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/resources/white-papers-and-publications/">White Papers and Publications</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/resources/presentations/">Presentations</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/resources/ci-tips/">CI Tips</a></div></div></div></div></div></div><div class="row mobile-nav-menu-item parent"><div class="col"><div class="row parent-item"><div class="col"> <a href="https://fletchercsi.com/contact/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Contact Us</div></div></div> </a></div></div></div></div></div></div></div></div> <script defer src="data:text/javascript;base64,CgkJCWpRdWVyeShkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oJCkgewoJCQkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdiBIRUxQRVIgRlVOQ1RJT05TIHYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCQkJCWZ1bmN0aW9uIGdldFNjcm9sbFRvcCgpIHsKCQkJCQlyZXR1cm4gJCh3aW5kb3cpLnNjcm9sbFRvcCgpOwoJCQkJfQoKCQkJCWZ1bmN0aW9uIGdldFNjcm9sbFN0YXRlKHBhc3NlZF9zY3JvbGxfdG9wKSB7CgkJCQkJdmFyIG5ld19zY3JvbGxfc3RhdGUgPSAiIjsKCgkJCQkJaWYgKHBhc3NlZF9zY3JvbGxfdG9wID09IDApIHsKCQkJCQkJLy8gU2Nyb2xsZWQgdG8gdG9wIG9mIHBhZ2U6CgkJCQkJCW5ld19zY3JvbGxfc3RhdGUgPSAicGFnZXRvcCI7CgkJCQkJfSBlbHNlIGlmIChwYXNzZWRfc2Nyb2xsX3RvcCA8IDEyNSkgewoJCQkJCQkvLyBTY3JvbGxlZCBkb3duIGJ1dCBsZXNzIHRoYW4gMTI1IHB4OgoJCQkJCQluZXdfc2Nyb2xsX3N0YXRlID0gInNjcm9sbHVwIjsKCQkJCQl9IGVsc2UgaWYgKHdpbmRvdy5jdXJyZW50X3Njcm9sbF90b3AgPiBwYXNzZWRfc2Nyb2xsX3RvcCkgewoJCQkJCQkvLyBTY3JvbGxlZCB1cDoKCQkJCQkJbmV3X3Njcm9sbF9zdGF0ZSA9ICJzY3JvbGx1cCI7CgkJCQkJfSBlbHNlIHsKCQkJCQkJLy8gU2Nyb2xsZWQgZG93bjoKCQkJCQkJbmV3X3Njcm9sbF9zdGF0ZSA9ICJzY3JvbGxkb3duIjsKCQkJCQl9CgoJCQkJCXJldHVybiBuZXdfc2Nyb2xsX3N0YXRlOwoJCQkJfQoKCQkJCWZ1bmN0aW9uIHVwZGF0ZVNjcm9sbFN0YXRlKHBhc3NlZF9uZXdfc2Nyb2xsX3N0YXRlKSB7CgkJCQkJd2luZG93LmN1cnJlbnRfc2Nyb2xsX3N0YXRlID0gcGFzc2VkX25ld19zY3JvbGxfc3RhdGU7CgoJCQkJCSRtYWluX25hdl9tZW51X2Rpdi5jc3MoJ29wYWNpdHknLCAnMS4wJyk7CgoJCQkJCSRtYWluX25hdl9tZW51X2Rpdi5hdHRyKCdzY3JvbGwtc3RhdGUnLCBwYXNzZWRfbmV3X3Njcm9sbF9zdGF0ZSk7CgkJCQl9CgoJCQkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogXiBIRUxQRVIgRlVOQ1RJT05TIF4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCgkJCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2IElOSVRJQUxJWkUgdiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoJCQkJLy8gVmFyaWFibGVzOgoJCQkJLy8gRE9NOgoJCQkJbGV0ICRtYWluX25hdl9tZW51X2RpdiA9ICQoZG9jdW1lbnQpLmZpbmQoJyNuYXYtbWVudScpOwoJCQkJbGV0ICRtb2JpbGVfbmF2X21lbnUgPSAkKGRvY3VtZW50KS5maW5kKCcjbW9iaWxlLW5hdi1tZW51Jyk7CgkJCQlsZXQgJG1vYmlsZV9uYXZfdG9nZ2xlX2J1dHRvbiA9ICQoZG9jdW1lbnQpLmZpbmQoJ2J1dHRvbiNtb2JpbGUtbmF2LW1lbnUtdG9nZ2xlJyk7CgoJCQkJLy8gQ3VzdG9tOgoJCQkJd2luZG93LmRvbV9oYXNfbG9hZGVkID0gZmFsc2U7CgoJCQkJLy8gU3RhdGVzOgoJCQkJLy8gQ2hlY2sgZm9yIERPTSBsb2FkZWQgc3RhdGU6CgkJCQl2YXIgdGltZW91dElEOwoKCQkJCWxldCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHsKCQkJCQltdXRhdGlvbnMuZm9yRWFjaCgobXV0YXRpb24pID0+IHsKCQkJCQkJbGV0IG9sZFZhbHVlID0gbXV0YXRpb24ub2xkVmFsdWU7CgkJCQkJCWxldCBuZXdWYWx1ZSA9IG11dGF0aW9uLnRhcmdldC50ZXh0Q29udGVudDsKCQkJCQkJaWYgKG9sZFZhbHVlICE9PSBuZXdWYWx1ZSkgewoJCQkJCQkJaWYgKCF3aW5kb3cuZG9tX2hhc19sb2FkZWQpIHsKCgkJCQkJCQkJY2xlYXJUaW1lb3V0KHRpbWVvdXRJRCk7CgkJCQkJCQl9CgoJCQkJCQkJdGltZW91dElEID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKCQkJCQkJCQl3aW5kb3cuZG9tX2hhc19sb2FkZWQgPSB0cnVlOwoKCQkJCQkJCQl3aW5kb3cuY3VycmVudF9zY3JvbGxfdG9wID0gZ2V0U2Nyb2xsVG9wKCk7CgkJCQkJCQkJaWYgKHdpbmRvdy5jdXJyZW50X3Njcm9sbF90b3AgPT0gMCkgewoJCQkJCQkJCQl3aW5kb3cuY3VycmVudF9zY3JvbGxfc3RhdGUgPSAicGFnZXRvcCI7CgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJd2luZG93LmN1cnJlbnRfc2Nyb2xsX3N0YXRlID0gInNjcm9sbHVwIjsKCQkJCQkJCQl9CgoJCQkJCQkJCW9ic2VydmVyLmRpc2Nvbm5lY3QoKTsKCgkJCQkJCQkJdXBkYXRlU2Nyb2xsU3RhdGUod2luZG93LmN1cnJlbnRfc2Nyb2xsX3N0YXRlKTsKCQkJCQkJCX0sIDI1MCk7CgkJCQkJCX0KCQkJCQl9KTsKCQkJCX0pOwoKCQkJCW9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwgewoJCQkJCWNoYXJhY3RlckRhdGFPbGRWYWx1ZTogdHJ1ZSwKCQkJCQlzdWJ0cmVlOiB0cnVlLAoJCQkJCWNoaWxkTGlzdDogdHJ1ZSwKCQkJCQljaGFyYWN0ZXJEYXRhOiB0cnVlCgkJCQl9KTsKCgkJCQkvLyBTZXQgdGltZW91dCBmb3Igb3V0ZXIgYm91bmQgdGltZSBoYW5kbGluZzoKCQkJCXNldFRpbWVvdXQoKCkgPT4gewoJCQkJCXdpbmRvdy5kb21faGFzX2xvYWRlZCA9IHRydWU7CgoJCQkJCXdpbmRvdy5jdXJyZW50X3Njcm9sbF90b3AgPSBnZXRTY3JvbGxUb3AoKTsKCQkJCQlpZiAod2luZG93LmN1cnJlbnRfc2Nyb2xsX3RvcCA9PSAwKSB7CgkJCQkJCXdpbmRvdy5jdXJyZW50X3Njcm9sbF9zdGF0ZSA9ICJwYWdldG9wIjsKCQkJCQl9IGVsc2UgewoJCQkJCQl3aW5kb3cuY3VycmVudF9zY3JvbGxfc3RhdGUgPSAic2Nyb2xsdXAiOwoJCQkJCX0KCQkJCQl1cGRhdGVTY3JvbGxTdGF0ZSh3aW5kb3cuY3VycmVudF9zY3JvbGxfc3RhdGUpOwoKCQkJCQlvYnNlcnZlci5kaXNjb25uZWN0KCk7CgkJCQl9LCA1MDApOwoKCQkJCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIF4gSU5JVElBTElaRSBeICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCgoJCQkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2IEVWRU5UUyB2ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCQkJCS8vIEhhbmRsZSBwYWdlIHNjcm9sbGluZyBmb3IgbmF2IHN0eWxpbmc6CgkJCQkkKHdpbmRvdykuc2Nyb2xsKGZ1bmN0aW9uKGV2ZW50KSB7CgkJCQkJaWYgKHdpbmRvdy5kb21faGFzX2xvYWRlZCAmJiAhd2luZG93LmhvbWVfcGFnZV9zcGxpZGVfbW92aW5nKSB7CgkJCQkJCWxldCBuZXdfc2Nyb2xsX3RvcCA9IGdldFNjcm9sbFRvcCgpOwoJCQkJCQlsZXQgbmV3X3Njcm9sbF9zdGF0ZSA9IGdldFNjcm9sbFN0YXRlKG5ld19zY3JvbGxfdG9wKTsKCgkJCQkJCWlmICh3aW5kb3cuY3VycmVudF9zY3JvbGxfc3RhdGUgIT09IG5ld19zY3JvbGxfc3RhdGUpIHsKCQkJCQkJCWlmICgoJChkb2N1bWVudCkuZmluZCgnLm5hdi1tZW51LWl0ZW0ucGFyZW50OmhvdmVyJykubGVuZ3RoICE9IDApIHx8ICgkbW9iaWxlX25hdl90b2dnbGVfYnV0dG9uLmF0dHIoJ2V4cGFuZGVkJykgPT0gInRydWUiKSkgewoJCQkJCQkJCS8vIFVzZXIgSVMgaG92ZXJpbmcgb3ZlciBuYXYgaXRlbToKCQkJCQkJCQlpZiAobmV3X3Njcm9sbF90b3AgPT0gMCkgewoJCQkJCQkJCQluZXdfc2Nyb2xsX3N0YXRlID0gInBhZ2V0b3AiOwoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCW5ld19zY3JvbGxfc3RhdGUgPSAic2Nyb2xsdXAiOwoJCQkJCQkJCX0KCgkJCQkJCQkJdXBkYXRlU2Nyb2xsU3RhdGUobmV3X3Njcm9sbF9zdGF0ZSk7CgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCS8vIFVzZXIgaXMgTk9UIGhvdmVyaW5nIG92ZXIgbmF2IGl0ZW06CgkJCQkJCQkJdXBkYXRlU2Nyb2xsU3RhdGUobmV3X3Njcm9sbF9zdGF0ZSk7CgkJCQkJCQl9CgkJCQkJCX0KCgkJCQkJCXdpbmRvdy5jdXJyZW50X3Njcm9sbF90b3AgPSBuZXdfc2Nyb2xsX3RvcDsKCQkJCQl9CgkJCQl9KTsKCgkJCQkvLyBIYW5kbGUgYSBjbGljayBvbiAkbW9iaWxlX25hdl90b2dnbGVfYnV0dG9uOgoJCQkJJG1vYmlsZV9uYXZfdG9nZ2xlX2J1dHRvbi5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKCQkJCQlpZiAoJG1vYmlsZV9uYXZfdG9nZ2xlX2J1dHRvbi5hdHRyKCdleHBhbmRlZCcpID09ICJmYWxzZSIpIHsKCQkJCQkJJG1vYmlsZV9uYXZfbWVudS5hZGRDbGFzcygnbW9iaWxlLW1lbnUtZXhwYW5kZWQnKTsKCgkJCQkJCSRtb2JpbGVfbmF2X3RvZ2dsZV9idXR0b24uYXR0cih7CgkJCQkJCQknZXhwYW5kZWQnOiAidHJ1ZSIKCQkJCQkJfSk7CgoJCQkJCQkkKGRvY3VtZW50KS5maW5kKCdib2R5JykKCQkJCQkJCS5hZGRDbGFzcygnbm9zY3JvbGwnKTsKCQkJCQl9IGVsc2UgaWYgKCRtb2JpbGVfbmF2X3RvZ2dsZV9idXR0b24uYXR0cignZXhwYW5kZWQnKSA9PSAidHJ1ZSIpIHsKCQkJCQkJJG1vYmlsZV9uYXZfbWVudS5yZW1vdmVDbGFzcygnbW9iaWxlLW1lbnUtZXhwYW5kZWQnKTsKCgkJCQkJCSRtb2JpbGVfbmF2X3RvZ2dsZV9idXR0b24uYXR0cih7CgkJCQkJCQknZXhwYW5kZWQnOiAiZmFsc2UiCgkJCQkJCX0pOwoKCQkJCQkJJChkb2N1bWVudCkuZmluZCgnYm9keScpCgkJCQkJCQkucmVtb3ZlQ2xhc3MoJ25vc2Nyb2xsJyk7CgkJCQkJfQoJCQkJfSk7CgoJCQkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBeIEVWRU5UUyBeICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCQkJfSk7CgkJ"></script> <footer><div id="site-generator"><div class="wrapper background-transparent"><div class="container m-auto height-180px all-width-outer-horizontal-bounds"><div class="row h-100 w-100 flex-nowrap footer-parent-row"><div id="footer-content" class="col"><div class="row h-100"><div class="col-auto px-0 d-flex align-items-center"> <a href="#" class="logo opaque-on-hover"> <img src="https://fletchercsi.com/intelligence/wp-content/uploads/2022/08/fletcher-footer-logo-500.png" alt="Fletcher Global Strategy Consulting Firm" alt="Fletcher Logo" /> </a></div></div></div><div id="footer-nav" class="col-auto width-unset"><div id="bottom-nav" class="row h-100 align-items-center justify-content-center flex-nowrap"><div class="col-auto height-fit-content px-26 white-space-nowrap"> <a class="underline-on-hover" href="https://fletchercsi.com/">Home</a></div><div class="col-auto height-fit-content px-26 border-left-1px-solid-fcsi-secondary-light-green white-space-nowrap"> <a class="underline-on-hover" href="https://fletchercsi.com/about/#company">About</a></div><div class="col-auto height-fit-content px-26 border-left-1px-solid-fcsi-secondary-light-green white-space-nowrap"> <a class="underline-on-hover" href="https://fletchercsi.com/about#careers">Careers</a></div><div class="col-auto height-fit-content px-26 border-left-1px-solid-fcsi-secondary-light-green white-space-nowrap"> <a class="underline-on-hover" href="https://fletchercsi.com/contact/">Contact</a></div><div class="col-auto height-fit-content px-26 border-left-1px-solid-fcsi-secondary-light-green white-space-nowrap"> <a class="underline-on-hover" href="https://fletchercsi.com/about#privacypolicy">Privacy Policy</a></div></div></div><div id="socials" class="col width-unset background-transparent"><div class="row h-100"><div class="col m-0 p-0 h-100 links-col"><div class="row h-100 w-100 align-items-center justify-content-end flex-nowrap"><div class="col-auto px-0"> <a href="https://www.linkedin.com/company/fletchercsi" target="_blank" class="opaque-on-hover color-black"> <i class="fa fa-linkedin" aria-hidden="true" alt="Find Fletcher CSI on LinkedIn"></i> </a></div><div class="col-auto px-0"> <a href="https://twitter.com/fletchercsi" target="_blank" class="opaque-on-hover color-black"> <i class="fa fa-twitter" aria-hidden="true" alt="Find Fletcher CSI on Twitter"></i> </a></div><div class="col-auto px-0 last"> <a href="https://vimeo.com/user114140327" target="_blank" class="pr-0 opaque-on-hover color-black"> <i class="fa fa-vimeo" aria-hidden="true" alt="Find Fletcher CSI on Vimeo"></i> </a></div></div></div></div></div></div></div></div></div></footer>

Pages: 1 2 3 4 5 6 7 8 9 10