Help
RSS
API
Feed
Maltego
Contact
Domain > www.hitechfea.com
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2015-04-01
54.148.107.183
(
ClassC
)
2024-10-21
104.26.12.226
(
ClassC
)
Port 80
HTTP/1.1 301 Moved PermanentlyDate: Mon, 21 Oct 2024 18:32:23 GMTContent-Type: text/htmlContent-Length: 167Connection: keep-aliveCache-Control: max-age3600Expires: Mon, 21 Oct 2024 19:32:23 GMTLocation: https://www.hitechfea.com/Report-To: {endpoints:{url:https:\/\/a.nel.cloudflare.com\/report\/v4?swuZ%2F4VHChRIxZBcfWdj2PLhOwX9TBP8bEhHkRvdEtUln7uK4zrkPixdbiKwmPlrh%2Bs32rmgwYVuJrhW2eA8JPKIlxvTRcXD1CJogoMC%2B6H637w%2BCP4lABhobEyqo0COEEc%2B%2B},group:cf-nel,max_age:604800}NEL: {success_fraction:0,report_to:cf-nel,max_age:604800}X-Content-Type-Options: nosniffServer: cloudflareCF-RAY: 8d63547d4d2ec3a2-SEA html>head>title>301 Moved Permanently/title>/head>body>center>h1>301 Moved Permanently/h1>/center>hr>center>cloudflare/center>/body>/html>
Port 443
HTTP/1.1 200 OKDate: Mon, 21 Oct 2024 18:32:24 GMTContent-Type: text/html; charsetUTF-8Transfer-Encoding: chunkedConnection: keep-aliveLink: https://www.hitechfea.com/wp-json/>; relhttps://api.w.org/, https://www.hitechfea.com/wp-json/wp/v2/pages/7>; relalternate; titleJSON; typeapplication/json, https://www.hitechfea.com/>; relshortlinkVary: Accept-EncodingCF-Cache-Status: DYNAMICReport-To: {endpoints:{url:https:\/\/a.nel.cloudflare.com\/report\/v4?s5fNGAhDAR9TRROudDu7yY2H0rFGKsGaUPMSZ891xCLdQ2WAdSY81xp4AwtUlBwq9SzUwI%2BR3Y3P1KrLW3gKnsOc9fBBppsgpnduOYOPVAjdSoZ0FcEAnGXivJhOEh1w0%2FD3y},group:cf-nel,max_age:604800}NEL: {success_fraction:0,report_to:cf-nel,max_age:604800}Strict-Transport-Security: max-age31536000; includeSubDomains; preloadX-Content-Type-Options: nosniffServer: cloudflareCF-RAY: 8d63547dc9927603-SEA !DOCTYPE html>html dirltr langen-US stylepadding-top:0!important>head itemscope itemtypehttp://schema.org/WebSite>meta itempropname contentHi-Tech FEA />meta itempropurl contenthttps://www.hitechfea.com/ />meta http-equivContent-Type contenttext/html; charsetutf-8 />meta nameHandheldFriendly contenttrue>meta nameviewport contentwidthdevice-width, initial-scale1>meta nameauthor contentHiTechFEA>meta charsetUTF-8>meta namedcterms.rightsHolder contentCopyright hitechfea.com />meta namedcterms.rights contenthitechfea.com />link relshortcut icon hrefhttps://www.hitechfea.com/wp-content/themes/hitechfea/favicon.ico typeimage/x-icon>link relicon hrefhttps://www.hitechfea.com/wp-content/themes/hitechfea/favicon.ico typeimage/x-icon> !--if lt IE 9> script srchttps://www.hitechfea.com/wp-content/themes/hitechfea/js/html5.js>/script> !endif--> !--if lt IE 9> script>document.createElement(header); document.createElement(nav); document.createElement(section); document.createElement(article); document.createElement(aside); document.createElement(footer); document.createElement(hgroup); document.createElement(address);/script> !endif-->link hrefhttps://www.hitechfea.com/wp-content/cache/autoptimize/css/autoptimize_single_cf55b82ee9ead80fab2cb0bff92b2c3c.css relstylesheet typetext/css mediaall>link hrefhttps://www.hitechfea.com/wp-content/cache/autoptimize/css/autoptimize_single_ad8bd825c46dad8b6f49972050f6861a.css relstylesheet>link relapple-touch-icon hrefhttps://www.hitechfea.com/wp-content/themes/hitechfea/images/apple-touch-icon-57x57.png />link relapple-touch-icon sizes72x72 hrefhttps://www.hitechfea.com/wp-content/themes/hitechfea/images/apple-touch-icon-72x72.png />link relapple-touch-icon sizes114x114 hrefhttps://www.hitechfea.com/wp-content/themes/hitechfea/images/apple-touch-icon-114x114.png />title>FEA Analysis & Consulting For Product Design & Optimization/title>meta namedescription contentFEA Consulting Services for Product Design Optimization Consistent pressure from competitors and the need to bring products to the market faster is forcing manufacturers to optimize and reinvent their existing product designs, and develop new economical products for the demanding market. We deliver product design solutions across multiple engineering domains through finite element analyses and />meta namerobots contentmax-snippet:-1, max-image-preview:large, max-video-preview:-1 />link relcanonical hrefhttps://www.hitechfea.com/ />meta namegenerator contentAll in One SEO (AIOSEO) 4.7.3 />meta namegoogle contentnositelinkssearchbox />meta propertyog:locale contenten_US />meta propertyog:type contentarticle />meta propertyog:title contentHome />meta propertyog:description contentFEA Consulting Services for Product Design Optimization Consistent pressure from competitors and the need to bring products to the market faster is forcing manufacturers to optimize and reinvent their existing product designs, and develop new />meta propertyog:url contenthttps://www.hitechfea.com/ />meta propertyog:site_name contentHi-Tech FEA />meta propertyog:updated_time content2018-06-21T08:27:18+00:00 />meta propertyarticle:published_time content2018-06-11T09:59:24+00:00 />meta propertyarticle:modified_time content2018-06-21T08:27:18+00:00 />meta nametwitter:card contentsummary_large_image />meta nametwitter:title contentHome />meta nametwitter:description contentFEA Consulting Services for Product Design Optimization Consistent pressure from competitors and the need to bring products to the market faster is forcing manufacturers to optimize and reinvent their existing product designs, and develop new />meta classflipboard-article contentFEA Consulting Services for Product Design Optimization Consistent pressure from competitors and the need to bring products to the market faster is forcing manufacturers to optimize and reinvent their existing product designs, and develop new />link hrefhttps://fonts.gstatic.com crossoriginanonymous relpreconnect />link hrefhttps://ajax.googleapis.com relpreconnect />link hrefhttps://fonts.googleapis.com relpreconnect />link relalternate typeapplication/rss+xml titleHi-Tech FEA » Feed hrefhttps://www.hitechfea.com/feed/ />link relalternate typeapplication/rss+xml titleHi-Tech FEA » Comments Feed hrefhttps://www.hitechfea.com/comments/feed/ />link relstylesheet idwp-block-library-css hrefhttps://www.hitechfea.com/wp-includes/css/dist/block-library/style.min.css?ver85330ed1e6fe7d5480f8bfcfd32bce24 typetext/css mediaall />style idclassic-theme-styles-inline-css typetext/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 idglobal-styles-inline-css typetext/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--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: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--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>style idresponsive-menu-inline-css typetext/css>/** This file is major component of this plugin so please dont try to edit here. */#rmp_menu_trigger-755 { width: 45px; height: 45px; position: fixed; top: 15px; border-radius: 5px; display: none; text-decoration: none; right: 5%; background: transparent; transition: transform 0.5s, background-color 0.5s;}#rmp_menu_trigger-755 .rmp-trigger-box { width: 25px; color: #ffffff;}#rmp_menu_trigger-755 .rmp-trigger-icon-active, #rmp_menu_trigger-755 .rmp-trigger-text-open { display: none;}#rmp_menu_trigger-755.is-active .rmp-trigger-icon-active, #rmp_menu_trigger-755.is-active .rmp-trigger-text-open { display: inline;}#rmp_menu_trigger-755.is-active .rmp-trigger-icon-inactive, #rmp_menu_trigger-755.is-active .rmp-trigger-text { display: none;}#rmp_menu_trigger-755 .rmp-trigger-label { color: #ffffff; pointer-events: none; line-height: 13px; font-family: inherit; font-size: 14px; display: inline; text-transform: inherit;}#rmp_menu_trigger-755 .rmp-trigger-label.rmp-trigger-label-top { display: block; margin-bottom: 12px;}#rmp_menu_trigger-755 .rmp-trigger-label.rmp-trigger-label-bottom { display: block; margin-top: 12px;}#rmp_menu_trigger-755 .responsive-menu-pro-inner { display: block;}#rmp_menu_trigger-755 .responsive-menu-pro-inner, #rmp_menu_trigger-755 .responsive-menu-pro-inner::before, #rmp_menu_trigger-755 .responsive-menu-pro-inner::after { width: 25px; height: 2px; background-color: #000000; border-radius: 4px; position: absolute;}#rmp_menu_trigger-755.is-active .responsive-menu-pro-inner, #rmp_menu_trigger-755.is-active .responsive-menu-pro-inner::before, #rmp_menu_trigger-755.is-active .responsive-menu-pro-inner::after { background-color: #000000;}#rmp_menu_trigger-755:hover .responsive-menu-pro-inner, #rmp_menu_trigger-755:hover .responsive-menu-pro-inner::before, #rmp_menu_trigger-755:hover .responsive-menu-pro-inner::after { background-color: #000000;}#rmp_menu_trigger-755 .responsive-menu-pro-inner::before { top: 10px;}#rmp_menu_trigger-755 .responsive-menu-pro-inner::after { bottom: 10px;}#rmp_menu_trigger-755.is-active .responsive-menu-pro-inner::after { bottom: 0;}/* Hamburger menu styling */@media screen and (max-width: 979px) { /** Menu Title Style */ /** Menu Additional Content Style */ #rmp_menu_trigger-755 { display: block; } #rmp-container-755 { position: fixed; top: 0; margin: 0; transition: transform 0.5s; overflow: auto; display: block; width: 75%; background-color: #303745; background-image: url(); height: 100%; right: 0; padding-top: 0px; padding-left: 0px; padding-bottom: 0px; padding-right: 0px; } #rmp-menu-wrap-755 { padding-top: 0px; padding-left: 0px; padding-bottom: 0px; padding-right: 0px; background-color: #303745; } #rmp-menu-wrap-755 .rmp-menu, #rmp-menu-wrap-755 .rmp-submenu { width: 100%; box-sizing: border-box; margin: 0; padding: 0; } #rmp-menu-wrap-755 .rmp-submenu-depth-1 .rmp-menu-item-link { padding-left: 10%; } #rmp-menu-wrap-755 .rmp-submenu-depth-2 .rmp-menu-item-link { padding-left: 15%; } #rmp-menu-wrap-755 .rmp-submenu-depth-3 .rmp-menu-item-link { padding-left: 20%; } #rmp-menu-wrap-755 .rmp-submenu-depth-4 .rmp-menu-item-link { padding-left: 25%; } #rmp-menu-wrap-755 .rmp-submenu.rmp-submenu-open { display: block; } #rmp-menu-wrap-755 .rmp-menu-item { width: 100%; list-style: none; margin: 0; } #rmp-menu-wrap-755 .rmp-menu-item-link { height: 40px; line-height: 40px; font-size: 16px; border-bottom: 1px solid #4e5563; font-family: Arimo, sans-serif; color: #ffffff; text-align: left; background-color: #303745; font-weight: normal; letter-spacing: 0px; display: block; box-sizing: border-box; width: 100%; text-decoration: none; position: relative; overflow: hidden; transition: background-color 0.5s, border-color 0.5s, 0.5s; padding: 0 5%; padding-right: 50px; } #rmp-menu-wrap-755 .rmp-menu-item-link:after, #rmp-menu-wrap-755 .rmp-menu-item-link:before { display: none; } #rmp-menu-wrap-755 .rmp-menu-item-link:hover, #rmp-menu-wrap-755 .rmp-menu-item-link:focus { color: #ffffff; border-color: #484f5d; background-color: #303745; } #rmp-menu-wrap-755 .rmp-menu-item-link:focus { outline: none; border-color: unset; box-shadow: unset; } #rmp-menu-wrap-755 .rmp-menu-item-link .rmp-font-icon { height: 40px; line-height: 40px; margin-right: 10px; font-size: 16px; } #rmp-menu-wrap-755 .rmp-menu-current-item .rmp-menu-item-link { color: #ffffff; border-color: #ffffff; background-color: #484f5d; } #rmp-menu-wrap-755 .rmp-menu-current-item .rmp-menu-item-link:hover, #rmp-menu-wrap-755 .rmp-menu-current-item .rmp-menu-item-link:focus { color: #ffffff; border-color: #484f5d; background-color: #484f5d; } #rmp-menu-wrap-755 .rmp-menu-subarrow { position: absolute; top: 0; bottom: 0; text-align: center; overflow: hidden; background-size: cover; overflow: hidden; right: 0; border-left-style: solid; border-left-color: #ffffff; border-left-width: 1px; height: 40px; width: 40px; color: #ffffff; background-color: #484f5d; } #rmp-menu-wrap-755 .rmp-menu-subarrow svg { fill: #ffffff; } #rmp-menu-wrap-755 .rmp-menu-subarrow:hover { color: #ffffff; border-color: #ffffff; background-color: #484f5d; } #rmp-menu-wrap-755 .rmp-menu-subarrow:hover svg { fill: #ffffff; } #rmp-menu-wrap-755 .rmp-menu-subarrow .rmp-font-icon { margin-right: unset; } #rmp-menu-wrap-755 .rmp-menu-subarrow * { vertical-align: middle; line-height: 40px; } #rmp-menu-wrap-755 .rmp-menu-subarrow-active { display: block; background-size: cover; color: #ffffff; border-color: #ffffff; background-color: #484f5d; } #rmp-menu-wrap-755 .rmp-menu-subarrow-active svg { fill: #ffffff; } #rmp-menu-wrap-755 .rmp-menu-subarrow-active:hover { color: #ffffff; border-color: #ffffff; background-color: #484f5d; } #rmp-menu-wrap-755 .rmp-menu-subarrow-active:hover svg { fill: #ffffff; } #rmp-menu-wrap-755 .rmp-submenu { display: none; } #rmp-menu-wrap-755 .rmp-submenu .rmp-menu-item-link { height: 40px; line-height: 40px; letter-spacing: 0px; font-size: 13px; border-bottom: 1px solid #484f5d; font-family: inherit; font-weight: normal; color: #ffffff; text-align: left; background-color: #484f5d; } #rmp-menu-wrap-755 .rmp-submenu .rmp-menu-item-link:hover, #rmp-menu-wrap-755 .rmp-submenu .rmp-menu-item-link:focus { color: #ffffff; border-color: #484f5d; background-color: #484f5d; } #rmp-menu-wrap-755 .rmp-submenu .rmp-menu-current-item .rmp-menu-item-link { color: #ffffff; border-color: #353d4d; background-color: #484f5d; } #rmp-menu-wrap-755 .rmp-submenu .rmp-menu-current-item .rmp-menu-item-link:hover, #rmp-menu-wrap-755 .rmp-submenu .rmp-menu-current-item .rmp-menu-item-link:focus { color: #ffffff; border-color: #303747; background-color: #484f5d; } #rmp-menu-wrap-755 .rmp-submenu .rmp-menu-subarrow { right: 0; border-right: unset; border-left-style: solid; border-left-color: #ffffff; border-left-width: 1px; height: 40px; line-height: 40px; width: 40px; color: #ffffff; background-color: #2d3342; } #rmp-menu-wrap-755 .rmp-submenu .rmp-menu-subarrow:hover { color: #ffffff; border-color: #ffffff; background-color: #2d3342; } #rmp-menu-wrap-755 .rmp-submenu .rmp-menu-subarrow-active { color: #ffffff; border-color: #ffffff; background-color: #2d3342; } #rmp-menu-wrap-755 .rmp-submenu .rmp-menu-subarrow-active:hover { color: #ffffff; border-color: #ffffff; background-color: #2d3342; } #rmp-menu-wrap-755 .rmp-menu-item-description { margin: 0; padding: 5px 5%; opacity: 0.8; color: #ffffff; } #rmp-search-box-755 { display: block; padding-top: 0px; padding-left: 5%; padding-bottom: 0px; padding-right: 5%; } #rmp-search-box-755 .rmp-search-form { margin: 0; } #rmp-search-box-755 .rmp-search-box { background: #ffffff; border: 1px solid #dadada; color: #333333; width: 100%; padding: 0 5%; border-radius: 30px; height: 45px; -webkit-appearance: none; } #rmp-search-box-755 .rmp-search-box::placeholder { color: #c7c7cd; } #rmp-search-box-755 .rmp-search-box:focus { background-color: #ffffff; outline: 2px solid #dadada; color: #333333; } #rmp-menu-title-755 { background-color: #303745; color: #ffffff; text-align: left; font-size: 16px; padding-top: 10%; padding-left: 5%; padding-bottom: 0%; padding-right: 5%; font-weight: 400; transition: background-color 0.5s, border-color 0.5s, color 0.5s; } #rmp-menu-title-755:hover { background-color: #303745; color: #ffffff; } #rmp-menu-title-755 > .rmp-menu-title-link { color: #ffffff; width: 100%; background-color: unset; text-decoration: none; } #rmp-menu-title-755 > .rmp-menu-title-link:hover { color: #ffffff; } #rmp-menu-title-755 .rmp-font-icon { font-size: 16px; } #rmp-menu-additional-content-755 { padding-top: 0px; padding-left: 5%; padding-bottom: 0px; padding-right: 5%; color: #ffffff; text-align: center; font-size: 16px; }}/**This file contents common styling of menus.*/.rmp-container { display: none; visibility: visible; padding: 0px 0px 0px 0px; z-index: 99998; transition: all 0.3s; /** Scrolling bar in menu setting box **/}.rmp-container.rmp-fade-top, .rmp-container.rmp-fade-left, .rmp-container.rmp-fade-right, .rmp-container.rmp-fade-bottom { display: none;}.rmp-container.rmp-slide-left, .rmp-container.rmp-push-left { transform: translateX(-100%); -ms-transform: translateX(-100%); -webkit-transform: translateX(-100%); -moz-transform: translateX(-100%);}.rmp-container.rmp-slide-left.rmp-menu-open, .rmp-container.rmp-push-left.rmp-menu-open { transform: translateX(0); -ms-transform: translateX(0); -webkit-transform: translateX(0); -moz-transform: translateX(0);}.rmp-container.rmp-slide-right, .rmp-container.rmp-push-right { transform: translateX(100%); -ms-transform: translateX(100%); -webkit-transform: translateX(100%); -moz-transform: translateX(100%);}.rmp-container.rmp-slide-right.rmp-menu-open, .rmp-container.rmp-push-right.rmp-menu-open { transform: translateX(0); -ms-transform: translateX(0); -webkit-transform: translateX(0); -moz-transform: translateX(0);}.rmp-container.rmp-slide-top, .rmp-container.rmp-push-top { transform: translateY(-100%); -ms-transform: translateY(-100%); -webkit-transform: translateY(-100%); -moz-transform: translateY(-100%);}.rmp-container.rmp-slide-top.rmp-menu-open, .rmp-container.rmp-push-top.rmp-menu-open { transform: translateY(0); -ms-transform: translateY(0); -webkit-transform: translateY(0); -moz-transform: translateY(0);}.rmp-container.rmp-slide-bottom, .rmp-container.rmp-push-bottom { transform: translateY(100%); -ms-transform: translateY(100%); -webkit-transform: translateY(100%); -moz-transform: translateY(100%);}.rmp-container.rmp-slide-bottom.rmp-menu-open, .rmp-container.rmp-push-bottom.rmp-menu-open { transform: translateX(0); -ms-transform: translateX(0); -webkit-transform: translateX(0); -moz-transform: translateX(0);}.rmp-container::-webkit-scrollbar { width: 0px;}.rmp-container ::-webkit-scrollbar-track { box-shadow: inset 0 0 5px transparent;}.rmp-container ::-webkit-scrollbar-thumb { background: transparent;}.rmp-container ::-webkit-scrollbar-thumb:hover { background: transparent;}.rmp-container .rmp-menu-wrap .rmp-menu { transition: none; border-radius: 0; box-shadow: none; background: none; border: 0; bottom: auto; box-sizing: border-box; clip: auto; color: #666; display: block; float: none; font-family: inherit; font-size: 14px; height: auto; left: auto; line-height: 1.7; list-style-type: none; margin: 0; min-height: auto; max-height: none; opacity: 1; outline: none; overflow: visible; padding: 0; position: relative; pointer-events: auto; right: auto; text-align: left; text-decoration: none; text-indent: 0; text-transform: none; transform: none; top: auto; visibility: inherit; width: auto; word-wrap: break-word; white-space: normal;}.rmp-container .rmp-menu-additional-content { display: block; word-break: break-word;}.rmp-container .rmp-menu-title { display: flex; flex-direction: column;}.rmp-container .rmp-menu-title .rmp-menu-title-image { max-width: 100%; margin-bottom: 15px; display: block; margin: auto; margin-bottom: 15px;}button.rmp_menu_trigger { z-index: 999999; overflow: hidden; outline: none; border: 0; display: none; margin: 0; transition: transform 0.5s, background-color 0.5s; padding: 0;}button.rmp_menu_trigger .responsive-menu-pro-inner::before, button.rmp_menu_trigger .responsive-menu-pro-inner::after { content: ; display: block;}button.rmp_menu_trigger .responsive-menu-pro-inner::before { top: 10px;}button.rmp_menu_trigger .responsive-menu-pro-inner::after { bottom: 10px;}button.rmp_menu_trigger .rmp-trigger-box { width: 40px; display: inline-block; position: relative; pointer-events: none; vertical-align: super;}/* Menu Trigger Boring Animation */.rmp-menu-trigger-boring .responsive-menu-pro-inner { transition-property: none;}.rmp-menu-trigger-boring .responsive-menu-pro-inner::after, .rmp-menu-trigger-boring .responsive-menu-pro-inner::before { transition-property: none;}.rmp-menu-trigger-boring.is-active .responsive-menu-pro-inner { transform: rotate(45deg);}.rmp-menu-trigger-boring.is-active .responsive-menu-pro-inner:before { top: 0; opacity: 0;}.rmp-menu-trigger-boring.is-active .responsive-menu-pro-inner:after { bottom: 0; transform: rotate(-90deg);}/style>link relstylesheet iddashicons-css hrefhttps://www.hitechfea.com/wp-includes/css/dashicons.min.css?ver85330ed1e6fe7d5480f8bfcfd32bce24 typetext/css mediaall />link relstylesheet iddpsp-frontend-style-pro-css hrefhttps://www.hitechfea.com/wp-content/cache/autoptimize/css/autoptimize_single_4adfe431ae0ed59841f5b03268447f0d.css?ver1.34.7 typetext/css mediaall />style iddpsp-frontend-style-pro-inline-css typetext/css>@media screen and ( max-width : 720px ) { aside#dpsp-floating-sidebar.dpsp-hide-on-mobile.opened { display: none; } }/style>link relstylesheet idppress-frontend-css hrefhttps://www.hitechfea.com/wp-content/plugins/wp-user-avatar/assets/css/frontend.min.css?ver4.15.17 typetext/css mediaall />link relstylesheet idppress-flatpickr-css hrefhttps://www.hitechfea.com/wp-content/plugins/wp-user-avatar/assets/flatpickr/flatpickr.min.css?ver4.15.17 typetext/css mediaall />link relstylesheet idppress-select2-css hrefhttps://www.hitechfea.com/wp-content/plugins/wp-user-avatar/assets/select2/select2.min.css?ver85330ed1e6fe7d5480f8bfcfd32bce24 typetext/css mediaall /> script typetext/javascript srchttps://www.hitechfea.com/wp-includes/js/jquery/jquery.min.js?ver3.7.1 idjquery-core-js>/script> script defer typetext/javascript srchttps://www.hitechfea.com/wp-includes/js/jquery/jquery-migrate.min.js?ver3.4.1 idjquery-migrate-js>/script> script defer idrmp_menu_scripts-js-extra srcdata:text/javascript;base64,Ci8qIDwhW0NEQVRBWyAqLwp2YXIgcm1wX21lbnUgPSB7ImFqYXhVUkwiOiJodHRwczpcL1wvd3d3LmhpdGVjaGZlYS5jb21cL3dwLWFkbWluXC9hZG1pbi1hamF4LnBocCIsIndwX25vbmNlIjoiNmY4Njc4NTgwNiIsIm1lbnUiOlt7Im1lbnVfdGhlbWUiOm51bGwsInRoZW1lX3R5cGUiOiJkZWZhdWx0IiwidGhlbWVfbG9jYXRpb25fbWVudSI6IiIsInN1Ym1lbnVfc3VibWVudV9hcnJvd193aWR0aCI6IjQwIiwic3VibWVudV9zdWJtZW51X2Fycm93X3dpZHRoX3VuaXQiOiJweCIsInN1Ym1lbnVfc3VibWVudV9hcnJvd19oZWlnaHQiOiI0MCIsInN1Ym1lbnVfc3VibWVudV9hcnJvd19oZWlnaHRfdW5pdCI6InB4Iiwic3VibWVudV9hcnJvd19wb3NpdGlvbiI6InJpZ2h0Iiwic3VibWVudV9zdWJfYXJyb3dfYmFja2dyb3VuZF9jb2xvdXIiOiIjMmQzMzQyIiwic3VibWVudV9zdWJfYXJyb3dfYmFja2dyb3VuZF9ob3Zlcl9jb2xvdXIiOiIjMmQzMzQyIiwic3VibWVudV9zdWJfYXJyb3dfYmFja2dyb3VuZF9jb2xvdXJfYWN0aXZlIjoiIzJkMzM0MiIsInN1Ym1lbnVfc3ViX2Fycm93X2JhY2tncm91bmRfaG92ZXJfY29sb3VyX2FjdGl2ZSI6IiMyZDMzNDIiLCJzdWJtZW51X3N1Yl9hcnJvd19ib3JkZXJfd2lkdGgiOiIxIiwic3VibWVudV9zdWJfYXJyb3dfYm9yZGVyX3dpZHRoX3VuaXQiOiJweCIsInN1Ym1lbnVfc3ViX2Fycm93X2JvcmRlcl9jb2xvdXIiOiIjZmZmZmZmIiwic3VibWVudV9zdWJfYXJyb3dfYm9yZGVyX2hvdmVyX2NvbG91ciI6IiNmZmZmZmYiLCJzdWJtZW51X3N1Yl9hcnJvd19ib3JkZXJfY29sb3VyX2FjdGl2ZSI6IiNmZmZmZmYiLCJzdWJtZW51X3N1Yl9hcnJvd19ib3JkZXJfaG92ZXJfY29sb3VyX2FjdGl2ZSI6IiNmZmZmZmYiLCJzdWJtZW51X3N1Yl9hcnJvd19zaGFwZV9jb2xvdXIiOiIjZmZmZmZmIiwic3VibWVudV9zdWJfYXJyb3dfc2hhcGVfaG92ZXJfY29sb3VyIjoiI2ZmZmZmZiIsInN1Ym1lbnVfc3ViX2Fycm93X3NoYXBlX2NvbG91cl9hY3RpdmUiOiIjZmZmZmZmIiwic3VibWVudV9zdWJfYXJyb3dfc2hhcGVfaG92ZXJfY29sb3VyX2FjdGl2ZSI6IiNmZmZmZmYiLCJ1c2VfaGVhZGVyX2JhciI6Im9mZiIsImhlYWRlcl9iYXJfaXRlbXNfb3JkZXIiOiJ7XCJsb2dvXCI6XCJvblwiLFwidGl0bGVcIjpcIm9uXCIsXCJzZWFyY2hcIjpcIm9uXCIsXCJodG1sIGNvbnRlbnRcIjpcIm9uXCJ9IiwiaGVhZGVyX2Jhcl90aXRsZSI6IiIsImhlYWRlcl9iYXJfaHRtbF9jb250ZW50IjoiIiwiaGVhZGVyX2Jhcl9sb2dvIjoiIiwiaGVhZGVyX2Jhcl9sb2dvX2xpbmsiOiIiLCJoZWFkZXJfYmFyX2xvZ29fd2lkdGgiOiIiLCJoZWFkZXJfYmFyX2xvZ29fd2lkdGhfdW5pdCI6IiUiLCJoZWFkZXJfYmFyX2xvZ29faGVpZ2h0IjoiIiwiaGVhZGVyX2Jhcl9sb2dvX2hlaWdodF91bml0IjoicHgiLCJoZWFkZXJfYmFyX2hlaWdodCI6IjgwIiwiaGVhZGVyX2Jhcl9oZWlnaHRfdW5pdCI6InB4IiwiaGVhZGVyX2Jhcl9wYWRkaW5nIjp7InRvcCI6IjBweCIsInJpZ2h0IjoiNSUiLCJib3R0b20iOiIwcHgiLCJsZWZ0IjoiNSUifSwiaGVhZGVyX2Jhcl9mb250IjoiIiwiaGVhZGVyX2Jhcl9mb250X3NpemUiOiIxNCIsImhlYWRlcl9iYXJfZm9udF9zaXplX3VuaXQiOiJweCIsImhlYWRlcl9iYXJfdGV4dF9jb2xvciI6IiNmZmZmZmYiLCJoZWFkZXJfYmFyX2JhY2tncm91bmRfY29sb3IiOiIjZmZmZmZmIiwiaGVhZGVyX2Jhcl9icmVha3BvaW50IjoiODAwIiwiaGVhZGVyX2Jhcl9wb3NpdGlvbl90eXBlIjoiZml4ZWQiLCJoZWFkZXJfYmFyX2FkanVzdF9wYWdlIjpudWxsLCJoZWFkZXJfYmFyX3Njcm9sbF9lbmFibGUiOiJvZmYiLCJoZWFkZXJfYmFyX3Njcm9sbF9iYWNrZ3JvdW5kX2NvbG9yIjoiIzM2YmRmNiIsIm1vYmlsZV9icmVha3BvaW50IjoiNjAwIiwidGFibGV0X2JyZWFrcG9pbnQiOiI5NzkiLCJ0cmFuc2l0aW9uX3NwZWVkIjoiMC41Iiwic3ViX21lbnVfc3BlZWQiOiIwLjIiLCJzaG93X21lbnVfb25fcGFnZV9sb2FkIjoiIiwibWVudV9kaXNhYmxlX3Njcm9sbGluZyI6Im9mZiIsIm1lbnVfb3ZlcmxheSI6Im9mZiIsIm1lbnVfb3ZlcmxheV9jb2xvdXIiOiJyZ2JhKDAsIDAsIDAsIDAuNykiLCJkZXNrdG9wX21lbnVfd2lkdGgiOiIiLCJkZXNrdG9wX21lbnVfd2lkdGhfdW5pdCI6IiUiLCJkZXNrdG9wX21lbnVfcG9zaXRpb25pbmciOiJmaXhlZCIsImRlc2t0b3BfbWVudV9zaWRlIjoiIiwiZGVza3RvcF9tZW51X3RvX2hpZGUiOiIiLCJ1c2VfY3VycmVudF90aGVtZV9sb2NhdGlvbiI6Im9mZiIsIm1lZ2FfbWVudSI6eyIyMjUiOiJvZmYiLCIyMjciOiJvZmYiLCIyMjkiOiJvZmYiLCIyMjgiOiJvZmYiLCIyMjYiOiJvZmYifSwiZGVza3RvcF9zdWJtZW51X29wZW5fYW5pbWF0aW9uIjoiIiwiZGVza3RvcF9zdWJtZW51X29wZW5fYW5pbWF0aW9uX3NwZWVkIjoiMG1zIiwiZGVza3RvcF9zdWJtZW51X29wZW5fb25fY2xpY2siOiIiLCJkZXNrdG9wX21lbnVfaGlkZV9hbmRfc2hvdyI6IiIsIm1lbnVfbmFtZSI6IkRlZmF1bHQgTWVudSIsIm1lbnVfdG9fdXNlIjoibWFpbm1lbnUiLCJkaWZmZXJlbnRfbWVudV9mb3JfbW9iaWxlIjoib2ZmIiwibWVudV90b191c2VfaW5fbW9iaWxlIjoibWFpbi1tZW51IiwidXNlX21vYmlsZV9tZW51Ijoib24iLCJ1c2VfdGFibGV0X21lbnUiOiJvbiIsInVzZV9kZXNrdG9wX21lbnUiOiIiLCJtZW51X2Rpc3BsYXlfb24iOiJhbGwtcGFnZXMiLCJtZW51X3RvX2hpZGUiOiIiLCJzdWJtZW51X2Rlc2NyaXB0aW9uc19vbiI6IiIsImN1c3RvbV93YWxrZXIiOiIiLCJtZW51X2JhY2tncm91bmRfY29sb3VyIjoiIzMwMzc0NSIsIm1lbnVfZGVwdGgiOiI1Iiwic21vb3RoX3Njcm9sbF9vbiI6Im9mZiIsInNtb290aF9zY3JvbGxfc3BlZWQiOiI1MDAiLCJtZW51X2ZvbnRfaWNvbnMiOltdLCJtZW51X2xpbmtzX2hlaWdodCI6IjQwIiwibWVudV9saW5rc19oZWlnaHRfdW5pdCI6InB4IiwibWVudV9saW5rc19saW5lX2hlaWdodCI6IjQwIiwibWVudV9saW5rc19saW5lX2hlaWdodF91bml0IjoicHgiLCJtZW51X2RlcHRoXzAiOiI1IiwibWVudV9kZXB0aF8wX3VuaXQiOiIlIiwibWVudV9mb250X3NpemUiOiIxNiIsIm1lbnVfZm9udF9zaXplX3VuaXQiOiJweCIsIm1lbnVfZm9udCI6IidBcmltbycsIHNhbnMtc2VyaWYiLCJtZW51X2ZvbnRfd2VpZ2h0Ijoibm9ybWFsIiwibWVudV90ZXh0X2FsaWdubWVudCI6ImxlZnQiLCJtZW51X3RleHRfbGV0dGVyX3NwYWNpbmciOiIiLCJtZW51X3dvcmRfd3JhcCI6Im9mZiIsIm1lbnVfbGlua19jb2xvdXIiOiIjZmZmZmZmIiwibWVudV9saW5rX2hvdmVyX2NvbG91ciI6IiNmZmZmZmYiLCJtZW51X2N1cnJlbnRfbGlua19jb2xvdXIiOiIjZmZmZmZmIiwibWVudV9jdXJyZW50X2xpbmtfaG92ZXJfY29sb3VyIjoiI2ZmZmZmZiIsIm1lbnVfaXRlbV9iYWNrZ3JvdW5kX2NvbG91ciI6IiMzMDM3NDUiLCJtZW51X2l0ZW1fYmFja2dyb3VuZF9ob3Zlcl9jb2xvdXIiOiIjMzAzNzQ1IiwibWVudV9jdXJyZW50X2l0ZW1fYmFja2dyb3VuZF9jb2xvdXIiOiIjNDg0ZjVkIiwibWVudV9jdXJyZW50X2l0ZW1fYmFja2dyb3VuZF9ob3Zlcl9jb2xvdXIiOiIjNDg0ZjVkIiwibWVudV9ib3JkZXJfd2lkdGgiOiIxIiwibWVudV9ib3JkZXJfd2lkdGhfdW5pdCI6InB4IiwibWVudV9pdGVtX2JvcmRlcl9jb2xvdXIiOiIjNGU1NTYzIiwibWVudV9pdGVtX2JvcmRlcl9jb2xvdXJfaG92ZXIiOiIjNDg0ZjVkIiwibWVudV9jdXJyZW50X2l0ZW1fYm9yZGVyX2NvbG91ciI6IiNmZmZmZmYiLCJtZW51X2N1cnJlbnRfaXRlbV9ib3JkZXJfaG92ZXJfY29sb3VyIjoiIzQ4NGY1ZCIsInN1Ym1lbnVfbGlua3NfaGVpZ2h0IjoiNDAiLCJzdWJtZW51X2xpbmtzX2hlaWdodF91bml0IjoicHgiLCJzdWJtZW51X2xpbmtzX2xpbmVfaGVpZ2h0IjoiNDAiLCJzdWJtZW51X2xpbmtzX2xpbmVfaGVpZ2h0X3VuaXQiOiJweCIsIm1lbnVfZGVwdGhfc2lkZSI6ImxlZnQiLCJtZW51X2RlcHRoXzEiOiIxMCIsIm1lbnVfZGVwdGhfMV91bml0IjoiJSIsIm1lbnVfZGVwdGhfMiI6IjE1IiwibWVudV9kZXB0aF8yX3VuaXQiOiIlIiwibWVudV9kZXB0aF8zIjoiMjAiLCJtZW51X2RlcHRoXzNfdW5pdCI6IiUiLCJtZW51X2RlcHRoXzQiOiIyNSIsIm1lbnVfZGVwdGhfNF91bml0IjoiJSIsInN1Ym1lbnVfaXRlbV9iYWNrZ3JvdW5kX2NvbG91ciI6IiM0ODRmNWQiLCJzdWJtZW51X2l0ZW1fYmFja2dyb3VuZF9ob3Zlcl9jb2xvdXIiOiIjNDg0ZjVkIiwic3VibWVudV9jdXJyZW50X2l0ZW1fYmFja2dyb3VuZF9jb2xvdXIiOiIjNDg0ZjVkIiwic3VibWVudV9jdXJyZW50X2l0ZW1fYmFja2dyb3VuZF9ob3Zlcl9jb2xvdXIiOiIjNDg0ZjVkIiwic3VibWVudV9ib3JkZXJfd2lkdGgiOiIxIiwic3VibWVudV9ib3JkZXJfd2lkdGhfdW5pdCI6InB4Iiwic3VibWVudV9pdGVtX2JvcmRlcl9jb2xvdXIiOiIjNDg0ZjVkIiwic3VibWVudV9pdGVtX2JvcmRlcl9jb2xvdXJfaG92ZXIiOiIjNDg0ZjVkIiwic3VibWVudV9jdXJyZW50X2l0ZW1fYm9yZGVyX2NvbG91ciI6IiMzNTNkNGQiLCJzdWJtZW51X2N1cnJlbnRfaXRlbV9ib3JkZXJfaG92ZXJfY29sb3VyIjoiIzMwMzc0NyIsInN1Ym1lbnVfZm9udF9zaXplIjoiMTMiLCJzdWJtZW51X2ZvbnRfc2l6ZV91bml0IjoicHgiLCJzdWJtZW51X2ZvbnQiOiIiLCJzdWJtZW51X2ZvbnRfd2VpZ2h0Ijoibm9ybWFsIiwic3VibWVudV90ZXh0X2xldHRlcl9zcGFjaW5nIjoiIiwic3VibWVudV90ZXh0X2FsaWdubWVudCI6ImxlZnQiLCJzdWJtZW51X2xpbmtfY29sb3VyIjoiI2ZmZmZmZiIsInN1Ym1lbnVfbGlua19ob3Zlcl9jb2xvdXIiOiIjZmZmZmZmIiwic3VibWVudV9jdXJyZW50X2xpbmtfY29sb3VyIjoiI2ZmZmZmZiIsInN1Ym1lbnVfY3VycmVudF9saW5rX2hvdmVyX2NvbG91ciI6IiNmZmZmZmYiLCJpbmFjdGl2ZV9hcnJvd19zaGFwZSI6IiIsImFjdGl2ZV9hcnJvd19zaGFwZSI6IiIsImluYWN0aXZlX2Fycm93X2ZvbnRfaWNvbiI6IiIsImFjdGl2ZV9hcnJvd19mb250X2ljb24iOiIiLCJpbmFjdGl2ZV9hcnJvd19pbWFnZSI6Imh0dHBzOlwvXC93d3cuaGl0ZWNoZmVhLmNvbVwvd3AtY29udGVudFwvdGhlbWVzXC9oaXRlY2hmZWFcL2ltYWdlc1wvbWVudS1leHBhbmQucG5nIiwiYWN0aXZlX2Fycm93X2ltYWdlIjoiaHR0cHM6XC9cL3d3dy5oaXRlY2hmZWEuY29tXC93cC1jb250ZW50XC90aGVtZXNcL2hpdGVjaGZlYVwvaW1hZ2VzXC9tZW51LWNvbGxhcHNlLnBuZyIsInN1Ym1lbnVfYXJyb3dfd2lkdGgiOiI0MCIsInN1Ym1lbnVfYXJyb3dfd2lkdGhfdW5pdCI6InB4Iiwic3VibWVudV9hcnJvd19oZWlnaHQiOiI0MCIsInN1Ym1lbnVfYXJyb3dfaGVpZ2h0X3VuaXQiOiJweCIsImFycm93X3Bvc2l0aW9uIjoicmlnaHQiLCJtZW51X3N1Yl9hcnJvd19zaGFwZV9jb2xvdXIiOiIjZmZmZmZmIiwibWVudV9zdWJfYXJyb3dfc2hhcGVfaG92ZXJfY29sb3VyIjoiI2ZmZmZmZiIsIm1lbnVfc3ViX2Fycm93X3NoYXBlX2NvbG91cl9hY3RpdmUiOiIjZmZmZmZmIiwibWVudV9zdWJfYXJyb3dfc2hhcGVfaG92ZXJfY29sb3VyX2FjdGl2ZSI6IiNmZmZmZmYiLCJtZW51X3N1Yl9hcnJvd19ib3JkZXJfd2lkdGgiOiIxIiwibWVudV9zdWJfYXJyb3dfYm9yZGVyX3dpZHRoX3VuaXQiOiJweCIsIm1lbnVfc3ViX2Fycm93X2JvcmRlcl9jb2xvdXIiOiIjZmZmZmZmIiwibWVudV9zdWJfYXJyb3dfYm9yZGVyX2hvdmVyX2NvbG91ciI6IiNmZmZmZmYiLCJtZW51X3N1Yl9hcnJvd19ib3JkZXJfY29sb3VyX2FjdGl2ZSI6IiNmZmZmZmYiLCJtZW51X3N1Yl9hcnJvd19ib3JkZXJfaG92ZXJfY29sb3VyX2FjdGl2ZSI6IiNmZmZmZmYiLCJtZW51X3N1Yl9hcnJvd19iYWNrZ3JvdW5kX2NvbG91ciI6IiM0ODRmNWQiLCJtZW51X3N1Yl9hcnJvd19iYWNrZ3JvdW5kX2hvdmVyX2NvbG91ciI6IiM0ODRmNWQiLCJtZW51X3N1Yl9hcnJvd19iYWNrZ3JvdW5kX2NvbG91cl9hY3RpdmUiOiIjNDg0ZjVkIiwibWVudV9zdWJfYXJyb3dfYmFja2dyb3VuZF9ob3Zlcl9jb2xvdXJfYWN0aXZlIjoiIzQ4NGY1ZCIsImZhZGVfc3VibWVudXMiOiJvZmYiLCJmYWRlX3N1Ym1lbnVzX3NpZGUiOiJsZWZ0IiwiZmFkZV9zdWJtZW51c19kZWxheSI6IjEwMCIsImZhZGVfc3VibWVudXNfc3BlZWQiOiI1MDAiLCJ1c2Vfc2xpZGVfZWZmZWN0Ijoib2ZmIiwic2xpZGVfZWZmZWN0X2JhY2tfdG9fdGV4dCI6IkJhY2siLCJhY2NvcmRpb25fYW5pbWF0aW9uIjoib24iLCJhdXRvX2V4cGFuZF9hbGxfc3VibWVudXMiOiJvZmYiLCJhdXRvX2V4cGFuZF9jdXJyZW50X3N1Ym1lbnVzIjoib2ZmIiwibWVudV9pdGVtX2NsaWNrX3RvX3RyaWdnZXJfc3VibWVudSI6Im9mZiIsImJ1dHRvbl93aWR0aCI6IjQ1IiwiYnV0dG9uX3dpZHRoX3VuaXQiOiJweCIsImJ1dHRvbl9oZWlnaHQiOiI0NSIsImJ1dHRvbl9oZWlnaHRfdW5pdCI6InB4IiwiYnV0dG9uX2JhY2tncm91bmRfY29sb3VyIjoiIzAwMDAwMCIsImJ1dHRvbl9iYWNrZ3JvdW5kX2NvbG91cl9ob3ZlciI6IiMwMDAwMDAiLCJidXR0b25fYmFja2dyb3VuZF9jb2xvdXJfYWN0aXZlIjoiIzAwMDAwMCIsInRvZ2dsZV9idXR0b25fYm9yZGVyX3JhZGl1cyI6IjUiLCJidXR0b25fdHJhbnNwYXJlbnRfYmFja2dyb3VuZCI6Im9uIiwiYnV0dG9uX2xlZnRfb3JfcmlnaHQiOiJyaWdodCIsImJ1dHRvbl9wb3NpdGlvbl90eXBlIjoiZml4ZWQiLCJidXR0b25fZGlzdGFuY2VfZnJvbV9zaWRlIjoiNSIsImJ1dHRvbl9kaXN0YW5jZV9mcm9tX3NpZGVfdW5pdCI6IiUiLCJidXR0b25fdG9wIjoiMTUiLCJidXR0b25fdG9wX3VuaXQiOiJweCIsImJ1dHRvbl9wdXNoX3dpdGhfYW5pbWF0aW9uIjoib2ZmIiwiYnV0dG9uX2NsaWNrX2FuaW1hdGlvbiI6ImJvcmluZyIsImJ1dHRvbl9saW5lX21hcmdpbiI6IjUiLCJidXR0b25fbGluZV9tYXJnaW5fdW5pdCI6InB4IiwiYnV0dG9uX2xpbmVfd2lkdGgiOiIyNSIsImJ1dHRvbl9saW5lX3dpZHRoX3VuaXQiOiJweCIsImJ1dHRvbl9saW5lX2hlaWdodCI6IjIiLCJidXR0b25fbGluZV9oZWlnaHRfdW5pdCI6InB4IiwiYnV0dG9uX2xpbmVfY29sb3VyIjoiIzAwMDAwMCIsImJ1dHRvbl9saW5lX2NvbG91cl9ob3ZlciI6IiMwMDAwMDAiLCJidXR0b25fbGluZV9jb2xvdXJfYWN0aXZlIjoiIzAwMDAwMCIsImJ1dHRvbl9mb250X2ljb24iOiIiLCJidXR0b25fZm9udF9pY29uX3doZW5fY2xpY2tlZCI6IiIsImJ1dHRvbl9pbWFnZSI6IiIsImJ1dHRvbl9pbWFnZV93aGVuX2NsaWNrZWQiOiIiLCJidXR0b25fdGl0bGUiOiIiLCJidXR0b25fdGl0bGVfb3BlbiI6IiIsImJ1dHRvbl90aXRsZV9wb3NpdGlvbiI6ImxlZnQiLCJtZW51X2NvbnRhaW5lcl9jb2x1bW5zIjoiIiwiYnV0dG9uX2ZvbnQiOiIiLCJidXR0b25fZm9udF9zaXplIjoiMTQiLCJidXR0b25fZm9udF9zaXplX3VuaXQiOiJweCIsImJ1dHRvbl90aXRsZV9saW5lX2hlaWdodCI6IjEzIiwiYnV0dG9uX3RpdGxlX2xpbmVfaGVpZ2h0X3VuaXQiOiJweCIsImJ1dHRvbl90ZXh0X2NvbG91ciI6IiNmZmZmZmYiLCJidXR0b25fdHJpZ2dlcl90eXBlX2NsaWNrIjoib24iLCJidXR0b25fdHJpZ2dlcl90eXBlX2hvdmVyIjoib2ZmIiwiYnV0dG9uX2NsaWNrX3RyaWdnZXIiOiIjcmVzcG9uc2l2ZS1tZW51LWJ1dHRvbiIsIml0ZW1zX29yZGVyIjp7InRpdGxlIjoib24iLCJtZW51Ijoib24iLCJzZWFyY2giOiIiLCJhZGRpdGlvbmFsIGNvbnRlbnQiOiIifSwibWVudV90aXRsZSI6IiIsIm1lbnVfdGl0bGVfbGluayI6IiIsIm1lbnVfdGl0bGVfbGlua19sb2NhdGlvbiI6Il9zZWxmIiwibWVudV90aXRsZV9pbWFnZSI6IiIsIm1lbnVfdGl0bGVfZm9udF9pY29uIjoiIiwibWVudV90aXRsZV9zZWN0aW9uX3BhZGRpbmciOnsidG9wIjoiMTAlIiwicmlnaHQiOiI1JSIsImJvdHRvbSI6IjAlIiwibGVmdCI6IjUlIn0sIm1lbnVfdGl0bGVfYmFja2dyb3VuZF9jb2xvdXIiOiIjMzAzNzQ1IiwibWVudV90aXRsZV9iYWNrZ3JvdW5kX2hvdmVyX2NvbG91ciI6IiMzMDM3NDUiLCJtZW51X3RpdGxlX2ZvbnRfc2l6ZSI6IjE2IiwibWVudV90aXRsZV9mb250X3NpemVfdW5pdCI6InB4IiwibWVudV90aXRsZV9hbGlnbm1lbnQiOiJsZWZ0IiwibWVudV90aXRsZV9mb250X3dlaWdodCI6IjQwMCIsIm1lbnVfdGl0bGVfZm9udF9mYW1pbHkiOiIiLCJtZW51X3RpdGxlX2NvbG91ciI6IiNmZmZmZmYiLCJtZW51X3RpdGxlX2hvdmVyX2NvbG91ciI6IiNmZmZmZmYiLCJtZW51X3RpdGxlX2ltYWdlX3dpZHRoIjoiIiwibWVudV90aXRsZV9pbWFnZV93aWR0aF91bml0IjoiJSIsIm1lbnVfdGl0bGVfaW1hZ2VfaGVpZ2h0IjoiIiwibWVudV90aXRsZV9pbWFnZV9oZWlnaHRfdW5pdCI6InB4IiwibWVudV9hZGRpdGlvbmFsX2NvbnRlbnQiOiIiLCJtZW51X2FkZGl0aW9uYWxfc2VjdGlvbl9wYWRkaW5nIjp7ImxlZnQiOiI1JSIsInRvcCI6IjBweCIsInJpZ2h0IjoiNSUiLCJib3R0b20iOiIwcHgifSwibWVudV9hZGRpdGlvbmFsX2NvbnRlbnRfZm9udF9zaXplIjoiMTYiLCJtZW51X2FkZGl0aW9uYWxfY29udGVudF9mb250X3NpemVfdW5pdCI6InB4IiwibWVudV9hZGRpdGlvbmFsX2NvbnRlbnRfYWxpZ25tZW50IjoiY2VudGVyIiwibWVudV9hZGRpdGlvbmFsX2NvbnRlbnRfY29sb3VyIjoiI2ZmZmZmZiIsIm1lbnVfc2VhcmNoX2JveF90ZXh0IjoiU2VhcmNoIiwibWVudV9zZWFyY2hfYm94X2NvZGUiOiIiLCJtZW51X3NlYXJjaF9zZWN0aW9uX3BhZGRpbmciOnsibGVmdCI6IjUlIiwidG9wIjoiMHB4IiwicmlnaHQiOiI1JSIsImJvdHRvbSI6IjBweCJ9LCJtZW51X3NlYXJjaF9ib3hfaGVpZ2h0IjoiNDUiLCJtZW51X3NlYXJjaF9ib3hfaGVpZ2h0X3VuaXQiOiJweCIsIm1lbnVfc2VhcmNoX2JveF9ib3JkZXJfcmFkaXVzIjoiMzAiLCJtZW51X3NlYXJjaF9ib3hfdGV4dF9jb2xvdXIiOiIjMzMzMzMzIiwibWVudV9zZWFyY2hfYm94X2JhY2tncm91bmRfY29sb3VyIjoiI2ZmZmZmZiIsIm1lbnVfc2VhcmNoX2JveF9wbGFjZWhvbGRlcl9jb2xvdXIiOiIjYzdjN2NkIiwibWVudV9zZWFyY2hfYm94X2JvcmRlcl9jb2xvdXIiOiIjZGFkYWRhIiwibWVudV9zZWN0aW9uX3BhZGRpbmciOnsidG9wIjoiMHB4IiwicmlnaHQiOiIwcHgiLCJib3R0b20iOiIwcHgiLCJsZWZ0IjoiMHB4In0sIm1lbnVfd2lkdGgiOiI3NSIsIm1lbnVfd2lkdGhfdW5pdCI6IiUiLCJtZW51X21heGltdW1fd2lkdGgiOiIiLCJtZW51X21heGltdW1fd2lkdGhfdW5pdCI6InB4IiwibWVudV9taW5pbXVtX3dpZHRoIjoiIiwibWVudV9taW5pbXVtX3dpZHRoX3VuaXQiOiJweCIsIm1lbnVfYXV0b19oZWlnaHQiOiJvZmYiLCJtZW51X2NvbnRhaW5lcl9wYWRkaW5nIjp7InRvcCI6IjBweCIsInJpZ2h0IjoiMHB4IiwiYm90dG9tIjoiMHB4IiwibGVmdCI6IjBweCJ9LCJtZW51X2NvbnRhaW5lcl9iYWNrZ3JvdW5kX2NvbG91ciI6IiMzMDM3NDUiLCJtZW51X2JhY2tncm91bmRfaW1hZ2UiOiIiLCJhbmltYXRpb25fdHlwZSI6InNsaWRlIiwibWVudV9hcHBlYXJfZnJvbSI6InJpZ2h0IiwiYW5pbWF0aW9uX3NwZWVkIjoiMC41IiwicGFnZV93cmFwcGVyIjoiIiwibWVudV9jbG9zZV9vbl9ib2R5X2NsaWNrIjoib2ZmIiwibWVudV9jbG9zZV9vbl9zY3JvbGwiOiJvZmYiLCJtZW51X2Nsb3NlX29uX2xpbmtfY2xpY2siOiJvZmYiLCJlbmFibGVfdG91Y2hfZ2VzdHVyZXMiOiIiLCJhY3RpdmVfYXJyb3dfZm9udF9pY29uX3R5cGUiOiJmb250LWF3ZXNvbWUiLCJhY3RpdmVfYXJyb3dfaW1hZ2VfYWx0IjoiIiwiYWRtaW5fdGhlbWUiOiJkYXJrIiwiYnJlYWtwb2ludCI6Ijk3OSIsImJ1dHRvbl9mb250X2ljb25fdHlwZSI6ImZvbnQtYXdlc29tZSIsImJ1dHRvbl9mb250X2ljb25fd2hlbl9jbGlja2VkX3R5cGUiOiJmb250LWF3ZXNvbWUiLCJidXR0b25faW1hZ2VfYWx0IjoiIiwiYnV0dG9uX2ltYWdlX2FsdF93aGVuX2NsaWNrZWQiOiIiLCJidXR0b25fdHJpZ2dlcl90eXBlIjoiY2xpY2siLCJjdXN0b21fY3NzIjoiIiwiZGVza3RvcF9tZW51X29wdGlvbnMiOiJ7XCI2NzlcIjp7XCJ0eXBlXCI6XCJzdGFuZGFyZFwiLFwid2lkdGhcIjpcImF1dG9cIixcInBhcmVudF9iYWNrZ3JvdW5kX2NvbG91clwiOlwiXCIsXCJwYXJlbnRfYmFja2dyb3VuZF9pbWFnZVwiOlwiXCJ9LFwiNTY5XCI6e1wid2lkdGhcIjpcImF1dG9cIixcIndpZGdldHNcIjpbe1widGl0bGVcIjp7XCJlbmFibGVkXCI6XCJ0cnVlXCJ9fV19LFwiNTcwXCI6e1wid2lkdGhcIjpcImF1dG9cIixcIndpZGdldHNcIjpbe1widGl0bGVcIjp7XCJlbmFibGVkXCI6XCJ0cnVlXCJ9fV19LFwiNTcxXCI6e1wid2lkdGhcIjpcImF1dG9cIixcIndpZGdldHNcIjpbe1widGl0bGVcIjp7XCJlbmFibGVkXCI6XCJ0cnVlXCJ9fV19LFwiNTcyXCI6e1wid2lkdGhcIjpcImF1dG9cIixcIndpZGdldHNcIjpbe1widGl0bGVcIjp7XCJlbmFibGVkXCI6XCJ0cnVlXCJ9fV19LFwiNTczXCI6e1wid2lkdGhcIjpcImF1dG9cIixcIndpZGdldHNcIjpbe1widGl0bGVcIjp7XCJlbmFibGVkXCI6XCJ0cnVlXCJ9fV19LFwiNTc0XCI6e1wid2lkdGhcIjpcImF1dG9cIixcIndpZGdldHNcIjpbe1widGl0bGVcIjp7XCJlbmFibGVkXCI6XCJ0cnVlXCJ9fV19LFwiNTc1XCI6e1wid2lkdGhcIjpcImF1dG9cIixcIndpZGdldHNcIjpbe1widGl0bGVcIjp7XCJlbmFibGVkXCI6XCJ0cnVlXCJ9fV19LFwiNTc2XCI6e1wid2lkdGhcIjpcImF1dG9cIixcIndpZGdldHNcIjpbe1widGl0bGVcIjp7XCJlbmFibGVkXCI6XCJ0cnVlXCJ9fV19LFwiNTc3XCI6e1wid2lkdGhcIjpcImF1dG9cIixcIndpZGdldHNcIjpbe1widGl0bGVcIjp7XCJlbmFibGVkXCI6XCJ0cnVlXCJ9fV19LFwiNTc4XCI6e1wid2lkdGhcIjpcImF1dG9cIixcIndpZGdldHNcIjpbe1widGl0bGVcIjp7XCJlbmFibGVkXCI6XCJ0cnVlXCJ9fV19LFwiNTc5XCI6e1wid2lkdGhcIjpcImF1dG9cIixcIndpZGdldHNcIjpbe1widGl0bGVcIjp7XCJlbmFibGVkXCI6XCJ0cnVlXCJ9fV19LFwiNjgwXCI6e1widHlwZVwiOlwic3RhbmRhcmRcIixcIndpZHRoXCI6XCJhdXRvXCIsXCJwYXJlbnRfYmFja2dyb3VuZF9jb2xvdXJcIjpcIlwiLFwicGFyZW50X2JhY2tncm91bmRfaW1hZ2VcIjpcIlwifSxcIjU4MVwiOntcIndpZHRoXCI6XCJhdXRvXCIsXCJ3aWRnZXRzXCI6W3tcInRpdGxlXCI6e1wiZW5hYmxlZFwiOlwidHJ1ZVwifX1dfSxcIjU4MlwiOntcIndpZHRoXCI6XCJhdXRvXCIsXCJ3aWRnZXRzXCI6W3tcInRpdGxlXCI6e1wiZW5hYmxlZFwiOlwidHJ1ZVwifX1dfSxcIjU4M1wiOntcIndpZHRoXCI6XCJhdXRvXCIsXCJ3aWRnZXRzXCI6W3tcInRpdGxlXCI6e1wiZW5hYmxlZFwiOlwidHJ1ZVwifX1dfSxcIjU4NFwiOntcIndpZHRoXCI6XCJhdXRvXCIsXCJ3aWRnZXRzXCI6W3tcInRpdGxlXCI6e1wiZW5hYmxlZFwiOlwidHJ1ZVwifX1dfSxcIjU4NVwiOntcIndpZHRoXCI6XCJhdXRvXCIsXCJ3aWRnZXRzXCI6W3tcInRpdGxlXCI6e1wiZW5hYmxlZFwiOlwidHJ1ZVwifX1dfSxcIjU4NlwiOntcIndpZHRoXCI6XCJhdXRvXCIsXCJ3aWRnZXRzXCI6W3tcInRpdGxlXCI6e1wiZW5hYmxlZFwiOlwidHJ1ZVwifX1dfSxcIjU4N1wiOntcIndpZHRoXCI6XCJhdXRvXCIsXCJ3aWRnZXRzXCI6W3tcInRpdGxlXCI6e1wiZW5hYmxlZFwiOlwidHJ1ZVwifX1dfSxcIjU4OFwiOntcIndpZHRoXCI6XCJhdXRvXCIsXCJ3aWRnZXRzXCI6W3tcInRpdGxlXCI6e1wiZW5hYmxlZFwiOlwidHJ1ZVwifX1dfSxcIjU4OVwiOntcIndpZHRoXCI6XCJhdXRvXCIsXCJ3aWRnZXRzXCI6W3tcInRpdGxlXCI6e1wiZW5hYmxlZFwiOlwidHJ1ZVwifX1dfSxcIjU5MFwiOntcIndpZHRoXCI6XCJhdXRvXCIsXCJ3aWRnZXRzXCI6W3tcInRpdGxlXCI6e1wiZW5hYmxlZFwiOlwidHJ1ZVwifX1dfSxcIjU5MVwiOntcIndpZHRoXCI6XCJhdXRvXCIsXCJ3aWRnZXRzXCI6W3tcInRpdGxlXCI6e1wiZW5hYmxlZFwiOlwidHJ1ZVwifX1dfSxcIjU5MlwiOntcInR5cGVcIjpcInN0YW5kYXJkXCIsXCJ3aWR0aFwiOlwiYXV0b1wiLFwicGFyZW50X2JhY2tncm91bmRfY29sb3VyXCI6XCJcIixcInBhcmVudF9iYWNrZ3JvdW5kX2ltYWdlXCI6XCJcIn0sXCI2MDZcIjp7XCJ0eXBlXCI6XCJzdGFuZGFyZFwiLFwid2lkdGhcIjpcImF1dG9cIixcInBhcmVudF9iYWNrZ3JvdW5kX2NvbG91clwiOlwiXCIsXCJwYXJlbnRfYmFja2dyb3VuZF9pbWFnZVwiOlwiXCJ9LFwiNTkzXCI6e1widHlwZVwiOlwic3RhbmRhcmRcIixcIndpZHRoXCI6XCJhdXRvXCIsXCJwYXJlbnRfYmFja2dyb3VuZF9jb2xvdXJcIjpcIlwiLFwicGFyZW50X2JhY2tncm91bmRfaW1hZ2VcIjpcIlwifSxcIjU5NFwiOntcInR5cGVcIjpcInN0YW5kYXJkXCIsXCJ3aWR0aFwiOlwiYXV0b1wiLFwicGFyZW50X2JhY2tncm91bmRfY29sb3VyXCI6XCJcIixcInBhcmVudF9iYWNrZ3JvdW5kX2ltYWdlXCI6XCJcIn0sXCI1OTVcIjp7XCJ0eXBlXCI6XCJzdGFuZGFyZFwiLFwid2lkdGhcIjpcImF1dG9cIixcInBhcmVudF9iYWNrZ3JvdW5kX2NvbG91clwiOlwiXCIsXCJwYXJlbnRfYmFja2dyb3VuZF9pbWFnZVwiOlwiXCJ9fSIsImV4Y2x1ZGVkX3BhZ2VzIjpudWxsLCJleHRlcm5hbF9maWxlcyI6Im9mZiIsImhlYWRlcl9iYXJfbG9nb19hbHQiOiIiLCJoaWRlX29uX2Rlc2t0b3AiOiJvZmYiLCJoaWRlX29uX21vYmlsZSI6Im9mZiIsImluYWN0aXZlX2Fycm93X2ZvbnRfaWNvbl90eXBlIjoiZm9udC1hd2Vzb21lIiwiaW5hY3RpdmVfYXJyb3dfaW1hZ2VfYWx0IjoiIiwia2V5Ym9hcmRfc2hvcnRjdXRfY2xvc2VfbWVudSI6IjI3LDM3Iiwia2V5Ym9hcmRfc2hvcnRjdXRfb3Blbl9tZW51IjoiMzIsMzkiLCJtZW51X2FkanVzdF9mb3Jfd3BfYWRtaW5fYmFyIjoib2ZmIiwibWVudV9kZXB0aF81IjoiMzAiLCJtZW51X2RlcHRoXzVfdW5pdCI6IiUiLCJtZW51X3RpdGxlX2ZvbnRfaWNvbl90eXBlIjoiZm9udC1hd2Vzb21lIiwibWVudV90aXRsZV9pbWFnZV9hbHQiOiIiLCJtaW5pZnlfc2NyaXB0cyI6Im9mZiIsIm1vYmlsZV9vbmx5Ijoib2ZmIiwicmVtb3ZlX2Jvb3RzdHJhcCI6IiIsInJlbW92ZV9mb250YXdlc29tZSI6IiIsInNjcmlwdHNfaW5fZm9vdGVyIjoib2ZmIiwic2hvcnRjb2RlIjoib2ZmIiwic2luZ2xlX21lbnVfZm9udCI6IiIsInNpbmdsZV9tZW51X2ZvbnRfc2l6ZSI6IjE0Iiwic2luZ2xlX21lbnVfZm9udF9zaXplX3VuaXQiOiJweCIsInNpbmdsZV9tZW51X2hlaWdodCI6IjgwIiwic2luZ2xlX21lbnVfaGVpZ2h0X3VuaXQiOiJweCIsInNpbmdsZV9tZW51X2l0ZW1fYmFja2dyb3VuZF9jb2xvdXIiOiIjZmZmZmZmIiwic2luZ2xlX21lbnVfaXRlbV9iYWNrZ3JvdW5kX2NvbG91cl9ob3ZlciI6IiNmZmZmZmYiLCJzaW5nbGVfbWVudV9pdGVtX2xpbmtfY29sb3VyIjoiIzAwMDAwMCIsInNpbmdsZV9tZW51X2l0ZW1fbGlua19jb2xvdXJfaG92ZXIiOiIjMDAwMDAwIiwic2luZ2xlX21lbnVfaXRlbV9zdWJtZW51X2JhY2tncm91bmRfY29sb3VyIjoiI2ZmZmZmZiIsInNpbmdsZV9tZW51X2l0ZW1fc3VibWVudV9iYWNrZ3JvdW5kX2NvbG91cl9ob3ZlciI6IiNmZmZmZmYiLCJzaW5nbGVfbWVudV9pdGVtX3N1Ym1lbnVfbGlua19jb2xvdXIiOiIjMDAwMDAwIiwic2luZ2xlX21lbnVfaXRlbV9zdWJtZW51X2xpbmtfY29sb3VyX2hvdmVyIjoiIzAwMDAwMCIsInNpbmdsZV9tZW51X2xpbmVfaGVpZ2h0IjoiODAiLCJzaW5nbGVfbWVudV9saW5lX2hlaWdodF91bml0IjoicHgiLCJzaW5nbGVfbWVudV9zdWJtZW51X2ZvbnQiOiIiLCJzaW5nbGVfbWVudV9zdWJtZW51X2ZvbnRfc2l6ZSI6IjEyIiwic2luZ2xlX21lbnVfc3VibWVudV9mb250X3NpemVfdW5pdCI6InB4Iiwic2luZ2xlX21lbnVfc3VibWVudV9oZWlnaHQiOiIiLCJzaW5nbGVfbWVudV9zdWJtZW51X2hlaWdodF91bml0IjoiYXV0byIsInNpbmdsZV9tZW51X3N1Ym1lbnVfbGluZV9oZWlnaHQiOiI0MCIsInNpbmdsZV9tZW51X3N1Ym1lbnVfbGluZV9oZWlnaHRfdW5pdCI6InB4IiwibWVudV90aXRsZV9wYWRkaW5nIjp7ImxlZnQiOiI1JSIsInRvcCI6IjBweCIsInJpZ2h0IjoiNSUiLCJib3R0b20iOiIwcHgifSwibWVudV9pZCI6NzU1LCJhY3RpdmVfdG9nZ2xlX2NvbnRlbnRzIjoiPGltZyBhbHQ9XCJcIiBzcmM9XCJodHRwczpcL1wvd3d3LmhpdGVjaGZlYS5jb21cL3dwLWNvbnRlbnRcL3RoZW1lc1wvaGl0ZWNoZmVhXC9pbWFnZXNcL21lbnUtY29sbGFwc2UucG5nXCIgXC8+IiwiaW5hY3RpdmVfdG9nZ2xlX2NvbnRlbnRzIjoiPGltZyBhbHQ9XCJcIiBzcmM9XCJodHRwczpcL1wvd3d3LmhpdGVjaGZlYS5jb21cL3dwLWNvbnRlbnRcL3RoZW1lc1wvaGl0ZWNoZmVhXC9pbWFnZXNcL21lbnUtZXhwYW5kLnBuZ1wiIFwvPiJ9XX07Ci8qIF1dPiAqLwo>/script> script defer typetext/javascript srchttps://www.hitechfea.com/wp-content/cache/autoptimize/js/autoptimize_single_e53ce907f23d4d6903d92ea32cd17a46.js?ver4.4.2 idrmp_menu_scripts-js>/script> script defer typetext/javascript srchttps://www.hitechfea.com/wp-content/plugins/wp-user-avatar/assets/flatpickr/flatpickr.min.js?ver4.15.17 idppress-flatpickr-js>/script> script defer typetext/javascript srchttps://www.hitechfea.com/wp-content/plugins/wp-user-avatar/assets/select2/select2.min.js?ver4.15.17 idppress-select2-js>/script> link relhttps://api.w.org/ hrefhttps://www.hitechfea.com/wp-json/ />link relalternate titleJSON typeapplication/json hrefhttps://www.hitechfea.com/wp-json/wp/v2/pages/7 />link relEditURI typeapplication/rsd+xml titleRSD hrefhttps://www.hitechfea.com/xmlrpc.php?rsd />link relshortlink hrefhttps://www.hitechfea.com/ />link relalternate titleoEmbed (JSON) typeapplication/json+oembed hrefhttps://www.hitechfea.com/wp-json/oembed/1.0/embed?urlhttps%3A%2F%2Fwww.hitechfea.com%2F />link relalternate titleoEmbed (XML) typetext/xml+oembed hrefhttps://www.hitechfea.com/wp-json/oembed/1.0/embed?urlhttps%3A%2F%2Fwww.hitechfea.com%2F&formatxml />style>:root { --lazy-loader-animation-duration: 300ms; } .lazyload { display: block;}.lazyload, .lazyloading { opacity: 0; } .lazyloaded { opacity: 1; transition: opacity 300ms; transition: opacity var(--lazy-loader-animation-duration); }.lazyloading { color: transparent; opacity: 1; transition: opacity 300ms; transition: opacity var(--lazy-loader-animation-duration); background: url(data:image/svg+xml,%3Csvg%20width%3D%2244%22%20height%3D%2244%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20stroke%3D%22%23333333%22%3E%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%20stroke-width%3D%222%22%3E%3Ccircle%20cx%3D%2222%22%20cy%3D%2222%22%20r%3D%221%22%3E%3Canimate%20attributeName%3D%22r%22%20begin%3D%220s%22%20dur%3D%221.8s%22%20values%3D%221%3B%2020%22%20calcMode%3D%22spline%22%20keyTimes%3D%220%3B%201%22%20keySplines%3D%220.165%2C%200.84%2C%200.44%2C%201%22%20repeatCount%3D%22indefinite%22%2F%3E%3Canimate%20attributeName%3D%22stroke-opacity%22%20begin%3D%220s%22%20dur%3D%221.8s%22%20values%3D%221%3B%200%22%20calcMode%3D%22spline%22%20keyTimes%3D%220%3B%201%22%20keySplines%3D%220.3%2C%200.61%2C%200.355%2C%201%22%20repeatCount%3D%22indefinite%22%2F%3E%3C%2Fcircle%3E%3Ccircle%20cx%3D%2222%22%20cy%3D%2222%22%20r%3D%221%22%3E%3Canimate%20attributeName%3D%22r%22%20begin%3D%22-0.9s%22%20dur%3D%221.8s%22%20values%3D%221%3B%2020%22%20calcMode%3D%22spline%22%20keyTimes%3D%220%3B%201%22%20keySplines%3D%220.165%2C%200.84%2C%200.44%2C%201%22%20repeatCount%3D%22indefinite%22%2F%3E%3Canimate%20attributeName%3D%22stroke-opacity%22%20begin%3D%22-0.9s%22%20dur%3D%221.8s%22%20values%3D%221%3B%200%22%20calcMode%3D%22spline%22%20keyTimes%3D%220%3B%201%22%20keySplines%3D%220.3%2C%200.61%2C%200.355%2C%201%22%20repeatCount%3D%22indefinite%22%2F%3E%3C%2Fcircle%3E%3C%2Fg%3E%3C%2Fsvg%3E) no-repeat; background-size: 2em 2em; background-position: center center;}.lazyloaded { animation-name: loaded; animation-duration: 300ms; animation-duration: var(--lazy-loader-animation-duration); transition: none;}@keyframes loaded { from { opacity: 0; } to { opacity: 1; }}/style>noscript>style>.lazyload { display: none; } .lazyloadclass*lazy-loader-background-element- { display: block; opacity: 1; }/style>/noscript>meta namehubbub-info descriptionHubbub 1.34.7>/head>body>div classcontainer>div classwrapper idheader>div classfl>a hrefhttps://www.hitechfea.com/ title Hi-Tech FEA >img srchttps://www.hitechfea.com/wp-content/themes/hitechfea/images/hitech-fea-logo.svg alt classlogo />/a>/div>div classfr topicons> a hrefcallto:+917940003252 classiconphone titleCall Us>+91-794-000-3252/a> a hrefmailto:info@hitechfea.com?SubjectHi%20-%20Tech%20FEA%20-%20Email%20Us classiconemail titleEmail Us>info@hitechfea.com/a> a hrefmailto:info@autocaddraftingindia.com?SubjectHi%20-%20Tech%20FEA%20-%20Email%20Us classdesktop-off mobileemail titleEmail Us>/a> a hrefcallto:+917940003252 classdesktop-off mobilephone titleCall Us>/a>/div>div classclr>/div>/div>div classclr>/div>div idmenuicon>/div>div classwrapper idnav>nav>div classmenu-mainmenu-container>ul idmenu-mainmenu classmenu>li idmenu-item-679 classmegamenu menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-679>a hrefhttps://www.hitechfea.com/fea-analysis-services.html>Services/a>ul classsub-menu>li idmenu-item-569 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-569>a hrefhttps://www.hitechfea.com/static-fea-analysis-services.html>Static FEA Analysis/a>/li>li idmenu-item-570 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-570>a hrefhttps://www.hitechfea.com/thermal-analysis-services.html>Thermal Analysis/a>/li>li idmenu-item-571 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-571>a hrefhttps://www.hitechfea.com/dynamic-analysis-services.html>Dynamic Analysis/a>ul classsub-menu>li idmenu-item-572 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-572>a hrefhttps://www.hitechfea.com/buckling-analysis-services.html>Buckling Analysis/a>/li>li idmenu-item-573 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-573>a hrefhttps://www.hitechfea.com/crash-analysis-services.html>Crash Analysis/a>/li>li idmenu-item-574 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-574>a hrefhttps://www.hitechfea.com/harmonic-analysis-services.html>Harmonic Analysis/a>/li>li idmenu-item-575 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-575>a hrefhttps://www.hitechfea.com/modal-analysis-services.html>Modal Analysis/a>/li>li idmenu-item-576 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-576>a hrefhttps://www.hitechfea.com/seismic-analysis-services.html>Seismic Analysis/a>/li>/ul>/li>li idmenu-item-577 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-577>a hrefhttps://www.hitechfea.com/fatigue-analysis-services.html>Fatigue Analysis/a>/li>li idmenu-item-578 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-578>a hrefhttps://www.hitechfea.com/coupled-field-analysis-services.html>Coupled Field Analysis/a>/li>li idmenu-item-579 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-579>a hrefhttps://www.hitechfea.com/manufacturing-process-simulation-services.html>Manufacturing Process Simulation/a>/li>/ul>/li>li idmenu-item-680 classmegamenu menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-680>a hrefhttps://www.hitechfea.com/fea-projects.html>Projects/a>ul classsub-menu>li idmenu-item-581 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-581>a hrefhttps://www.hitechfea.com/bracket-fea-analysis.html>Bracket FEA Analysis/a>/li>li idmenu-item-582 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-582>a hrefhttps://www.hitechfea.com/bracket-structural-analysis.html>Bracket Structural Analysis/a>/li>li idmenu-item-583 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-583>a hrefhttps://www.hitechfea.com/curing-tool-thermal-analysis.html>Curing Tool Thermal Analysis/a>/li>li idmenu-item-584 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-584>a hrefhttps://www.hitechfea.com/fifth-wheel-assembly.html>Fifth Wheel Assembly/a>/li>li idmenu-item-585 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-585>a hrefhttps://www.hitechfea.com/oil-tank-static-structural-analysis.html>Oil Tank Static Structural Analysis/a>/li>li idmenu-item-586 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-586>a hrefhttps://www.hitechfea.com/plastic-pin-stress-analysis.html>Plastic Pin Stress Analysis/a>/li>li idmenu-item-587 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-587>a hrefhttps://www.hitechfea.com/storage-frames-dynamics.html>Storage Frames Dynamics/a>/li>li idmenu-item-588 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-588>a hrefhttps://www.hitechfea.com/valve-body-fea-analysis.html>Valve Body FEA Analysis/a>/li>li idmenu-item-589 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-589>a hrefhttps://www.hitechfea.com/structural-optimization-of-breaker-plate-for-auto-screening-machine.html>Breaker Plate for Auto Machine/a>/li>li idmenu-item-590 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-590>a hrefhttps://www.hitechfea.com/seismic-qualification-of-industrial-pc-rack.html>Industrial PC Rack/a>/li>li idmenu-item-591 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-591>a hrefhttps://www.hitechfea.com/skid-accumulator-stress-analysis.html>Skid Accumulator Stress Analysis/a>/li>/ul>/li>li idmenu-item-592 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-592>a hrefhttps://www.hitechfea.com/clients.html>Clients/a>/li>li idmenu-item-606 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-606>a hrefhttps://www.hitechfea.com/fea-knowledgebase/>Blog/a>/li>li idmenu-item-593 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-593>a hrefhttps://www.hitechfea.com/about-us.html>About Us/a>/li>li idmenu-item-594 classmenu-item menu-item-type-post_type menu-item-object-page menu-item-594>a hrefhttps://www.hitechfea.com/contact-us.html>Contact Us/a>/li>li idmenu-item-595 classfr requestaquote mobile-off menu-item menu-item-type-post_type menu-item-object-page menu-item-595>a hrefhttps://www.hitechfea.com/request-quote.html>Request Quote/a>/li>/ul>/div>/nav>div classclr>/div>/div>div classclr>/div>div classclr>/div>div idhomebanner>div idbanner classhomebanner>div classbannerslide> picture> source media(max-width: 640px) srcsethttps://www.hitechfea.com/wp-content/themes/hitechfea/images/home-slider-1-640.jpg> source media(max-width: 480px) srcsethttps://www.hitechfea.com/wp-content/themes/hitechfea/images/home-slider-1-480.jpg> img srchttps://www.hitechfea.com/wp-content/themes/hitechfea/images/home-slider-1.jpg idinnerbannerimg1 althome slider hero image 1> /picture>div classwrapper>p classbannertext>Cost Effective span>FEA Analysis/span> Technical Excellence in span>Design Optimization/span>/p>/div>/div>div classbannerslide idbanner2> picture> source media(max-width: 640px) srcsethttps://www.hitechfea.com/wp-content/themes/hitechfea/images/home-slider-2-640.jpg> source media(max-width: 480px) srcsethttps://www.hitechfea.com/wp-content/themes/hitechfea/images/home-slider-2-480.jpg> img srchttps://www.hitechfea.com/wp-content/themes/hitechfea/images/home-slider-2.jpg idinnerbannerimg2 althome slider hero image 2> /picture>div classwrapper>p classbannertext>Collaborative Approch to span>Engineering Problems/span> span>Uncompromised & Fast/span> Approch to Solution/p>/div>/div>div classbannerslide idbanner3> picture> source media(max-width: 640px) srcsethttps://www.hitechfea.com/wp-content/themes/hitechfea/images/home-slider-3-640.jpg> source media(max-width: 480px) srcsethttps://www.hitechfea.com/wp-content/themes/hitechfea/images/home-slider-3-480.jpg> img srchttps://www.hitechfea.com/wp-content/themes/hitechfea/images/home-slider-3.jpg idinnerbannerimg3 althome slider hero image 3> /picture>div classwrapper>p classbannertext>Vast Experience of span>FEA Analysis in Various Industries/span> Large Team of span>Experienced Design Engineers/span>/p>/div>/div>/div>div classclr>/div>/div>div classclr>/div>div classwrapper idcontent>h1>FEA Consulting Services for Product Design Optimization/h1>p>Consistent pressure from competitors and the need to bring products to the market faster is forcing manufacturers to optimize and reinvent their existing product designs, and develop new economical products for the demanding market./p>p>We deliver product design solutions across multiple engineering domains through finite element analyses and assist organizations in developing strong, high-performance and cost-effective products. Reducing the product development schedules, our team of engineers and analysts help manufacturers to reduce time-to-market by identifying flaws in the product right from the early design stages./p>div classhomeshowcase>div classone-third fl>h2>FEA Analysis Services/h2>ul>li>a hrefstatic-fea-analysis-services.html titleStatic FEA Analysis>Static FEA Analysis/a>/li>li>a hrefdynamic-analysis-services.html titleDynamic Analysis>Dynamic Analysis/a>/li>li>a hreflinear-analysis-services.html titleLinear Analysis>Linear Analysis/a>/li>li>a hrefnonlinear-analysis-services.html titleNonlinear Analysis>Nonlinear Analysis/a>/li>li>a hreffatigue-analysis-services.html titleFatigue Analysis>Fatigue Analysis/a>/li>li>a hrefthermal-analysis-services.html titleThermal Analysis>Thermal Analysis/a>/li>li>a hrefcoupled-field-analysis-services.html titleCoupled Field Analysis>Coupled Field Analysis/a>/li>li>a hrefmanufacturing-process-simulation-services.html titleManufacturing Process Simulation services>Manufacturing Process Simulation/a>/li>/ul>/div>div classone-third fl>h2>FEA Solution for Industries/h2>ul>li>Aerospace/li>li>Automobile/li>li>Chemical Engineering/li>li>Civil Engineering/li>li>Energy / Oil & Gas/li>li>Heavy Equipment / Industries/li>li>Machine Parts & Tools/li>li>Medical Devices/li>/ul>/div>div classone-third fl>h2>FEA Software Expertise/h2>ul>li>ANSYS NLS/li>li>SolidWorks FEA/li>li>Design Modeler/li>li>SolidEdge/li>li>Inventor (PDS)/li>li>Pro/ENGINEER/li>li>Wildfire/li>li>Creo/li>/ul>/div>div classclr>/div>/div>div classclr>/div>div classcscontainer >h2>Case Studies/h2>div classinner-carousel>div classone-third fl cschild carousel-cell> a hrefhttps://www.hitechfea.com/shorten-design-cycle-for-thermal-radiation-detector-system.html titleFEA Shorten Design Cycle for Thermal Radiation Detector System target_blank> noscript>img decodingasync srchttps://www.hitechfea.com/wp-content/themes/hitechfea/images/fea-shortens-the-design-cycle-01.jpg alt>/noscript>img decodingasync srcdata:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7 alt data-srchttps://www.hitechfea.com/wp-content/themes/hitechfea/images/fea-shortens-the-design-cycle-01.jpg class lazyload> span>FEA shortens the Design Cycle for Thermal Radiation Detector System for Power Plant/span> /a>div classclr>/div>/div>div classone-third fl cschild carousel-cell> a hrefhttps://www.hitechfea.com/simulation-using-ansys-professional-nls.html titleSimulation using ANSYS Professional NLS helps to reduce Product Development Cycle target_blank> noscript>img decodingasync srchttps://www.hitechfea.com/wp-content/themes/hitechfea/images/simulation-using-ansys-professional-nls-01.jpg alt>/noscript>img decodingasync srcdata:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7 alt data-srchttps://www.hitechfea.com/wp-content/themes/hitechfea/images/simulation-using-ansys-professional-nls-01.jpg class lazyload> span>Simulation using ANSYS Professional NLS helps to reduce Product Development Cycle/span> /a>div classclr>/div>/div>div classone-third fl cschild carousel-cell> a hrefhttps://www.hitechfea.com/structural-services-of-rotor-assembly.html titleStructural Services of Rotor Assembly target_blank> noscript>img decodingasync srchttps://www.hitechfea.com/wp-content/themes/hitechfea/images/structural-services-of-rotor-assembly-01.jpg alt>/noscript>img decodingasync srcdata:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7 alt data-srchttps://www.hitechfea.com/wp-content/themes/hitechfea/images/structural-services-of-rotor-assembly-01.jpg class lazyload> span>Effective Static Structural Services conducting Structural Seismic Analysis of RTO System Base/span> /a>div classclr>/div>/div>/div>div classclr>/div>/div>div classclr>/div>div classhomeadvantages>h3>Why Choose Hi-Tech FEA?/h3>ul>li>Qualified CAE – FEA Engineers/li>li>Reduce product development costs and time-to-market/li>li>Large team of experienced design engineers to support our FEA team/li>li>Experience of working with many clients in the US, Canada, Europe and Australia/li>li>Solid base of computational architecture & technical infrastructure/li>li>Infrastructure scalability depending on the project’s requirements/li>li>Flexible project cost options – Fixed Price or Hourly Rates/li>/ul>div classclr>/div>/div>div classclr>/div>/div>/div>div classfooter container>div classwrapper>div classfl> a hrefhttps://www.hitechfea.com/privacy-policy.html titlePrivacy Policy>Privacy Policy/a> | a hrefhttps://www.hitechfea.com/sitemap.html titleSitemap>Sitamap/a> | a hrefhttps://www.hitechfea.com/contact-us.html titleContact Us>Contact Us/a>p>Copyright © 2024 Hi-Tech FEA All Rights Reserved./p>/div>div classfr> span classfooter-social> Get Connected a hrefhttps://www.facebook.com/hitechfeaservices/ titleFacebook>img srchttps://www.hitechfea.com/wp-content/themes/hitechfea/images/icon-facebook.svg altfacebook />/a> a hrefhttps://twitter.com/HiTechFEA titleTwitter>img srchttps://www.hitechfea.com/wp-content/themes/hitechfea/images/icon-twitter.svg alttwitter />/a> a hrefhttps://www.linkedin.com/company/hitech-fea titleLinkedin>img srchttps://www.hitechfea.com/wp-content/themes/hitechfea/images/icon-linkedin.svg altlinkedin />/a> /span>/div>/div>div classclr>/div>/div> script srchttps://www.hitechfea.com/wp-content/themes/hitechfea/js/jquery.min.js>/script> script defer srchttps://www.hitechfea.com/wp-content/themes/hitechfea/flickity.pkgd.min.js>/script> script typetext/javascript>var _gaq _gaq || ; _gaq.push(_setAccount, UA-37550973-1); _gaq.push(_trackPageview); (function() { var ga document.createElement(script); ga.type text/javascript; ga.async true; ga.src (https: document.location.protocol ? https://ssl : http://www) + .google-analytics.com/ga.js; var s document.getElementsByTagName(script)0; s.parentNode.insertBefore(ga, s); })();/script> script defer srcdata:text/javascript;base64,Cgl2YXIgc2NfcHJvamVjdD05NzM0NDQyOyAKCXZhciBzY19pbnZpc2libGU9MTsgCgl2YXIgc2Nfc2VjdXJpdHk9ImM4N2I2NjhmIjsgCg>/script> script typetext/javascript srchttps://www.statcounter.com/counter/counter.js async>/script> script defer srcdata:text/javascript;base64,CiQoJy5tYWluLWNhcm91c2VsJykuZmxpY2tpdHkoewogIC8vIG9wdGlvbnMKCWNlbGxBbGlnbjogJ2xlZnQnLAoJY29udGFpbjogdHJ1ZSwKCWF1dG9QbGF5OiA1MDAwLAoJd3JhcEFyb3VuZDogdHJ1ZSwKCXBhZ2VEb3RzOiB0cnVlLAoJcHJldk5leHRCdXR0b25zOiB0cnVlLAoJaW1hZ2VzTG9hZGVkOiB0cnVlCn0pOwo>/script> script defer srcdata:text/javascript;base64,CmpRdWVyeShkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oJCkgewoJaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCA8PSA2MzkgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoID49IDc2OCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggPD0gOTc5ICkgewoJCSQoJy5pbm5lci1jYXJvdXNlbCcpLmZsaWNraXR5KHsKCQkgIC8vIG9wdGlvbnMKCQkJY2VsbEFsaWduOiAnbGVmdCcsCgkJCWNvbnRhaW46IHRydWUsCgkJCWF1dG9QbGF5OiA1MDAwLAoJCQl3cmFwQXJvdW5kOiB0cnVlLAoJCQlwYWdlRG90czogdHJ1ZSwKCQkJcHJldk5leHRCdXR0b25zOiB0cnVlLAoJCQlpbWFnZXNMb2FkZWQ6IHRydWUKCQl9KTsKCX0KfSk7Cg>/script> script defer srcdata:text/javascript;base64,CmpRdWVyeShkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oJCkgewkKCWlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggPD0gNzY3KQoJewoJCXdpbmRvdy5vbnNjcm9sbCA9IGZ1bmN0aW9uKCkge215RnVuY3Rpb24oKX07CgkJdmFyIGhlYWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJoZWFkZXIiKTsKCQl2YXIgc3RpY2t5ID0gaGVhZGVyLm9mZnNldFRvcDsKCQlmdW5jdGlvbiBteUZ1bmN0aW9uKCkgewoJCQlpZiAod2luZG93LnBhZ2VZT2Zmc2V0ID49IDEwMCkgewoJCQkJaGVhZGVyLmNsYXNzTGlzdC5hZGQoInN0aWNreSIpOwoJCQl9IGVsc2UgewoJCQkJaGVhZGVyLmNsYXNzTGlzdC5yZW1vdmUoInN0aWNreSIpOwoJCQl9CgkJfQoJfQoJZWxzZQoJewoJCXdpbmRvdy5vbnNjcm9sbCA9IGZ1bmN0aW9uKCkge215RnVuY3Rpb24oKX07CgkJdmFyIG5hdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJuYXYiKTsKCQl2YXIgc3RpY2t5ID0gbmF2Lm9mZnNldFRvcDsKCQlmdW5jdGlvbiBteUZ1bmN0aW9uKCkgewoJCQlpZiAod2luZG93LnBhZ2VZT2Zmc2V0ID49IHN0aWNreSkgewoJCQkJbmF2LmNsYXNzTGlzdC5hZGQoInN0aWNreSIpOwoJCQl9IGVsc2UgewoJCQkJbmF2LmNsYXNzTGlzdC5yZW1vdmUoInN0aWNreSIpOwoJCQl9CgkJfQoJfQp9KTsK>/script> script defer srcdata:text/javascript;base64,Ci8qIEJYIFNMSURFUiBDT0RFICovCgovKioKICogYnhTbGlkZXIgdjQuMi4xZAogKiBDb3B5cmlnaHQgMjAxMy0yMDE3IFN0ZXZlbiBXYW5kZXJza2kKICogV3JpdHRlbiB3aGlsZSBkcmlua2luZyBCZWxnaWFuIGFsZXMgYW5kIGxpc3RlbmluZyB0byBqYXp6CiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCkKICovCgo7KGZ1bmN0aW9uKCQpIHsKCiAgdmFyIGRlZmF1bHRzID0gewoKICAgIC8vIEdFTkVSQUwKICAgIG1vZGU6ICdob3Jpem9udGFsJywKICAgIHNsaWRlU2VsZWN0b3I6ICcnLAogICAgaW5maW5pdGVMb29wOiB0cnVlLAogICAgaGlkZUNvbnRyb2xPbkVuZDogZmFsc2UsCiAgICBzcGVlZDogNTAwLAogICAgZWFzaW5nOiBudWxsLAogICAgc2xpZGVNYXJnaW46IDAsCiAgICBzdGFydFNsaWRlOiAwLAogICAgcmFuZG9tU3RhcnQ6IGZhbHNlLAogICAgY2FwdGlvbnM6IGZhbHNlLAogICAgdGlja2VyOiBmYWxzZSwKICAgIHRpY2tlckhvdmVyOiBmYWxzZSwKICAgIGFkYXB0aXZlSGVpZ2h0OiBmYWxzZSwKICAgIGFkYXB0aXZlSGVpZ2h0U3BlZWQ6IDUwMCwKICAgIHZpZGVvOiBmYWxzZSwKICAgIHVzZUNTUzogdHJ1ZSwKICAgIHByZWxvYWRJbWFnZXM6ICd2aXNpYmxlJywKICAgIHJlc3BvbnNpdmU6IHRydWUsCiAgICBzbGlkZVpJbmRleDogNTAsCiAgICB3cmFwcGVyQ2xhc3M6ICdieC13cmFwcGVyJywKCiAgICAvLyBUT1VDSAogICAgdG91Y2hFbmFibGVkOiB0cnVlLAogICAgc3dpcGVUaHJlc2hvbGQ6IDUwLAogICAgb25lVG9PbmVUb3VjaDogdHJ1ZSwKICAgIHByZXZlbnREZWZhdWx0U3dpcGVYOiB0cnVlLAogICAgcHJldmVudERlZmF1bHRTd2lwZVk6IGZhbHNlLAoKICAgIC8vIEFDQ0VTU0lCSUxJVFkKICAgIGFyaWFMaXZlOiB0cnVlLAogICAgYXJpYUhpZGRlbjogdHJ1ZSwKCiAgICAvLyBLRVlCT0FSRAogICAga2V5Ym9hcmRFbmFibGVkOiBmYWxzZSwKCiAgICAvLyBQQUdFUgogICAgcGFnZXI6IHRydWUsCiAgICBwYWdlclR5cGU6ICdmdWxsJywKICAgIHBhZ2VyU2hvcnRTZXBhcmF0b3I6ICcgLyAnLAogICAgcGFnZXJTZWxlY3RvcjogbnVsbCwKICAgIGJ1aWxkUGFnZXI6IG51bGwsCiAgICBwYWdlckN1c3RvbTogbnVsbCwKCiAgICAvLyBDT05UUk9MUwogICAgY29udHJvbHM6IHRydWUsCiAgICBuZXh0VGV4dDogJ05leHQnLAogICAgcHJldlRleHQ6ICdQcmV2JywKICAgIG5leHRTZWxlY3RvcjogbnVsbCwKICAgIHByZXZTZWxlY3RvcjogbnVsbCwKICAgIGF1dG9Db250cm9sczogZmFsc2UsCiAgICBzdGFydFRleHQ6ICdTdGFydCcsCiAgICBzdG9wVGV4dDogJ1N0b3AnLAogICAgYXV0b0NvbnRyb2xzQ29tYmluZTogZmFsc2UsCiAgICBhdXRvQ29udHJvbHNTZWxlY3RvcjogbnVsbCwKCiAgICAvLyBBVVRPCiAgICBhdXRvOiBmYWxzZSwKICAgIHBhdXNlOiA0MDAwLAogICAgYXV0b1N0YXJ0OiB0cnVlLAogICAgYXV0b0RpcmVjdGlvbjogJ25leHQnLAogICAgc3RvcEF1dG9PbkNsaWNrOiBmYWxzZSwKICAgIGF1dG9Ib3ZlcjogZmFsc2UsCiAgICBhdXRvRGVsYXk6IDAsCiAgICBhdXRvU2xpZGVGb3JPbmVQYWdlOiBmYWxzZSwKCiAgICAvLyBDQVJPVVNFTAogICAgbWluU2xpZGVzOiAxLAogICAgbWF4U2xpZGVzOiAxLAogICAgbW92ZVNsaWRlczogMCwKICAgIHNsaWRlV2lkdGg6IDAsCiAgICBzaHJpbmtJdGVtczogZmFsc2UsCgogICAgLy8gQ0FMTEJBQ0tTCiAgICBvblNsaWRlckxvYWQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZTsgfSwKICAgIG9uU2xpZGVCZWZvcmU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZTsgfSwKICAgIG9uU2xpZGVBZnRlcjogZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlOyB9LAogICAgb25TbGlkZU5leHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZTsgfSwKICAgIG9uU2xpZGVQcmV2OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0sCiAgICBvblNsaWRlclJlc2l6ZTogZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlOyB9LAoJb25BdXRvQ2hhbmdlOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0gLy9jYWxscyB3aGVuIGF1dG8gc2xpZGVzIHN0YXJ0cyBhbmQgc3RvcHMKICB9OwoKICAkLmZuLmJ4U2xpZGVyID0gZnVuY3Rpb24ob3B0aW9ucykgewoKICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgewogICAgICByZXR1cm4gdGhpczsKICAgIH0KCiAgICAvLyBzdXBwb3J0IG11bHRpcGxlIGVsZW1lbnRzCiAgICBpZiAodGhpcy5sZW5ndGggPiAxKSB7CiAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAkKHRoaXMpLmJ4U2xpZGVyKG9wdGlvbnMpOwogICAgICB9KTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgLy8gY3JlYXRlIGEgbmFtZXNwYWNlIHRvIGJlIHVzZWQgdGhyb3VnaG91dCB0aGUgcGx1Z2luCiAgICB2YXIgc2xpZGVyID0ge30sCiAgICAvLyBzZXQgYSByZWZlcmVuY2UgdG8gb3VyIHNsaWRlciBlbGVtZW50CiAgICBlbCA9IHRoaXMsCiAgICAvLyBnZXQgdGhlIG9yaWdpbmFsIHdpbmRvdyBkaW1lbnMgKHRoYW5rcyBhIGxvdCBJRSkKICAgIHdpbmRvd1dpZHRoID0gJCh3aW5kb3cpLndpZHRoKCksCiAgICB3aW5kb3dIZWlnaHQgPSAkKHdpbmRvdykuaGVpZ2h0KCk7CgogICAgLy8gUmV0dXJuIGlmIHNsaWRlciBpcyBhbHJlYWR5IGluaXRpYWxpemVkCiAgICBpZiAoJChlbCkuZGF0YSgnYnhTbGlkZXInKSkgeyByZXR1cm47IH0KCiAgICAvKioKICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgKiA9IFBSSVZBVEUgRlVOQ1RJT05TCiAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICovCgogICAgLyoqCiAgICAgKiBJbml0aWFsaXplcyBuYW1lc3BhY2Ugc2V0dGluZ3MgdG8gYmUgdXNlZCB0aHJvdWdob3V0IHBsdWdpbgogICAgICovCiAgICB2YXIgaW5pdCA9IGZ1bmN0aW9uKCkgewogICAgICAvLyBSZXR1cm4gaWYgc2xpZGVyIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQKICAgICAgaWYgKCQoZWwpLmRhdGEoJ2J4U2xpZGVyJykpIHsgcmV0dXJuOyB9CiAgICAgIC8vIG1lcmdlIHVzZXItc3VwcGxpZWQgb3B0aW9ucyB3aXRoIHRoZSBkZWZhdWx0cwogICAgICBzbGlkZXIuc2V0dGluZ3MgPSAkLmV4dGVuZCh7fSwgZGVmYXVsdHMsIG9wdGlvbnMpOwogICAgICAvLyBwYXJzZSBzbGlkZVdpZHRoIHNldHRpbmcKICAgICAgc2xpZGVyLnNldHRpbmdzLnNsaWRlV2lkdGggPSBwYXJzZUludChzbGlkZXIuc2V0dGluZ3Muc2xpZGVXaWR0aCk7CiAgICAgIC8vIHN0b3JlIHRoZSBvcmlnaW5hbCBjaGlsZHJlbgogICAgICBzbGlkZXIuY2hpbGRyZW4gPSBlbC5jaGlsZHJlbihzbGlkZXIuc2V0dGluZ3Muc2xpZGVTZWxlY3Rvcik7CiAgICAgIC8vIGNoZWNrIGlmIGFjdHVhbCBudW1iZXIgb2Ygc2xpZGVzIGlzIGxlc3MgdGhhbiBtaW5TbGlkZXMgLyBtYXhTbGlkZXMKICAgICAgaWYgKHNsaWRlci5jaGlsZHJlbi5sZW5ndGggPCBzbGlkZXIuc2V0dGluZ3MubWluU2xpZGVzKSB7IHNsaWRlci5zZXR0aW5ncy5taW5TbGlkZXMgPSBzbGlkZXIuY2hpbGRyZW4ubGVuZ3RoOyB9CiAgICAgIGlmIChzbGlkZXIuY2hpbGRyZW4ubGVuZ3RoIDwgc2xpZGVyLnNldHRpbmdzLm1heFNsaWRlcykgeyBzbGlkZXIuc2V0dGluZ3MubWF4U2xpZGVzID0gc2xpZGVyLmNoaWxkcmVuLmxlbmd0aDsgfQogICAgICAvLyBpZiByYW5kb20gc3RhcnQsIHNldCB0aGUgc3RhcnRTbGlkZSBzZXR0aW5nIHRvIHJhbmRvbSBudW1iZXIKICAgICAgaWYgKHNsaWRlci5zZXR0aW5ncy5yYW5kb21TdGFydCkgeyBzbGlkZXIuc2V0dGluZ3Muc3RhcnRTbGlkZSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHNsaWRlci5jaGlsZHJlbi5sZW5ndGgpOyB9CiAgICAgIC8vIHN0b3JlIGFjdGl2ZSBzbGlkZSBpbmZvcm1hdGlvbgogICAgICBzbGlkZXIuYWN0aXZlID0geyBpbmRleDogc2xpZGVyLnNldHRpbmdzLnN0YXJ0U2xpZGUgfTsKICAgICAgLy8gc3RvcmUgaWYgdGhlIHNsaWRlciBpcyBpbiBjYXJvdXNlbCBtb2RlIChkaXNwbGF5aW5nIC8gbW92aW5nIG11bHRpcGxlIHNsaWRlcykKICAgICAgc2xpZGVyLmNhcm91c2VsID0gc2xpZGVyLnNldHRpbmdzLm1pblNsaWRlcyA+IDEgfHwgc2xpZGVyLnNldHRpbmdzLm1heFNsaWRlcyA+IDE7CiAgICAgIC8vIGlmIGNhcm91c2VsLCBmb3JjZSBwcmVsb2FkSW1hZ2VzID0gJ2FsbCcKICAgICAgaWYgKHNsaWRlci5jYXJvdXNlbCkgeyBzbGlkZXIuc2V0dGluZ3MucHJlbG9hZEltYWdlcyA9ICdhbGwnOyB9CiAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgbWluIC8gbWF4IHdpZHRoIHRocmVzaG9sZHMgYmFzZWQgb24gbWluIC8gbWF4IG51bWJlciBvZiBzbGlkZXMKICAgICAgLy8gdXNlZCB0byBzZXR1cCBhbmQgdXBkYXRlIGNhcm91c2VsIHNsaWRlcyBkaW1lbnNpb25zCiAgICAgIHNsaWRlci5taW5UaHJlc2hvbGQgPSAoc2xpZGVyLnNldHRpbmdzLm1pblNsaWRlcyAqIHNsaWRlci5zZXR0aW5ncy5zbGlkZVdpZHRoKSArICgoc2xpZGVyLnNldHRpbmdzLm1pblNsaWRlcyAtIDEpICogc2xpZGVyLnNldHRpbmdzLnNsaWRlTWFyZ2luKTsKICAgICAgc2xpZGVyLm1heFRocmVzaG9sZCA9IChzbGlkZXIuc2V0dGluZ3MubWF4U2xpZGVzICogc2xpZGVyLnNldHRpbmdzLnNsaWRlV2lkdGgpICsgKChzbGlkZXIuc2V0dGluZ3MubWF4U2xpZGVzIC0gMSkgKiBzbGlkZXIuc2V0dGluZ3Muc2xpZGVNYXJnaW4pOwogICAgICAvLyBzdG9yZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgc2xpZGVyIChpZiBjdXJyZW50bHkgYW5pbWF0aW5nLCB3b3JraW5nIGlzIHRydWUpCiAgICAgIHNsaWRlci53b3JraW5nID0gZmFsc2U7CiAgICAgIC8vIGluaXRpYWxpemUgdGhlIGNvbnRyb2xzIG9iamVjdAogICAgICBzbGlkZXIuY29udHJvbHMgPSB7fTsKICAgICAgLy8gaW5pdGlhbGl6ZSBhbiBhdXRvIGludGVydmFsCiAgICAgIHNsaWRlci5pbnRlcnZhbCA9IG51bGw7CiAgICAgIC8vIGRldGVybWluZSB3aGljaCBwcm9wZXJ0eSB0byB1c2UgZm9yIHRyYW5zaXRpb25zCiAgICAgIHNsaWRlci5hbmltUHJvcCA9IHNsaWRlci5zZXR0aW5ncy5tb2RlID09PSAndmVydGljYWwnID8gJ3RvcCcgOiAnbGVmdCc7CiAgICAgIC8vIGRldGVybWluZSBpZiBoYXJkd2FyZSBhY2NlbGVyYXRpb24gY2FuIGJlIHVzZWQKICAgICAgc2xpZGVyLnVzaW5nQ1NTID0gc2xpZGVyLnNldHRpbmdzLnVzZUNTUyAmJiBzbGlkZXIuc2V0dGluZ3MubW9kZSAhPT0gJ2ZhZGUnICYmIChmdW5jdGlvbigpIHsKICAgICAgICAvLyBjcmVhdGUgb3VyIHRlc3QgZGl2IGVsZW1lbnQKICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksCiAgICAgICAgLy8gY3NzIHRyYW5zaXRpb24gcHJvcGVydGllcwogICAgICAgIHByb3BzID0gWydXZWJraXRQZXJzcGVjdGl2ZScsICdNb3pQZXJzcGVjdGl2ZScsICdPUGVyc3BlY3RpdmUnLCAnbXNQZXJzcGVjdGl2ZSddOwogICAgICAgIC8vIHRlc3QgZm9yIGVhY2ggcHJvcGVydHkKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBpZiAoZGl2LnN0eWxlW3Byb3BzW2ldXSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIHNsaWRlci5jc3NQcmVmaXggPSBwcm9wc1tpXS5yZXBsYWNlKCdQZXJzcGVjdGl2ZScsICcnKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICBzbGlkZXIuYW5pbVByb3AgPSAnLScgKyBzbGlkZXIuY3NzUHJlZml4ICsgJy10cmFuc2Zvcm0nOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9KCkpOwogICAgICAvLyBpZiB2ZXJ0aWNhbCBtb2RlIGFsd2F5cyBtYWtlIG1heFNsaWRlcyBhbmQgbWluU2xpZGVzIGVxdWFsCiAgICAgIGlmIChzbGlkZXIuc2V0dGluZ3MubW9kZSA9PT0gJ3ZlcnRpY2FsJykgeyBzbGlkZXIuc2V0dGluZ3MubWF4U2xpZGVzID0gc2xpZGVyLnNldHRpbmdzLm1pblNsaWRlczsgfQogICAgICAvLyBzYXZlIG9yaWdpbmFsIHN0eWxlIGRhdGEKICAgICAgZWwuZGF0YSgnb3JpZ1N0eWxlJywgZWwuYXR0cignc3R5bGUnKSk7CiAgICAgIGVsLmNoaWxkcmVuKHNsaWRlci5zZXR0aW5ncy5zbGlkZVNlbGVjdG9yKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICQodGhpcykuZGF0YSgnb3JpZ1N0eWxlJywgJCh0aGlzKS5hdHRyKCdzdHlsZScpKTsKICAgICAgfSk7CgogICAgICAvLyBwZXJmb3JtIGFsbCBET00gLyBDU1MgbW9kaWZpY2F0aW9ucwogICAgICBzZXR1cCgpOwogICAgfTsKCiAgICAvKioKICAgICAqIFBlcmZvcm1zIGFsbCBET00gYW5kIENTUyBtb2RpZmljYXRpb25zCiAgICAgKi8KICAgIHZhciBzZXR1cCA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgcHJlbG9hZFNlbGVjdG9yID0gc2xpZGVyLmNoaWxkcmVuLmVxKHNsaWRlci5zZXR0aW5ncy5zdGFydFNsaWRlKTsgLy8gc2V0IHRoZSBkZWZhdWx0IHByZWxvYWQgc2VsZWN0b3IgKHZpc2libGUpCgogICAgICAvLyB3cmFwIGVsIGluIGEgd3JhcHBlcgogICAgICBlbC53cmFwKCc8ZGl2IGNsYXNzPSInICsgc2xpZGVyLnNldHRpbmdzLndyYXBwZXJDbGFzcyArICciPjxkaXYgY2xhc3M9ImJ4LXZpZXdwb3J0Ij48L2Rpdj48L2Rpdj4nKTsKICAgICAgLy8gc3RvcmUgYSBuYW1lc3BhY2UgcmVmZXJlbmNlIHRvIC5ieC12aWV3cG9ydAogICAgICBzbGlkZXIudmlld3BvcnQgPSBlbC5wYXJlbnQoKTsKCiAgICAgIC8vIGFkZCBhcmlhLWxpdmUgaWYgdGhlIHNldHRpbmcgaXMgZW5hYmxlZCBhbmQgdGlja2VyIG1vZGUgaXMgZGlzYWJsZWQKICAgICAgaWYgKHNsaWRlci5zZXR0aW5ncy5hcmlhTGl2ZSAmJiAhc2xpZGVyLnNldHRpbmdzLnRpY2tlcikgewogICAgICAgIHNsaWRlci52aWV3cG9ydC5hdHRyKCdhcmlhLWxpdmUnLCAncG9saXRlJyk7CiAgICAgIH0KICAgICAgLy8gYWRkIGEgbG9hZGluZyBkaXYgdG8gZGlzcGxheSB3aGlsZSBpbWFnZXMgYXJlIGxvYWRpbmcKICAgICAgc2xpZGVyLmxvYWRlciA9ICQoJzxkaXYgY2xhc3M9ImJ4LWxvYWRpbmciIC8+Jyk7CiAgICAgIHNsaWRlci52aWV3cG9ydC5wcmVwZW5kKHNsaWRlci5sb2FkZXIpOwogICAgICAvLyBzZXQgZWwgdG8gYSBtYXNzaXZlIHdpZHRoLCB0byBob2xkIGFueSBuZWVkZWQgc2xpZGVzCiAgICAgIC8vIGFsc28gc3RyaXAgYW55IG1hcmdpbiBhbmQgcGFkZGluZyBmcm9tIGVsCiAgICAgIGVsLmNzcyh7CiAgICAgICAgd2lkdGg6IHNsaWRlci5zZXR0aW5ncy5tb2RlID09PSAnaG9yaXpvbnRhbCcgPyAoc2xpZGVyLmNoaWxkcmVuLmxlbmd0aCAqIDEwMDAgKyAyMTUpICsgJyUnIDogJ2F1dG8nLAogICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnCiAgICAgIH0pOwogICAgICAvLyBpZiB1c2luZyBDU1MsIGFkZCB0aGUgZWFzaW5nIHByb3BlcnR5CiAgICAgIGlmIChzbGlkZXIudXNpbmdDU1MgJiYgc2xpZGVyLnNldHRpbmdzLmVhc2luZykgewogICAgICAgIGVsLmNzcygnLScgKyBzbGlkZXIuY3NzUHJlZml4ICsgJy10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbicsIHNsaWRlci5zZXR0aW5ncy5lYXNpbmcpOwogICAgICAvLyBpZiBub3QgdXNpbmcgQ1NTIGFuZCBubyBlYXNpbmcgdmFsdWUgd2FzIHN1cHBsaWVkLCB1c2UgdGhlIGRlZmF1bHQgSlMgYW5pbWF0aW9uIGVhc2luZyAoc3dpbmcpCiAgICAgIH0gZWxzZSBpZiAoIXNsaWRlci5zZXR0aW5ncy5lYXNpbmcpIHsKICAgICAgICBzbGlkZXIuc2V0dGluZ3MuZWFzaW5nID0gJ3N3aW5nJzsKICAgICAgfQogICAgICAvLyBtYWtlIG1vZGlmaWNhdGlvbnMgdG8gdGhlIHZpZXdwb3J0ICguYngtdmlld3BvcnQpCiAgICAgIHNsaWRlci52aWV3cG9ydC5jc3MoewogICAgICAgIHdpZHRoOiAnMTAwJScsCiAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLAogICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnCiAgICAgIH0pOwogICAgICBzbGlkZXIudmlld3BvcnQucGFyZW50KCkuY3NzKHsKICAgICAgICBtYXhXaWR0aDogZ2V0Vmlld3BvcnRNYXhXaWR0aCgpCiAgICAgIH0pOwogICAgICAvLyBhcHBseSBjc3MgdG8gYWxsIHNsaWRlciBjaGlsZHJlbgogICAgICBzbGlkZXIuY2hpbGRyZW4uY3NzKHsKICAgICAgICAvLyB0aGUgZmxvYXQgYXR0cmlidXRlIGlzIGEgcmVzZXJ2ZWQgd29yZCBpbiBjb21wcmVzc29ycyBsaWtlIFlVSSBjb21wcmVzc29yIGFuZCBuZWVkIHRvIGJlIHF1b3RlZCAjNDgKICAgICAgICAnZmxvYXQnOiBzbGlkZXIuc2V0dGluZ3MubW9kZSA9PT0gJ2hvcml6b250YWwnID8gJ2xlZnQnIDogJ25vbmUnLAogICAgICAgIGxpc3RTdHlsZTogJ25vbmUnLAogICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnCiAgICAgIH0pOwogICAgICAvLyBhcHBseSB0aGUgY2FsY3VsYXRlZCB3aWR0aCBhZnRlciB0aGUgZmxvYXQgaXMgYXBwbGllZCB0byBwcmV2ZW50IHNjcm9sbGJhciBpbnRlcmZlcmVuY2UKICAgICAgc2xpZGVyLmNoaWxkcmVuLmNzcygnd2lkdGgnLCBnZXRTbGlkZVdpZHRoKCkpOwogICAgICAvLyBpZiBzbGlkZU1hcmdpbiBpcyBzdXBwbGllZCwgYWRkIHRoZSBjc3MKICAgICAgaWYgKHNsaWRlci5zZXR0aW5ncy5tb2RlID09PSAnaG9yaXpvbnRhbCcgJiYgc2xpZGVyLnNldHRpbmdzLnNsaWRlTWFyZ2luID4gMCkgeyBzbGlkZXIuY2hpbGRyZW4uY3NzKCdtYXJnaW5SaWdodCcsIHNsaWRlci5zZXR0aW5ncy5zbGlkZU1hcmdpbik7IH0KICAgICAgaWYgKHNsaWRlci5zZXR0aW5ncy5tb2RlID09PSAndmVydGljYWwnICYmIHNsaWRlci5zZXR0aW5ncy5zbGlkZU1hcmdpbiA+IDApIHsgc2xpZGVyLmNoaWxkcmVuLmNzcygnbWFyZ2luQm90dG9tJywgc2xpZGVyLnNldHRpbmdzLnNsaWRlTWFyZ2luKTsgfQogICAgICAvLyBpZiAiZmFkZSIgbW9kZSwgYWRkIHBvc2l0aW9uaW5nIGFuZCB6LWluZGV4IENTUwogICAgICBpZiAoc2xpZGVyLnNldHRpbmdzLm1vZGUgPT09ICdmYWRlJykgewogICAgICAgIHNsaWRlci5jaGlsZHJlbi5jc3MoewogICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsCiAgICAgICAgICB6SW5kZXg6IDAsCiAgICAgICAgICBkaXNwbGF5OiAnbm9uZScKICAgICAgICB9KTsKICAgICAgICAvLyBwcmVwYXJlIHRoZSB6LWluZGV4IG9uIHRoZSBzaG93aW5nIGVsZW1lbnQKICAgICAgICBzbGlkZXIuY2hpbGRyZW4uZXEoc2xpZGVyLnNldHRpbmdzLnN0YXJ0U2xpZGUpLmNzcyh7ekluZGV4OiBzbGlkZXIuc2V0dGluZ3Muc2xpZGVaSW5kZXgsIGRpc3BsYXk6ICdibG9jayd9KTsKICAgICAgfQogICAgICAvLyBjcmVhdGUgYW4gZWxlbWVudCB0byBjb250YWluIGFsbCBzbGlkZXIgY29udHJvbHMgKHBhZ2VyLCBzdGFydCAvIHN0b3AsIGV0YykKICAgICAgc2xpZGVyLmNvbnRyb2xzLmVsID0gJCgnPGRpdiBjbGFzcz0iYngtY29udHJvbHMiIC8+Jyk7CiAgICAgIC8vIGlmIGNhcHRpb25zIGFyZSByZXF1ZXN0ZWQsIGFkZCB0aGVtCiAgICAgIGlmIChzbGlkZXIuc2V0dGluZ3MuY2FwdGlvbnMpIHsgYXBwZW5kQ2FwdGlvbnMoKTsgfQogICAgICAvLyBjaGVjayBpZiBzdGFydFNsaWRlIGlzIGxhc3Qgc2xpZGUKICAgICAgc2xpZGVyLmFjdGl2ZS5sYXN0ID0gc2xpZGVyLnNldHRpbmdzLnN0YXJ0U2xpZGUgPT09IGdldFBhZ2VyUXR5KCkgLSAxOwogICAgICAvLyBpZiB2aWRlbyBpcyB0cnVlLCBzZXQgdXAgdGhlIGZpdFZpZHMgcGx1Z2luCiAgICAgIGlmIChzbGlkZXIuc2V0dGluZ3MudmlkZW8pIHsgZWwuZml0VmlkcygpOyB9CgkgIC8vcHJlbG9hZEltYWdlcwoJICBpZiAoc2xpZGVyLnNldHRpbmdzLnByZWxvYWRJbWFnZXMgPT09ICdub25lJykgeyAKCQkgIHByZWxvYWRTZWxlY3RvciA9IG51bGw7IAoJICB9CiAgICAgIGVsc2UgaWYgKHNsaWRlci5zZXR0aW5ncy5wcmVsb2FkSW1hZ2VzID09PSAnYWxsJyB8fCBzbGlkZXIuc2V0dGluZ3MudGlja2VyKSB7IAoJCSAgcHJlbG9hZFNlbGVjdG9yID0gc2xpZGVyLmNoaWxkcmVuOyAKCSAgfQogICAgICAvLyBvbmx5IGNoZWNrIGZvciBjb250cm9sIGFkZGl0aW9uIGlmIG5vdCBpbiAidGlja2VyIiBtb2RlCiAgICAgIGlmICghc2xpZGVyLnNldHRpbmdzLnRpY2tlcikgewogICAgICAgIC8vIGlmIGNvbnRyb2xzIGFyZSByZXF1ZXN0ZWQsIGFkZCB0aGVtCiAgICAgICAgaWYgKHNsaWRlci5zZXR0aW5ncy5jb250cm9scykgeyBhcHBlbmRDb250cm9scygpOyB9CiAgICAgICAgLy8gaWYgYXV0byBpcyB0cnVlLCBhbmQgYXV0byBjb250cm9scyBhcmUgcmVxdWVzdGVkLCBhZGQgdGhlbQogICAgICAgIGlmIChzbGlkZXIuc2V0dGluZ3MuYXV0byAmJiBzbGlkZXIuc2V0dGluZ3MuYXV0b0NvbnRyb2xzKSB7IGFwcGVuZENvbnRyb2xzQXV0bygpOyB9CiAgICAgICAgLy8gaWYgcGFnZXIgaXMgcmVxdWVzdGVkLCBhZGQgaXQKICAgICAgICBpZiAoc2xpZGVyLnNldHRpbmdzLnBhZ2VyKSB7IGFwcGVuZFBhZ2VyKCk7IH0KICAgICAgICAvLyBpZiBhbnkgY29udHJvbCBvcHRpb24gaXMgcmVxdWVzdGVkLCBhZGQgdGhlIGNvbnRyb2xzIHdyYXBwZXIKICAgICAgICBpZiAoc2xpZGVyLnNldHRpbmdzLmNvbnRyb2xzIHx8IHNsaWRlci5zZXR0aW5ncy5hdXRvQ29udHJvbHMgfHwgc2xpZGVyLnNldHRpbmdzLnBhZ2VyKSB7IHNsaWRlci52aWV3cG9ydC5hZnRlcihzbGlkZXIuY29udHJvbHMuZWwpOyB9CiAgICAgIC8vIGlmIHRpY2tlciBtb2RlLCBkbyBub3QgYWxsb3cgYSBwYWdlcgogICAgICB9IGVsc2UgewogICAgICAgIHNsaWRlci5zZXR0aW5ncy5wYWdlciA9IGZhbHNlOwogICAgICB9CgkgIGlmIChwcmVsb2FkU2VsZWN0b3IgPT09IG51bGwpIHsKICAgICAgICBzdGFydCgpOwogICAgICB9IGVsc2UgewogICAgICAgIGxvYWRFbGVtZW50cyhwcmVsb2FkU2VsZWN0b3IsIHN0YXJ0KTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgbG9hZEVsZW1lbnRzID0gZnVuY3Rpb24oc2VsZWN0b3IsIGNhbGxiYWNrKSB7CiAgICAgIHZhciB0b3RhbCA9IHNlbGVjdG9yLmZpbmQoJ2ltZzpub3QoW3NyYz0iIl0pLCBpZnJhbWUnKS5sZW5ndGgsCiAgICAgIGNvdW50ID0gMDsKICAgICAgaWYgKHRvdGFsID09PSAwKSB7CiAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgc2VsZWN0b3IuZmluZCgnaW1nOm5vdChbc3JjPSIiXSksIGlmcmFtZScpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgJCh0aGlzKS5vbmUoJ2xvYWQgZXJyb3InLCBmdW5jdGlvbigpIHsKICAgICAgICAgIGlmICgrK2NvdW50ID09PSB0b3RhbCkgeyBjYWxsYmFjaygpOyB9CiAgICAgICAgfSkuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgIGlmICh0aGlzLmNvbXBsZXRlIHx8IHRoaXMuc3JjID09ICcnKSB7ICQodGhpcykudHJpZ2dlcignbG9hZCcpOyB9CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIFN0YXJ0IHRoZSBzbGlkZXIKICAgICAqLwogICAgdmFyIHN0YXJ0ID0gZnVuY3Rpb24oKSB7CiAgICAgIC8vIGlmIGluZmluaXRlIGxvb3AsIHByZXBhcmUgYWRkaXRpb25hbCBzbGlkZXMKICAgICAgaWYgKHNsaWRlci5zZXR0aW5ncy5pbmZpbml0ZUxvb3AgJiYgc2xpZGVyLnNldHRpbmdzLm1vZGUgIT09ICdmYWRlJyAmJiAhc2xpZGVyLnNldHRpbmdzLnRpY2tlcikgewogICAgICAgIHZhciBzbGljZSAgICA9IHNsaWRlci5zZXR0aW5ncy5tb2RlID09PSAndmVydGljYWwnID8gc2xpZGVyLnNldHRpbmdzLm1pblNsaWRlcyA6IHNsaWRlci5zZXR0aW5ncy5tYXhTbGlkZXMsCiAgICAgICAgc2xpY2VBcHBlbmQgID0gc2xpZGVyLmNoaWxkcmVuLnNsaWNlKDAsIHNsaWNlKS5jbG9uZSh0cnVlKS5hZGRDbGFzcygnYngtY2xvbmUnKSwKICAgICAgICBzbGljZVByZXBlbmQgPSBzbGlkZXIuY2hpbGRyZW4uc2xpY2UoLXNsaWNlKS5jbG9uZSh0cnVlKS5hZGRDbGFzcygnYngtY2xvbmUnKTsKICAgICAgICBpZiAoc2xpZGVyLnNldHRpbmdzLmFyaWFIaWRkZW4pIHsKICAgICAgICAgIHNsaWNlQXBwZW5kLmF0dHIoJ2FyaWEtaGlkZGVuJywgdHJ1ZSk7CiAgICAgICAgICBzbGljZVByZXBlbmQuYXR0cignYXJpYS1oaWRkZW4nLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgZWwuYXBwZW5kKHNsaWNlQXBwZW5kKS5wcmVwZW5kKHNsaWNlUHJlcGVuZCk7CiAgICAgIH0KICAgICAgLy8gcmVtb3ZlIHRoZSBsb2FkaW5nIERPTSBlbGVtZW50CiAgICAgIHNsaWRlci5sb2FkZXIucmVtb3ZlKCk7CiAgICAgIC8vIHNldCB0aGUgbGVmdCAvIHRvcCBwb3NpdGlvbiBvZiAiZWwiCiAgICAgIHNldFNsaWRlUG9zaXRpb24oKTsKICAgICAgLy8gaWYgInZlcnRpY2FsIiBtb2RlLCBhbHdheXMgdXNlIGFkYXB0aXZlSGVpZ2h0IHRvIHByZXZlbnQgb2RkIGJlaGF2aW9yCiAgICAgIGlmIChzbGlkZXIuc2V0dGluZ3MubW9kZSA9PT0gJ3ZlcnRpY2FsJykgeyBzbGlkZXIuc2V0dGluZ3MuYWRhcHRpdmVIZWlnaHQgPSB0cnVlOyB9CiAgICAgIC8vIHNldCB0aGUgdmlld3BvcnQgaGVpZ2h0CiAgICAgIHNsaWRlci52aWV3cG9ydC5oZWlnaHQoZ2V0Vmlld3BvcnRIZWlnaHQoKSk7CiAgICAgIC8vIG1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIHBvc2l0aW9uZWQganVzdCByaWdodCAoc2FtZSBhcyBhIHdpbmRvdyByZXNpemUpCiAgICAgIGVsLnJlZHJhd1NsaWRlcigpOwogICAgICAvLyBvblNsaWRlckxvYWQgY2FsbGJhY2sKICAgICAgc2xpZGVyLnNldHRpbmdzLm9uU2xpZGVyTG9hZC5jYWxsKGVsLCBzbGlkZXIuYWN0aXZlLmluZGV4KTsKICAgICAgLy8gc2xpZGVyIGhhcyBiZWVuIGZ1bGx5IGluaXRpYWxpemVkCiAgICAgIHNsaWRlci5pbml0aWFsaXplZCA9IHRydWU7CiAgICAgIC8vIGFkZCB0aGUgcmVzaXplIGNhbGwgdG8gdGhlIHdpbmRvdwogICAgICBpZiAoc2xpZGVyLnNldHRpbmdzLnJlc3BvbnNpdmUpIHsgJCh3aW5kb3cpLm9uKCdyZXNpemUnLCByZXNpemVXaW5kb3cpOyB9CiAgICAgIC8vIGlmIGF1dG8gaXMgdHJ1ZSBhbmQgaGFzIG1vcmUgdGhhbiAxIHBhZ2UsIHN0YXJ0IHRoZSBzaG93CiAgICAgIGlmIChzbGlkZXIuc2V0dGluZ3MuYXV0byAmJiBzbGlkZXIuc2V0dGluZ3MuYXV0b1N0YXJ0ICYmIChnZXRQYWdlclF0eSgpID4gMSB8fCBzbGlkZXIuc2V0dGluZ3MuYXV0b1NsaWRlRm9yT25lUGFnZSkpIHsgaW5pdEF1dG8oKTsgfQogICAgICAvLyBpZiB0aWNrZXIgaXMgdHJ1ZSwgc3RhcnQgdGhlIHRpY2tlcgogICAgICBpZiAoc2xpZGVyLnNldHRpbmdzLnRpY2tlcikgeyBpbml0VGlja2VyKCk7IH0KICAgICAgLy8gaWYgcGFnZXIgaXMgcmVxdWVzdGVkLCBtYWtlIHRoZSBhcHByb3ByaWF0ZSBwYWdlciBsaW5rIGFjdGl2ZQogICAgICBpZiAoc2xpZGVyLnNldHRpbmdzLnBhZ2VyKSB7IHVwZGF0ZVBhZ2VyQWN0aXZlKHNsaWRlci5zZXR0aW5ncy5zdGFydFNsaWRlKTsgfQogICAgICAvLyBjaGVjayBmb3IgYW55IHVwZGF0ZXMgdG8gdGhlIGNvbnRyb2xzIChsaWtlIGhpZGVDb250cm9sT25FbmQgdXBkYXRlcykKICAgICAgaWYgKHNsaWRlci5zZXR0aW5ncy5jb250cm9scykgeyB1cGRhdGVEaXJlY3Rpb25Db250cm9scygpOyB9CiAgICAgIC8vIGlmIHRvdWNoRW5hYmxlZCBpcyB0cnVlLCBzZXR1cCB0aGUgdG91Y2ggZXZlbnRzCiAgICAgIGlmIChzbGlkZXIuc2V0dGluZ3MudG91Y2hFbmFibGVkICYmICFzbGlkZXIuc2V0dGluZ3MudGlja2VyKSB7IGluaXRUb3VjaCgpOyB9CiAgICAgIC8vIGlmIGtleWJvYXJkRW5hYmxlZCBpcyB0cnVlLCBzZXR1cCB0aGUga2V5Ym9hcmQgZXZlbnRzCiAgICAgIGlmIChzbGlkZXIuc2V0dGluZ3Mua2V5Ym9hcmRFbmFibGVkICYmICFzbGlkZXIuc2V0dGluZ3MudGlja2VyKSB7CiAgICAgICAgJChkb2N1bWVudCkua2V5ZG93bihrZXlQcmVzcyk7CiAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBjYWxjdWxhdGVkIGhlaWdodCBvZiB0aGUgdmlld3BvcnQsIHVzZWQgdG8gZGV0ZXJtaW5lIGVpdGhlciBhZGFwdGl2ZUhlaWdodCBvciB0aGUgbWF4SGVpZ2h0IHZhbHVlCiAgICAgKi8KICAgIHZhciBnZXRWaWV3cG9ydEhlaWdodCA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgaGVpZ2h0ID0gMDsKICAgICAgLy8gZmlyc3QgZGV0ZXJtaW5lIHdoaWNoIGNoaWxkcmVuIChzbGlkZXMpIHNob3VsZCBiZSB1c2VkIGluIG91ciBoZWlnaHQgY2FsY3VsYXRpb24KICAgICAgdmFyIGNoaWxkcmVuID0gJCgpOwogICAgICAvLyBpZiBtb2RlIGlzIG5vdCAidmVydGljYWwiIGFuZCBhZGFwdGl2ZUhlaWdodCBpcyBmYWxzZSwgaW5jbHVkZSBhbGwgY2hpbGRyZW4KICAgICAgaWYgKHNsaWRlci5zZXR0aW5ncy5tb2RlICE9PSAndmVydGljYWwnICYmICFzbGlkZXIuc2V0dGluZ3MuYWRhcHRpdmVIZWlnaHQpIHsKICAgICAgICBjaGlsZHJlbiA9IHNsaWRlci5jaGlsZHJlbjsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBpZiBub3QgY2Fyb3VzZWwsIHJldHVybiB0aGUgc2luZ2xlIGFjdGl2ZSBjaGlsZAogICAgICAgIGlmICghc2xpZGVyLmNhcm91c2VsKSB7CiAgICAgICAgICBjaGlsZHJlbiA9IHNsaWRlci5jaGlsZHJlbi5lcShzbGlkZXIuYWN0aXZlLmluZGV4KTsKICAgICAgICAvLyBpZiBjYXJvdXNlbCwgcmV0dXJuIGEgc2xpY2Ugb2YgY2hpbGRyZW4KICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gZ2V0IHRoZSBpbmRpdmlkdWFsIHNsaWRlIGluZGV4CiAgICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gc2xpZGVyLnNldHRpbmdzLm1vdmVTbGlkZXMgPT09IDEgPyBzbGlkZXIuYWN0aXZlLmluZGV4IDogc2xpZGVyLmFjdGl2ZS5pbmRleCAqIGdldE1vdmVCeSgpOwogICAgICAgICAgLy8gYWRkIHRoZSBjdXJyZW50IHNsaWRlIHRvIHRoZSBjaGlsZHJlbgogICAgICAgICAgY2hpbGRyZW4gPSBzbGlkZXIuY2hpbGRyZW4uZXEoY3VycmVudEluZGV4KTsKICAgICAgICAgIC8vIGN5Y2xlIHRocm91Z2ggdGhlIHJlbWFpbmluZyAic2hvd2luZyIgc2xpZGVzCiAgICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IHNsaWRlci5zZXR0aW5ncy5tYXhTbGlkZXMgLSAxOyBpKyspIHsKICAgICAgICAgICAgLy8gaWYgbG9vcGVkIGJhY2sgdG8gdGhlIHN0YXJ0CiAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggKyBpID49IHNsaWRlci5jaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLmFkZChzbGlkZXIuY2hpbGRyZW4uZXEoaSAtIDEpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLmFkZChzbGlkZXIuY2hpbGRyZW4uZXEoY3VycmVudEluZGV4ICsgaSkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIGlmICJ2ZXJ0aWNhbCIgbW9kZSwgY2FsY3VsYXRlIHRoZSBzdW0gb2YgdGhlIGhlaWdodHMgb2YgdGhlIGNoaWxkcmVuCiAgICAgIGlmIChzbGlkZXIuc2V0dGluZ3MubW9kZSA9PT0gJ3ZlcnRpY2FsJykgewogICAgICAgIGNoaWxkcmVuLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICAgIGhlaWdodCArPSAkKHRoaXMpLm91dGVySGVpZ2h0KCk7CiAgICAgICAgfSk7CiAgICAgICAgLy8gYWRkIHVzZXItc3VwcGxpZWQgbWFyZ2lucwogICAgICAgIGlmIChzbGlkZXIuc2V0dGluZ3Muc2xpZGVNYXJnaW4gPiAwKSB7CiAgICAgICAgICBoZWlnaHQgKz0gc2xpZGVyLnNldHRpbmdzLnNsaWRlTWFyZ2luICogKHNsaWRlci5zZXR0aW5ncy5taW5TbGlkZXMgLSAxKTsKICAgICAgICB9CiAgICAgIC8vIGlmIG5vdCAidmVydGljYWwiIG1vZGUsIGNhbGN1bGF0ZSB0aGUgbWF4IGhlaWdodCBvZiB0aGUgY2hpbGRyZW4KICAgICAgfSBlbHNlIHsKICAgICAgICBoZWlnaHQgPSBNYXRoLm1heC5hcHBseShNYXRoLCBjaGlsZHJlbi5tYXAoZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gJCh0aGlzKS5vdXRlckhlaWdodChmYWxzZSk7CiAgICAgICAgfSkuZ2V0KCkpOwogICAgICB9CgogICAgICBpZiAoc2xpZGVyLnZpZXdwb3J0LmNzcygnYm94LXNpemluZycpID09PSAnYm9yZGVyLWJveCcpIHsKICAgICAgICBoZWlnaHQgKz0gcGFyc2VGbG9hdChzbGlkZXIudmlld3BvcnQuY3NzKCdwYWRkaW5nLXRvcCcpKSArIHBhcnNlRmxvYXQoc2xpZGVyLnZpZXdwb3J0LmNzcygncGFkZGluZy1ib3R0b20nKSkgKwogICAgICAgICAgICAgIHBhcnNlRmxvYXQoc2xpZGVyLnZpZXdwb3J0LmNzcygnYm9yZGVyLXRvcC13aWR0aCcpKSArIHBhcnNlRmxvYXQoc2xpZGVyLnZpZXdwb3J0LmNzcygnYm9yZGVyLWJvdHRvbS13aWR0aCcpKTsKICAgICAgfSBlbHNlIGlmIChzbGlkZXIudmlld3BvcnQuY3NzKCdib3gtc2l6aW5nJykgPT09ICdwYWRkaW5nLWJveCcpIHsKICAgICAgICBoZWlnaHQgKz0gcGFyc2VGbG9hdChzbGlkZXIudmlld3BvcnQuY3NzKCdwYWRkaW5nLXRvcCcpKSArIHBhcnNlRmxvYXQoc2xpZGVyLnZpZXdwb3J0LmNzcygncGFkZGluZy1ib3R0b20nKSk7CiAgICAgIH0KCiAgICAgIHJldHVybiBoZWlnaHQ7CiAgICB9OwoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgY2FsY3VsYXRlZCB3aWR0aCB0byBiZSB1c2VkIGZvciB0aGUgb3V0ZXIgd3JhcHBlciAvIHZpZXdwb3J0CiAgICAgKi8KICAgIHZhciBnZXRWaWV3cG9ydE1heFdpZHRoID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciB3aWR0aCA9ICcxMDAlJzsKICAgICAgaWYgKHNsaWRlci5zZXR0aW5ncy5zbGlkZVdpZHRoID4gMCkgewogICAgICAgIGlmIChzbGlkZXIuc2V0dGluZ3MubW9kZSA9PT0gJ2hvcml6b250YWwnKSB7CiAgICAgICAgICB3aWR0aCA9IChzbGlkZXIuc2V0dGluZ3MubWF4U2xpZGVzICogc2xpZGVyLnNldHRpbmdzLnNsaWRlV2lkdGgpICsgKChzbGlkZXIuc2V0dGluZ3MubWF4U2xpZGVzIC0gMSkgKiBzbGlkZXIuc2V0dGluZ3Muc2xpZGVNYXJnaW4pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB3aWR0aCA9IHNsaWRlci5zZXR0aW5ncy5zbGlkZVdpZHRoOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gd2lkdGg7CiAgICB9OwoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgY2FsY3VsYXRlZCB3aWR0aCB0byBiZSBhcHBsaWVkIHRvIGVhY2ggc2xpZGUKICAgICAqLwogICAgdmFyIGdldFNsaWRlV2lkdGggPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIG5ld0VsV2lkdGggPSBzbGlkZXIuc2V0dGluZ3Muc2xpZGVXaWR0aCwgLy8gc3RhcnQgd2l0aCBhbnkgdXNlci1zdXBwbGllZCBzbGlkZSB3aWR0aAogICAgICB3cmFwV2lkdGggICAgICA9IHNsaWRlci52aWV3cG9ydC53aWR0aCgpOyAgICAvLyBnZXQgdGhlIGN1cnJlbnQgdmlld3BvcnQgd2lkdGgKICAgICAgLy8gaWYgc2xpZGUgd2lkdGggd2FzIG5vdCBzdXBwbGllZCwgb3IgaXMgbGFyZ2VyIHRoYW4gdGhlIHZpZXdwb3J0IHVzZSB0aGUgdmlld3BvcnQgd2lkdGgKICAgICAgaWYgKHNsaWRlci5zZXR0aW5ncy5zbGlkZVdpZHRoID09PSAwIHx8CiAgICAgICAgKHNsaWRlci5zZXR0aW5ncy5zbGlkZVdpZHRoID4gd3JhcFdpZHRoICYmICFzbGlkZXIuY2Fyb3VzZWwpIHx8CiAgICAgICAgc2xpZGVyLnNldHRpbmdzLm1vZGUgPT09ICd2ZXJ0aWNhbCcpIHsKICAgICAgICBuZXdFbFdpZHRoID0gd3JhcFdpZHRoOwogICAgICAvLyBpZiBjYXJvdXNlbCwgdXNlIHRoZSB0aHJlc2hvbGRzIHRvIGRldGVybWluZSB0aGUgd2lkdGgKICAgICAgfSBlbHNlIGlmIChzbGlkZXIuc2V0dGluZ3MubWF4U2xpZGVzID4gMSAmJiBzbGlkZXIuc2V0dGluZ3MubW9kZSA9PT0gJ2hvcml6b250YWwnKSB7CiAgICAgICAgaWYgKHdyYXBXaWR0aCA+IHNsaWRlci5tYXhUaHJlc2hvbGQpIHsKICAgICAgICAgIHJldHVybiBuZXdFbFdpZHRoOwogICAgICAgIH0gZWxzZSBpZiAod3JhcFdpZHRoIDwgc2xpZGVyLm1pblRocmVzaG9sZCkgewogICAgICAgICAgbmV3RWxXaWR0aCA9ICh3cmFwV2lkdGggLSAoc2xpZGVyLnNldHRpbmdzLnNsaWRlTWFyZ2luICogKHNsaWRlci5zZXR0aW5ncy5taW5TbGlkZXMgLSAxKSkpIC8gc2xpZGVyLnNldHRpbmdzLm1pblNsaWRlczsKICAgICAgICB9IGVsc2UgaWYgKHNsaWRlci5zZXR0aW5ncy5zaHJpbmtJdGVtcykgewogICAgICAgICAgbmV3RWxXaWR0aCA9IE1hdGguZmxvb3IoKHdyYXBXaWR0aCArIHNsaWRlci5zZXR0aW5ncy5zbGlkZU1hcmdpbikgLyAoTWF0aC5jZWlsKCh3cmFwV2lkdGggKyBzbGlkZXIuc2V0dGluZ3Muc2xpZGVNYXJnaW4pIC8gKG5ld0VsV2lkdGggKyBzbGlkZXIuc2V0dGluZ3Muc2xpZGVNYXJnaW4pKSkgLSBzbGlkZXIuc2V0dGluZ3Muc2xpZGVNYXJnaW4pOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbmV3RWxXaWR0aDsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2xpZGVzIGN1cnJlbnRseSB2aXNpYmxlIGluIHRoZSB2aWV3cG9ydCAoaW5jbHVkZXMgcGFydGlhbGx5IHZpc2libGUgc2xpZGVzKQogICAgICovCiAgICB2YXIgZ2V0TnVtYmVyU2xpZGVzU2hvd2luZyA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgc2xpZGVzU2hvd2luZyA9IDEsCiAgICAgIGNoaWxkV2lkdGggPSBudWxsOwogICAgICBpZiAoc2xpZGVyLnNldHRpbmdzLm1vZGUgPT09ICdob3Jpem9udGFsJyAmJiBzbGlkZXIuc2V0dGluZ3Muc2xpZGVXaWR0aCA+IDApIHsKICAgICAgICAvLyBpZiB2aWV3cG9ydCBpcyBzbWFsbGVyIHRoYW4gbWluVGhyZXNob2xkLCByZXR1cm4gbWluU2xpZGVzCiAgICAgICAgaWYgKHNsaWRlci52aWV3cG9ydC53aWR0aCgpIDwgc2xpZGVyLm1pblRocmVzaG9sZCkgewogICAgICAgICAgc2xpZGVzU2hvd2luZyA9IHNsaWRlci5zZXR0aW5ncy5taW5TbGlkZXM7CiAgICAgICAgLy8gaWYgdmlld3BvcnQgaXMgbGFyZ2VyIHRoYW4gbWF4VGhyZXNob2xkLCByZXR1cm4gbWF4U2xpZGVzCiAgICAgICAgfSBlbHNlIGlmIChzbGlkZXIudmlld3BvcnQud2lkdGgoKSA+IHNsaWRlci5tYXhUaHJlc2hvbGQpIHsKICAgICAgICAgIHNsaWRlc1Nob3dpbmcgPSBzbGlkZXIuc2V0dGluZ3MubWF4U2xpZGVzOwogICAgICAgIC8vIGlmIHZpZXdwb3J0IGlzIGJldHdlZW4gbWluIC8gbWF4IHRocmVzaG9sZHMsIGRpdmlkZSB2aWV3cG9ydCB3aWR0aCBieSBmaXJzdCBjaGlsZCB3aWR0aAogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjaGlsZFdpZHRoID0gc2xpZGVyLmNoaWxkcmVuLmZpcnN0KCkud2lkdGgoKSArIHNsaWRlci5zZXR0aW5ncy5zbGlkZU1hcmdpbjsKICAgICAgICAgIHNsaWRlc1Nob3dpbmcgPSBNYXRoLmZsb29yKChzbGlkZXIudmlld3BvcnQud2lkdGgoKSArCiAgICAgICAgICAgIHNsaWRlci5zZXR0aW5ncy5zbGlkZU1hcmdpbikgLyBjaGlsZFdpZHRoKSB8fCAxOwogICAgICAgIH0KICAgICAgLy8gaWYgInZlcnRpY2FsIiBtb2RlLCBzbGlkZXMgc2hvd2luZyB3aWxsIGFsd2F5cyBiZSBtaW5TbGlkZXMKICAgICAgfSBlbHNlIGlmIChzbGlkZXIuc2V0dGluZ3MubW9kZSA9PT0gJ3ZlcnRpY2FsJykgewogICAgICAgIHNsaWRlc1Nob3dpbmcgPSBzbGlkZXIuc2V0dGluZ3MubWluU2xpZGVzOwogICAgICB9CiAgICAgIHJldHVybiBzbGlkZXNTaG93aW5nOwogICAgfTsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBwYWdlcyAob25lIGZ1bGwgdmlld3BvcnQgb2Ygc2xpZGVzIGlzIG9uZSAicGFnZSIpCiAgICAgKi8KICAgIHZhciBnZXRQYWdlclF0eSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgcGFnZXJRdHkgPSAwLAogICAgICBicmVha1BvaW50ID0gMCwKICAgICAgY291bnRlciA9IDA7CiAgICAgIC8vIGlmIG1vdmVTbGlkZXMgaXMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyCiAgICAgIGlmIChzbGlkZXIuc2V0dGluZ3MubW92ZVNsaWRlcyA+IDApIHsKICAgICAgICBpZiAoc2xpZGVyLnNldHRpbmdzLmluZmluaXRlTG9vcCkgewogICAgICAgICAgcGFnZXJRdHkgPSBNYXRoLmNlaWwoc2xpZGVyLmNoaWxkcmVuLmxlbmd0aCAvIGdldE1vdmVCeSgpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gd2hlbiBicmVha3BvaW50IGdvZXMgYWJvdmUgY2hpbGRyZW4gbGVuZ3RoLCBjb3VudGVyIGlzIHRoZSBudW1iZXIgb2YgcGFnZXMKICAgICAgICAgIHdoaWxlIChicmVha1BvaW50IDwgc2xpZGVyLmNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgICAgICArK3BhZ2VyUXR5OwogICAgICAgICAgICBicmVha1BvaW50ID0gY291bnRlciArIGdldE51bWJlclNsaWRlc1Nob3dpbmcoKTsKICAgICAgICAgICAgY291bnRlciArPSBzbGlkZXIuc2V0dGluZ3MubW92ZVNsaWRlcyA8PSBnZXROdW1iZXJTbGlkZXNTaG93aW5nKCkgPyBzbGlkZXIuc2V0dGluZ3MubW92ZVNsaWRlcyA6IGdldE51bWJlclNsaWRlc1Nob3dpbmcoKTsKICAgICAgICAgIH0KCQkgIHJldHVybiBjb3VudGVyOwogICAgICAgIH0KICAgICAgLy8gaWYgbW92ZVNsaWRlcyBpcyAwIChhdXRvKSBkaXZpZGUgY2hpbGRyZW4gbGVuZ3RoIGJ5IHNpZGVzIHNob3dpbmcsIHRoZW4gcm91bmQgdXAKICAgICAgfSBlbHNlIHsKICAgICAgICBwYWdlclF0eSA9IE1hdGguY2VpbChzbGlkZXIuY2hpbGRyZW4ubGVuZ3RoIC8gZ2V0TnVtYmVyU2xpZGVzU2hvd2luZygpKTsKICAgICAgfQogICAgICByZXR1cm4gcGFnZXJRdHk7CiAgICB9OwoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGluZGl2aWR1YWwgc2xpZGVzIGJ5IHdoaWNoIHRvIHNoaWZ0IHRoZSBzbGlkZXIKICAgICAqLwogICAgdmFyIGdldE1vdmVCeSA9IGZ1bmN0aW9uKCkgewogICAgICAvLyBpZiBtb3ZlU2xpZGVzIHdhcyBzZXQgYnkgdGhlIHVzZXIgYW5kIG1vdmVTbGlkZXMgaXMgbGVzcyB0aGFuIG51bWJlciBvZiBzbGlkZXMgc2hvd2luZwogICAgICBpZiAoc2xpZGVyLnNldHRpbmdzLm1vdmVTbGlkZXMgPiAwICYmIHNsaWRlci5zZXR0aW5ncy5tb3ZlU2xpZGVzIDw9IGdldE51bWJlclNsaWRlc1Nob3dpbmcoKSkgewogICAgICAgIHJldHVybiBzbGlkZXIuc2V0dGluZ3MubW92ZVNsaWRlczsKICAgICAgfQogICAgICAvLyBpZiBtb3ZlU2xpZGVzIGlzIDAgKGF1dG8pCiAgICAgIHJldHVybiBnZXROdW1iZXJTbGlkZXNTaG93aW5nKCk7CiAgICB9OwoKICAgIC8qKgogICAgICogU2V0cyB0aGUgc2xpZGVyJ3MgKGVsKSBsZWZ0IG9yIHRvcCBwb3NpdGlvbgogICAgICovCiAgICB2YXIgc2V0U2xpZGVQb3NpdGlvbiA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgcG9zaXRpb24sIGxhc3RDaGlsZCwgbGFzdFNob3dpbmdJbmRleDsKICAgICAgLy8gaWYgbGFzdCBzbGlkZSwgbm90IGluZmluaXRlIGxvb3AsIGFuZCBudW1iZXIgb2YgY2hpbGRyZW4gaXMgbGFyZ2VyIHRoYW4gc3BlY2lmaWVkIG1heFNsaWRlcwogICAgICBpZiAoc2xpZGVyLmNoaWxkcmVuLmxlbmd0aCA+IHNsaWRlci5zZXR0aW5ncy5tYXhTbGlkZXMgJiYgc2xpZGVyLmFjdGl2ZS5sYXN0ICYmICFzbGlkZXIuc2V0dGluZ3MuaW5maW5pdGVMb29wKSB7CiAgICAgICAgaWYgKHNsaWRlci5zZXR0aW5ncy5tb2RlID09PSAnaG9yaXpvbnRhbCcpIHsKICAgICAgICAgIC8vIGdldCB0aGUgbGFzdCBjaGlsZCdzIHBvc2l0aW9uCiAgICAgICAgICBsYXN0Q2hpbGQgPSBzbGlkZXIuY2hpbGRyZW4ubGFzdCgpOwogICAgICAgICAgcG9zaXRpb24gPSBsYXN0Q2hpbGQucG9zaXRpb24oKTsKICAgICAgICAgIC8vIHNldCB0aGUgbGVmdCBwb3NpdGlvbgogICAgICAgICAgc2V0UG9zaXRpb25Qcm9wZXJ0eSgtKHBvc2l0aW9uLmxlZnQgLSAoc2xpZGVyLnZpZXdwb3J0LndpZHRoKCkgLSBsYXN0Q2hpbGQub3V0ZXJXaWR0aCgpKSksICdyZXNldCcsIDApOwogICAgICAgIH0gZWxzZSBpZiAoc2xpZGVyLnNldHRpbmdzLm1vZGUgPT09ICd2ZXJ0aWNhbCcpIHsKICAgICAgICAgIC8vIGdldCB0aGUgbGFzdCBzaG93aW5nIGluZGV4J3MgcG9zaXRpb24KICAgICAgICAgIGxhc3RTaG93aW5nSW5kZXggPSBzbGlkZXIuY2hpbGRyZW4ubGVuZ3RoIC0gc2xpZGVyLnNldHRpbmdzLm1pblNsaWRlczsKICAgICAgICAgIHBvc2l0aW9uID0gc2xpZGVyLmNoaWxkcmVuLmVxKGxhc3RTaG93aW5nSW5kZXgpLnBvc2l0aW9uKCk7CiAgICAgICAgICAvLyBzZXQgdGhlIHRvcCBwb3NpdGlvbgogICAgICAgICAgc2V0UG9zaXRpb25Qcm9wZXJ0eSgtcG9zaXRpb24udG9wLCAncmVzZXQnLCAwKTsKICAgICAgICB9CiAgICAgIC8vIGlmIG5vdCBsYXN0IHNsaWRlCiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gZ2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3Qgc2hvd2luZyBzbGlkZQogICAgICAgIHBvc2l0aW9uID0gc2xpZGVyLmNoaWxkcmVuLmVxKHNsaWRlci5hY3RpdmUuaW5kZXggKiBnZXRNb3ZlQnkoKSkucG9zaXRpb24oKTsKICAgICAgICAvLyBjaGVjayBmb3IgbGFzdCBzbGlkZQogICAgICAgIGlmIChzbGlkZXIuYWN0aXZlLmluZGV4ID09PSBnZXRQYWdlclF0eSgpIC0gMSkgeyBzbGlkZXIuYWN0aXZlLmxhc3QgPSB0cnVlOyB9CiAgICAgICAgLy8gc2V0IHRoZSByZXNwZWN0aXZlIHBvc2l0aW9uCiAgICAgICAgaWYgKHBvc2l0aW9uICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgIGlmIChzbGlkZXIuc2V0dGluZ3MubW9kZSA9PT0gJ2hvcml6b250YWwnKSB7IHNldFBvc2l0aW9uUHJvcGVydHkoLXBvc2l0aW9uLmxlZnQsICdyZXNldCcsIDApOyB9CiAgICAgICAgICBlbHNlIGlmIChzbGlkZXIuc2V0dGluZ3MubW9kZSA9PT0gJ3ZlcnRpY2FsJykgeyBzZXRQb3NpdGlvblByb3BlcnR5KC1wb3NpdGlvbi50b3AsICdyZXNldCcsIDApOyB9CiAgICAgICAgfQogICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogU2V0cyB0aGUgZWwncyBhbmltYXRpbmcgcHJvcGVydHkgcG9zaXRpb24gKHdoaWNoIGluIHR1cm4gd2lsbCBzb21ldGltZXMgYW5pbWF0ZSBlbCkuCiAgICAgKiBJZiB1c2luZyBDU1MsIHNldHMgdGhlIHRyYW5zZm9ybSBwcm9wZXJ0eS4gSWYgbm90IHVzaW5nIENTUywgc2V0cyB0aGUgdG9wIC8gbGVmdCBwcm9wZXJ0eS4KICAgICAqCiAgICAgKiBAcGFyYW0gdmFsdWUgKGludCkKICAgICAqICAtIHRoZSBhbmltYXRpbmcgcHJvcGVydHkncyB2YWx1ZQogICAgICoKICAgICAqIEBwYXJhbSB0eXBlIChzdHJpbmcpICdzbGlkZScsICdyZXNldCcsICd0aWNrZXInCiAgICAgKiAgLSB0aGUgdHlwZSBvZiBpbnN0YW5jZSBmb3Igd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIGJlaW5nCiAgICAgKgogICAgICogQHBhcmFtIGR1cmF0aW9uIChpbnQpCiAgICAgKiAgLSB0aGUgYW1vdW50IG9mIHRpbWUgKGluIG1zKSB0aGUgdHJhbnNpdGlvbiBzaG91bGQgb2NjdXB5CiAgICAgKgogICAgICogQHBhcmFtIHBhcmFtcyAoYXJyYXkpIG9wdGlvbmFsCiAgICAgKiAgLSBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgY29udGFpbmluZyBhbnkgdmFyaWFibGVzIHRoYXQgbmVlZCB0byBiZSBwYXNzZWQgaW4KICAgICAqLwogICAgdmFyIHNldFBvc2l0aW9uUHJvcGVydHkgPSBmdW5jdGlvbih2YWx1ZSwgdHlwZSwgZHVyYXRpb24sIHBhcmFtcykgewogICAgICB2YXIgYW5pbWF0ZU9iaiwgcHJvcFZhbHVlOwogICAgICAvLyB1c2UgQ1NTIHRyYW5zZm9ybQogICAgICBpZiAoc2xpZGVyLnVzaW5nQ1NTKSB7CiAgICAgICAgLy8gZGV0ZXJtaW5lIHRoZSB0cmFuc2xhdGUzZCB2YWx1ZQogICAgICAgIHByb3BWYWx1ZSA9IHNsaWRlci5zZXR0aW5ncy5tb2RlID09PSAndmVydGljYWwnID8gJ3RyYW5zbGF0ZTNkKDAsICcgKyB2YWx1ZSArICdweCwgMCknIDogJ3RyYW5zbGF0ZTNkKCcgKyB2YWx1ZSArICdweCwgMCwgMCknOwogICAgICAgIC8vIGFkZCB0aGUgQ1NTIHRyYW5zaXRpb24tZHVyYXRpb24KICAgICAgICBlbC5jc3MoJy0nICsgc2xpZGVyLmNzc1ByZWZpeCArICctdHJhbnNpdGlvbi1kdXJhdGlvbicsIGR1cmF0aW9uIC8gMTAwMCArICdzJyk7CiAgICAgICAgaWYgKHR5cGUgPT09ICdzbGlkZScpIHsKICAgICAgICAgIC8vIHNldCB0aGUgcHJvcGVydHkgdmFsdWUKICAgICAgICAgIGVsLmNzcyhzbGlkZXIuYW5pbVByb3AsIHByb3BWYWx1ZSk7CiAgICAgICAgICBpZiAoZHVyYXRpb24gIT09IDApIHsKICAgICAgICAgICAgLy8gYWRkIGEgY2FsbGJhY2sgbWV0aG9kIC0gZXhlY3V0ZXMgd2hlbiBDU1MgdHJhbnNpdGlvbiBjb21wbGV0ZXMKICAgICAgICAgICAgZWwub24oJ3RyYW5zaXRpb25lbmQgd2Via2l0VHJhbnNpdGlvbkVuZCBvVHJhbnNpdGlvbkVuZCBNU1RyYW5zaXRpb25FbmQnLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgLy9tYWtlIHN1cmUgaXQncyB0aGUgY29ycmVjdCBvbmUKICAgICAgICAgICAgICBpZiAoISQoZS50YXJnZXQpLmlzKGVsKSkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAvLyByZW1vdmUgdGhlIGNhbGxiYWNrCiAgICAgICAgICAgICAgZWwub2ZmKCd0cmFuc2l0aW9uZW5kIHdlYmtpdFRyYW5zaXRpb25FbmQgb1RyYW5zaXRpb25FbmQgTVNUcmFuc2l0aW9uRW5kJyk7CiAgICAgICAgICAgICAgdXBkYXRlQWZ0ZXJTbGlkZVRyYW5zaXRpb24oKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9IGVsc2UgeyAvL2R1cmF0aW9uID0gMAogICAgICAgICAgICB1cGRhdGVBZnRlclNsaWRlVHJhbnNpdGlvbigpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3Jlc2V0JykgewogICAgICAgICAgZWwuY3NzKHNsaWRlci5hbmltUHJvcCwgcHJvcFZhbHVlKTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd0aWNrZXInKSB7CiAgICAgICAgICAvLyBtYWtlIHRoZSB0cmFuc2l0aW9uIHVzZSAnbGluZWFyJwogICAgICAgICAgZWwuY3NzKCctJyArIHNsaWRlci5jc3NQcmVmaXggKyAnLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uJywgJ2xpbmVhcicpOwogICAgICAgICAgZWwuY3NzKHNsaWRlci5hbmltUHJvcCwgcHJvcFZhbHVlKTsKICAgICAgICAgIGlmIChkdXJhdGlvbiAhPT0gMCkgewogICAgICAgICAgICBlbC5vbigndHJhbnNpdGlvbmVuZCB3ZWJraXRUcmFuc2l0aW9uRW5kIG9UcmFuc2l0aW9uRW5kIE1TVHJhbnNpdGlvbkVuZCcsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAvL21ha2Ugc3VyZSBpdCdzIHRoZSBjb3JyZWN0IG9uZQogICAgICAgICAgICAgIGlmICghJChlLnRhcmdldCkuaXMoZWwpKSB7IHJldHVybjsgfQogICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgY2FsbGJhY2sKICAgICAgICAgICAgICBlbC5vZmYoJ3RyYW5zaXRpb25lbmQgd2Via2l0VHJhbnNpdGlvbkVuZCBvVHJhbnNpdGlvbkVuZCBNU1RyYW5zaXRpb25FbmQnKTsKICAgICAgICAgICAgICAvLyByZXNldCB0aGUgcG9zaXRpb24KICAgICAgICAgICAgICBzZXRQb3NpdGlvblByb3BlcnR5KHBhcmFtcy5yZXNldFZhbHVlLCAncmVzZXQnLCAwKTsKICAgICAgICAgICAgICAvLyBzdGFydCB0aGUgbG9vcCBhZ2FpbgogICAgICAgICAgICAgIHRpY2tlckxvb3AoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9IGVsc2UgeyAvL2R1cmF0aW9uID0gMAogICAgICAgICAgICBzZXRQb3NpdGlvblByb3BlcnR5KHBhcmFtcy5yZXNldFZhbHVlLCAncmVzZXQnLCAwKTsKICAgICAgICAgICAgdGlja2VyTG9vcCgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgLy8gdXNlIEpTIGFuaW1hdGUKICAgICAgfSBlbHNlIHsKICAgICAgICBhbmltYXRlT2JqID0ge307CiAgICAgICAgYW5pbWF0ZU9ialtzbGlkZXIuYW5pbVByb3BdID0gdmFsdWU7CiAgICAgICAgaWYgKHR5cGUgPT09ICdzbGlkZScpIHsKICAgICAgICAgIGVsLmFuaW1hdGUoYW5pbWF0ZU9iaiwgZHVyYXRpb24sIHNsaWRlci5zZXR0aW5ncy5lYXNpbmcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICB1cGRhdGVBZnRlclNsaWRlVHJhbnNpdGlvbigpOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAncmVzZXQnKSB7CiAgICAgICAgICBlbC5jc3Moc2xpZGVyLmFuaW1Qcm9wLCB2YWx1ZSk7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAndGlja2VyJykgewogICAgICAgICAgZWwuYW5pbWF0ZShhbmltYXRlT2JqLCBkdXJhdGlvbiwgJ2xpbmVhcicsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBzZXRQb3NpdGlvblByb3BlcnR5KHBhcmFtcy5yZXNldFZhbHVlLCAncmVzZXQnLCAwKTsKICAgICAgICAgICAgLy8gcnVuIHRoZSByZWN1cnNpdmUgbG9vcCBhZnRlciBhbmltYXRpb24KICAgICAgICAgICAgdGlja2VyTG9vcCgpOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogUG9wdWxhdGVzIHRoZSBwYWdlciB3aXRoIHByb3BlciBhbW91bnQgb2YgcGFnZXMKICAgICAqLwogICAgdmFyIHBvcHVsYXRlUGFnZXIgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIHBhZ2VySHRtbCA9ICcnLAogICAgICBsaW5rQ29udGVudCA9ICcnLAogICAgICBwYWdlclF0eSA9IGdldFBhZ2VyUXR5KCk7CiAgICAgIC8vIGxvb3AgdGhyb3VnaCBlYWNoIHBhZ2VyIGl0ZW0KICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWdlclF0eTsgaSsrKSB7CiAgICAgICAgbGlua0NvbnRlbnQgPSAnJzsKICAgICAgICAvLyBpZiBhIGJ1aWxkUGFnZXIgZnVuY3Rpb24gaXMgc3VwcGxpZWQsIHVzZSBpdCB0byBnZXQgcGFnZXIgbGluayB2YWx1ZSwgZWxzZSB1c2UgaW5kZXggKyAxCiAgICAgICAgaWYgKHNsaWRlci5zZXR0aW5ncy5idWlsZFBhZ2VyICYmICQuaXNGdW5jdGlvbihzbGlkZXIuc2V0dGluZ3MuYnVpbGRQYWdlcikgfHwgc2xpZGVyLnNldHRpbmdzLnBhZ2VyQ3VzdG9tKSB7CiAgICAgICAgICBsaW5rQ29udGVudCA9IHNsaWRlci5zZXR0aW5ncy5idWlsZFBhZ2VyKGkpOwogICAgICAgICAgc2xpZGVyLnBhZ2VyRWwuYWRkQ2xhc3MoJ2J4LWN1c3RvbS1wYWdlcicpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsaW5rQ29udGVudCA9IGkgKyAxOwogICAgICAgICAgc2xpZGVyLnBhZ2VyRWwuYWRkQ2xhc3MoJ2J4LWRlZmF1bHQtcGFnZXInKTsKICAgICAgICB9CiAgICAgICAgLy8gdmFyIGxpbmtDb250ZW50ID0gc2xpZGVyLnNldHRpbmdzLmJ1aWxkUGFnZXIgJiYgJC5pc0Z1bmN0aW9uKHNsaWRlci5zZXR0aW5ncy5idWlsZFBhZ2VyKSA/IHNsaWRlci5zZXR0aW5ncy5idWlsZFBhZ2VyKGkpIDogaSArIDE7CiAgICAgICAgLy8gYWRkIHRoZSBtYXJrdXAgdG8gdGhlIHN0cmluZwogICAgICAgIHBhZ2VySHRtbCArPSAnPGRpdiBjbGFzcz0iYngtcGFnZXItaXRlbSI+PGEgaHJlZj0iIiBkYXRhLXNsaWRlLWluZGV4PSInICsgaSArICciIGNsYXNzPSJieC1wYWdlci1saW5rIj4nICsgbGlua0NvbnRlbnQgKyAnPC9hPjwvZGl2Pic7CiAgICAgIH0KICAgICAgLy8gcG9wdWxhdGUgdGhlIHBhZ2VyIGVsZW1lbnQgd2l0aCBwYWdlciBsaW5rcwogICAgICBzbGlkZXIucGFnZXJFbC5odG1sKHBhZ2VySHRtbCk7CiAgICB9OwoKICAgIC8qKgogICAgICogQXBwZW5kcyB0aGUgcGFnZXIgdG8gdGhlIGNvbnRyb2xzIGVsZW1lbnQKICAgICAqLwogICAgdmFyIGFwcGVuZFBhZ2VyID0gZnVuY3Rpb24oKSB7CiAgICAgIGlmICghc2xpZGVyLnNldHRpbmdzLnBhZ2VyQ3VzdG9tKSB7CiAgICAgICAgLy8gY3JlYXRlIHRoZSBwYWdlciBET00gZWxlbWVudAogICAgICAgIHNsaWRlci5wYWdlckVsID0gJCgnPGRpdiBjbGFzcz0iYngtcGFnZXIiIC8+Jyk7CiAgICAgICAgLy8gaWYgYSBwYWdlciBzZWxlY3RvciB3YXMgc3VwcGxpZWQsIHBvcHVsYXRlIGl0IHdpdGggdGhlIHBhZ2VyCiAgICAgICAgaWYgKHNsaWRlci5zZXR0aW5ncy5wYWdlclNlbGVjdG9yKSB7CiAgICAgICAgICAkKHNsaWRlci5zZXR0aW5ncy5wYWdlclNlbGVjdG9yKS5odG1sKHNsaWRlci5wYWdlckVsKTsKICAgICAgICAvLyBpZiBubyBwYWdlciBzZWxlY3RvciB3YXMgc3VwcGxpZWQsIGFkZCBpdCBhZnRlciB0aGUgd3JhcHBlcgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzbGlkZXIuY29udHJvbHMuZWwuYWRkQ2xhc3MoJ2J4LWhhcy1wYWdlcicpLmFwcGVuZChzbGlkZXIucGFnZXJFbCk7CiAgICAgICAgfQogICAgICAgIC8vIHBvcHVsYXRlIHRoZSBwYWdlcgogICAgICAgIHBvcHVsYXRlUGFnZXIoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzbGlkZXIucGFnZXJFbCA9ICQoc2xpZGVyLnNldHRpbmdzLnBhZ2VyQ3VzdG9tKTsKICAgICAgfQogICAgICAvLyBhc3NpZ24gdGhlIHBhZ2VyIGNsaWNrIGJpbmRpbmcKICAgICAgc2xpZGVyLnBhZ2VyRWwub24oJ2NsaWNrIHRvdWNoZW5kJywgJ2EnLCBjbGlja1BhZ2VyQmluZCk7CiAgICB9OwoKICAgIC8qKgogICAgICogQXBwZW5kcyBwcmV2IC8gbmV4dCBjb250cm9scyB0byB0aGUgY29udHJvbHMgZWxlbWVudAogICAgICovCiAgICB2YXIgYXBwZW5kQ29udHJvbHMgPSBmdW5jdGlvbigpIHsKICAgICAgc2xpZGVyLmNvbnRyb2xzLm5leHQgPSAkKCc8YSBjbGFzcz0iYngtbmV4dCIgaHJlZj0iIj4nICsgc2xpZGVyLnNldHRpbmdzLm5leHRUZXh0ICsgJzwvYT4nKTsKICAgICAgc2xpZGVyLmNvbnRyb2xzLnByZXYgPSAkKCc8YSBjbGFzcz0iYngtcHJldiIgaHJlZj0iIj4nICsgc2xpZGVyLnNldHRpbmdzLnByZXZUZXh0ICsgJzwvYT4nKTsKICAgICAgLy8gYWRkIGNsaWNrIGFjdGlvbnMgdG8gdGhlIGNvbnRyb2xzCiAgICAgIHNsaWRlci5jb250cm9scy5uZXh0Lm9uKCdjbGljayB0b3VjaGVuZCcsIGNsaWNrTmV4dEJpbmQpOwogICAgICBzbGlkZXIuY29udHJvbHMucHJldi5vbignY2xpY2sgdG91Y2hlbmQnLCBjbGlja1ByZXZCaW5kKTsKICAgICAgLy8gaWYgbmV4dFNlbGVjdG9yIHdhcyBzdXBwbGllZCwgcG9wdWxhdGUgaXQKICAgICAgaWYgKHNsaWRlci5zZXR0aW5ncy5uZXh0U2VsZWN0b3IpIHsKICAgICAgICAkKHNsaWRlci5zZXR0aW5ncy5uZXh0U2VsZWN0b3IpLmFwcGVuZChzbGlkZXIuY29udHJvbHMubmV4dCk7CiAgICAgIH0KICAgICAgLy8gaWYgcHJldlNlbGVjdG9yIHdhcyBzdXBwbGllZCwgcG9wdWxhdGUgaXQKICAgICAgaWYgKHNsaWRlci5zZXR0aW5ncy5wcmV2U2VsZWN0b3IpIHsKICAgICAgICAkKHNsaWRlci5zZXR0aW5ncy5wcmV2U2VsZWN0b3IpLmFwcGVuZChzbGlkZXIuY29udHJvbHMucHJldik7CiAgICAgIH0KICAgICAgLy8gaWYgbm8gY3VzdG9tIHNlbGVjdG9ycyB3ZXJlIHN1cHBsaWVkCiAgICAgIGlmICghc2xpZGVyLnNldHRpbmdzLm5leHRTZWxlY3RvciAmJiAhc2xpZGVyLnNldHRpbmdzLnByZXZTZWxlY3RvcikgewogICAgICAgIC8vIGFkZCB0aGUgY29udHJvbHMgdG8gdGhlIERPTQogICAgICAgIHNsaWRlci5jb250cm9scy5kaXJlY3Rpb25FbCA9ICQoJzxkaXYgY2xhc3M9ImJ4LWNvbnRyb2xzLWRpcmVjdGlvbiIgLz4nKTsKICAgICAgICAvLyBhZGQgdGhlIGNvbnRyb2wgZWxlbWVudHMgdG8gdGhlIGRpcmVjdGlvbkVsCiAgICAgICAgc2xpZGVyLmNvbnRyb2xzLmRpcmVjdGlvbkVsLmFwcGVuZChzbGlkZXIuY29udHJvbHMucHJldikuYXBwZW5kKHNsaWRlci5jb250cm9scy5uZXh0KTsKICAgICAgICAvLyBzbGlkZXIudmlld3BvcnQuYXBwZW5kKHNsaWRlci5jb250cm9scy5kaXJlY3Rpb25FbCk7CiAgICAgICAgc2xpZGVyLmNvbnRyb2xzLmVsLmFkZENsYXNzKCdieC1oYXMtY29udHJvbHMtZGlyZWN0aW9uJykuYXBwZW5kKHNsaWRlci5jb250cm9scy5kaXJlY3Rpb25FbCk7CiAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBBcHBlbmRzIHN0YXJ0IC8gc3RvcCBhdXRvIGNvbnRyb2xzIHRvIHRoZSBjb250cm9scyBlbGVtZW50CiAgICAgKi8KICAgIHZhciBhcHBlbmRDb250cm9sc0F1dG8gPSBmdW5jdGlvbigpIHsKICAgICAgc2xpZGVyLmNvbnRyb2xzLnN0YXJ0ID0gJCgnPGRpdiBjbGFzcz0iYngtY29udHJvbHMtYXV0by1pdGVtIj48YSBjbGFzcz0iYngtc3RhcnQiIGhyZWY9IiI+JyArIHNsaWRlci5zZXR0aW5ncy5zdGFydFRleHQgKyAnPC9hPjwvZGl2PicpOwogICAgICBzbGlkZXIuY29udHJvbHMuc3RvcCA9ICQoJzxkaXYgY2xhc3M9ImJ4LWNvbnRyb2xzLWF1dG8taXRlbSI+PGEgY2xhc3M9ImJ4LXN0b3AiIGhyZWY9IiI+JyArIHNsaWRlci5zZXR0aW5ncy5zdG9wVGV4dCArICc8L2E+PC9kaXY+Jyk7CiAgICAgIC8vIGFkZCB0aGUgY29udHJvbHMgdG8gdGhlIERPTQogICAgICBzbGlkZXIuY29udHJvbHMuYXV0b0VsID0gJCgnPGRpdiBjbGFzcz0iYngtY29udHJvbHMtYXV0byIgLz4nKTsKICAgICAgLy8gb24gY2xpY2sgYWN0aW9ucyB0byB0aGUgY29udHJvbHMKICAgICAgc2xpZGVyLmNvbnRyb2xzLmF1dG9FbC5vbignY2xpY2snLCAnLmJ4LXN0YXJ0JywgY2xpY2tTdGFydEJpbmQpOwogICAgICBzbGlkZXIuY29udHJvbHMuYXV0b0VsLm9uKCdjbGljaycsICcuYngtc3RvcCcsIGNsaWNrU3RvcEJpbmQpOwogICAgICAvLyBpZiBhdXRvQ29udHJvbHNDb21iaW5lLCBpbnNlcnQgb25seSB0aGUgInN0YXJ0IiBjb250cm9sCiAgICAgIGlmIChzbGlkZXIuc2V0dGluZ3MuYXV0b0NvbnRyb2xzQ29tYmluZSkgewogICAgICAgIHNsaWRlci5jb250cm9scy5hdXRvRWwuYXBwZW5kKHNsaWRlci5jb250cm9scy5zdGFydCk7CiAgICAgIC8vIGlmIGF1dG9Db250cm9sc0NvbWJpbmUgaXMgZmFsc2UsIGluc2VydCBib3RoIGNvbnRyb2xzCiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2xpZGVyLmNvbnRyb2xzLmF1dG9FbC5hcHBlbmQoc2xpZGVyLmNvbnRyb2xzLnN0YXJ0KS5hcHBlbmQoc2xpZGVyLmNvbnRyb2xzLnN0b3ApOwogICAgICB9CiAgICAgIC8vIGlmIGF1dG8gY29udHJvbHMgc2VsZWN0b3Igd2FzIHN1cHBsaWVkLCBwb3B1bGF0ZSBpdCB3aXRoIHRoZSBjb250cm9scwogICAgICBpZiAoc2xpZGVyLnNldHRpbmdzLmF1dG9Db250cm9sc1NlbGVjdG9yKSB7CiAgICAgICAgJChzbGlkZXIuc2V0dGluZ3MuYXV0b0NvbnRyb2xzU2VsZWN0b3IpLmh0bWwoc2xpZGVyLmNvbnRyb2xzLmF1dG9FbCk7CiAgICAgIC8vIGlmIGF1dG8gY29udHJvbHMgc2VsZWN0b3Igd2FzIG5vdCBzdXBwbGllZCwgYWRkIGl0IGFmdGVyIHRoZSB3cmFwcGVyCiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2xpZGVyLmNvbnRyb2xzLmVsLmFkZENsYXNzKCdieC1oYXMtY29udHJvbHMtYXV0bycpLmFwcGVuZChzbGlkZXIuY29udHJvbHMuYXV0b0VsKTsKICAgICAgfQogICAgICAvLyB1cGRhdGUgdGhlIGF1dG8gY29udHJvbHMKICAgICAgdXBkYXRlQXV0b0NvbnRyb2xzKHNsaWRlci5zZXR0aW5ncy5hdXRvU3RhcnQgPyAnc3RvcCcgOiAnc3RhcnQnKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBBcHBlbmRzIGltYWdlIGNhcHRpb25zIHRvIHRoZSBET00KICAgICAqLwogICAgdmFyIGFwcGVuZENhcHRpb25zID0gZnVuY3Rpb24oKSB7CiAgICAgIC8vIGN5Y2xlIHRocm91Z2ggZWFjaCBjaGlsZAogICAgICBzbGlkZXIuY2hpbGRyZW4uZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgICAgIC8vIGdldCB0aGUgaW1hZ2UgdGl0bGUgYXR0cmlidXRlCiAgICAgICAgdmFyIHRpdGxlID0gJCh0aGlzKS5maW5kKCdpbWc6Zmlyc3QnKS5hdHRyKCd0aXRsZScpOwogICAgICAgIC8vIGFwcGVuZCB0aGUgY2FwdGlvbgogICAgICAgIGlmICh0aXRsZSAhPT0gdW5kZWZpbmVkICYmICgnJyArIHRpdGxlKS5sZW5ndGgpIHsKICAgICAgICAgICQodGhpcykuYXBwZW5kKCc8ZGl2IGNsYXNzPSJieC1jYXB0aW9uIj48c3Bhbj4nICsgdGl0bGUgKyAnPC9zcGFuPjwvZGl2PicpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQ2xpY2sgbmV4dCBiaW5kaW5nCiAgICAgKgogICAgICogQHBhcmFtIGUgKGV2ZW50KQogICAgICogIC0gRE9NIGV2ZW50IG9iamVjdAogICAgICovCiAgICB2YXIgY2xpY2tOZXh0QmluZCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBpZiAoc2xpZGVyLmNvbnRyb2xzLmVsLmhhc0NsYXNzKCdkaXNhYmxlZCcpKSB7IHJldHVybjsgfQogICAgICAvLyBpZiBhdXRvIHNob3cgaXMgcnVubmluZywgc3RvcCBpdAogICAgICBpZiAoc2xpZGVyLnNldHRpbmdzLmF1dG8gJiYgc2xpZGVyLnNldHRpbmdzLnN0b3BBdXRvT25DbGljaykgeyBlbC5zdG9wQXV0bygpOyB9CiAgICAgIGVsLmdvVG9OZXh0U2xpZGUoKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBDbGljayBwcmV2IGJpbmRpbmcKICAgICAqCiAgICAgKiBAcGFyYW0gZSAoZXZlbnQpCiAgICAgKiAgLSBET00gZXZlbnQgb2JqZWN0CiAgICAgKi8KICAgIHZhciBjbGlja1ByZXZCaW5kID0gZnVuY3Rpb24oZSkgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGlmIChzbGlkZXIuY29udHJvbHMuZWwuaGFzQ2xhc3MoJ2Rpc2FibGVkJykpIHsgcmV0dXJuOyB9CiAgICAgIC8vIGlmIGF1dG8gc2hvdyBpcyBydW5uaW5nLCBzdG9wIGl0CiAgICAgIGlmIChzbGlkZXIuc2V0dGluZ3MuYXV0byAmJiBzbGlkZXIuc2V0dGluZ3Muc3RvcEF1dG9PbkNsaWNrKSB7IGVsLnN0b3BBdXRvKCk7IH0KICAgICAgZWwuZ29Ub1ByZXZTbGlkZSgpOwogICAgfTsKCiAgICAvKioKICAgICAqIENsaWNrIHN0YXJ0IGJpbmRpbmcKICAgICAqCiAgICAgKiBAcGFyYW0gZSAoZXZlbnQpCiAgICAgKiAgLSBET00gZXZlbnQgb2JqZWN0CiAgICAgKi8KICAgIHZhciBjbGlja1N0YXJ0QmluZCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgZWwuc3RhcnRBdXRvKCk7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBDbGljayBzdG9wIGJpbmRpbmcKICAgICAqCiAgICAgKiBAcGFyYW0gZSAoZXZlbnQpCiAgICAgKiAgLSBET00gZXZlbnQgb2JqZWN0CiAgICAgKi8KICAgIHZhciBjbGlja1N0b3BCaW5kID0gZnVuY3Rpb24oZSkgewogICAgICBlbC5zdG9wQXV0bygpOwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICB9OwoKICAgIC8qKgogICAgICogQ2xpY2sgcGFnZXIgYmluZGluZwogICAgICoKICAgICAqIEBwYXJhbSBlIChldmVudCkKICAgICAqICAtIERPTSBldmVudCBvYmplY3QKICAgICAqLwogICAgdmFyIGNsaWNrUGFnZXJCaW5kID0gZnVuY3Rpb24oZSkgewogICAgICB2YXIgcGFnZXJMaW5rLCBwYWdlckluZGV4OwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGlmIChzbGlkZXIuY29udHJvbHMuZWwuaGFzQ2xhc3MoJ2Rpc2FibGVkJykpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgLy8gaWYgYXV0byBzaG93IGlzIHJ1bm5pbmcsIHN0b3AgaXQKICAgICAgaWYgKHNsaWRlci5zZXR0aW5ncy5hdXRvICAmJiBzbGlkZXIuc2V0dGluZ3Muc3RvcEF1dG9PbkNsaWNrKSB7IGVsLnN0b3BBdXRvKCk7IH0KICAgICAgcGFnZXJMaW5rID0gJChlLmN1cnJlbnRUYXJnZXQpOwogICAgICBpZiAocGFnZXJMaW5rLmF0dHIoJ2RhdGEtc2xpZGUtaW5kZXgnKSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgcGFnZXJJbmRleCA9IHBhcnNlSW50KHBhZ2VyTGluay5hdHRyKCdkYXRhLXNsaWRlLWluZGV4JykpOwogICAgICAgIC8vIGlmIGNsaWNrZWQgcGFnZXIgbGluayBpcyBub3QgYWN0aXZlLCBjb250aW51ZSB3aXRoIHRoZSBnb1RvU2xpZGUgY2FsbAogICAgICAgIGlmIChwYWdlckluZGV4ICE9PSBzbGlkZXIuYWN0aXZlLmluZGV4KSB7IGVsLmdvVG9TbGlkZShwYWdlckluZGV4KTsgfQogICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogVXBkYXRlcyB0aGUgcGFnZXIgbGlua3Mgd2l0aCBhbiBhY3RpdmUgY2xhc3MKICAgICAqCiAgICAgKiBAcGFyYW0gc2xpZGVJbmRleCAoaW50KQogICAgICogIC0gaW5kZXggb2Ygc2xpZGUgdG8gbWFrZSBhY3RpdmUKICAgICAqLwogICAgdmFyIHVwZGF0ZVBhZ2VyQWN0aXZlID0gZnVuY3Rpb24oc2xpZGVJbmRleCkgewogICAgICAvLyBpZiAic2hvcnQiIHBhZ2VyIHR5cGUKICAgICAgdmFyIGxlbiA9IHNsaWRlci5jaGlsZHJlbi5sZW5ndGg7IC8vIG5iIG9mIGNoaWxkcmVuCiAgICAgIGlmIChzbGlkZXIuc2V0dGluZ3MucGFnZXJUeXBlID09PSAnc2hvcnQnKSB7CiAgICAgICAgaWYgKHNsaWRlci5zZXR0aW5ncy5tYXhTbGlkZXMgPiAxKSB7CiAgICAgICAgICBsZW4gPSBNYXRoLmNlaWwoc2xpZGVyLmNoaWxkcmVuLmxlbmd0aCAvIHNsaWRlci5zZXR0aW5ncy5tYXhTbGlkZXMpOwogICAgICAgIH0KICAgICAgICBzbGlkZXIucGFnZXJFbC5odG1sKChzbGlkZUluZGV4ICsgMSkgKyBzbGlkZXIuc2V0dGluZ3MucGFnZXJTaG9ydFNlcGFyYXRvciArIGxlbik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIC8vIHJlbW92ZSBhbGwgcGFnZXIgYWN0aXZlIGNsYXNzZXMKICAgICAgc2xpZGVyLnBhZ2VyRWwuZmluZCgnYScpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsKICAgICAgLy8gYXBwbHkgdGhlIGFjdGl2ZSBjbGFzcyBmb3IgYWxsIHBhZ2VycwogICAgICBzbGlkZXIucGFnZXJFbC5lYWNoKGZ1bmN0aW9uKGksIGVsKSB7ICQoZWwpLmZpbmQoJ2EnKS5lcShzbGlkZUluZGV4KS5hZGRDbGFzcygnYWN0aXZlJyk7IH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIFBlcmZvcm1zIG5lZWRlZCBhY3Rpb25zIGFmdGVyIGEgc2xpZGUgdHJhbnNpdGlvbgogICAgICovCiAgICB2YXIgdXBkYXRlQWZ0ZXJTbGlkZVRyYW5zaXRpb24gPSBmdW5jdGlvbigpIHsKICAgICAgLy8gaWYgaW5maW5pdGUgbG9vcCBpcyB0cnVlCiAgICAgIGlmIChzbGlkZXIuc2V0dGluZ3MuaW5maW5pdGVMb29wKSB7CiAgICAgICAgdmFyIHBvc2l0aW9uID0gJyc7CiAgICAgICAgLy8gZmlyc3Qgc2xpZGUKICAgICAgICBpZiAoc2xpZGVyLmFjdGl2ZS5pbmRleCA9PT0gMCkgewogICAgICAgICAgLy8gc2V0IHRoZSBuZXcgcG9zaXRpb24KICAgICAgICAgIHBvc2l0aW9uID0gc2xpZGVyLmNoaWxkcmVuLmVxKDApLnBvc2l0aW9uKCk7CiAgICAgICAgLy8gY2Fyb3VzZWwsIGxhc3Qgc2xpZGUKICAgICAgICB9IGVsc2UgaWYgKHNsaWRlci5hY3RpdmUuaW5kZXggPT09IGdldFBhZ2VyUXR5KCkgLSAxICYmIHNsaWRlci5jYXJvdXNlbCkgewogICAgICAgICAgcG9zaXRpb24gPSBzbGlkZXIuY2hpbGRyZW4uZXEoKGdldFBhZ2VyUXR5KCkgLSAxKSAqIGdldE1vdmVCeSgpKS5wb3NpdGlvbigpOwogICAgICAgIC8vIGxhc3Qgc2xpZGUKICAgICAgICB9IGVsc2UgaWYgKHNsaWRlci5hY3RpdmUuaW5kZXggPT09IHNsaWRlci5jaGlsZHJlbi5sZW5ndGggLSAxKSB7CiAgICAgICAgICBwb3NpdGlvbiA9IHNsaWRlci5jaGlsZHJlbi5lcShzbGlkZXIuY2hpbGRyZW4ubGVuZ3RoIC0gMSkucG9zaXRpb24oKTsKICAgICAgICB9CiAgICAgICAgaWYgKHBvc2l0aW9uKSB7CiAgICAgICAgICBpZiAoc2xpZGVyLnNldHRpbmdzLm1vZGUgPT09ICdob3Jpem9udGFsJykgeyBzZXRQb3NpdGlvblByb3BlcnR5KC1wb3NpdGlvbi5sZWZ0LCAncmVzZXQnLCAwKTsgfQogICAgICAgICAgZWxzZSBpZiAoc2xpZGVyLnNldHRpbmdzLm1vZGUgPT09ICd2ZXJ0aWNhbCcpIHsgc2V0UG9zaXRpb25Qcm9wZXJ0eSgtcG9zaXRpb24udG9wLCAncmVzZXQnLCAwKTsgfQogICAgICAgIH0KICAgICAgfQogICAgICAvLyBkZWNsYXJlIHRoYXQgdGhlIHRyYW5zaXRpb24gaXMgY29tcGxldGUKICAgICAgc2xpZGVyLndvcmtpbmcgPSBmYWxzZTsKICAgICAgLy8gb25TbGlkZUFmdGVyIGNhbGxiYWNrCiAgICAgIHNsaWRlci5zZXR0aW5ncy5vblNsaWRlQWZ0ZXIuY2FsbChlbCwgc2xpZGVyLmNoaWxkcmVuLmVxKHNsaWRlci5hY3RpdmUuaW5kZXgpLCBzbGlkZXIub2xkSW5kZXgsIHNsaWRlci5hY3RpdmUuaW5kZXgpOwogICAgfTsKCiAgICAvKioKICAgICAqIFVwZGF0ZXMgdGhlIGF1dG8gY29udHJvbHMgc3RhdGUgKGVpdGhlciBhY3RpdmUsIG9yIGNvbWJpbmVkIHN3aXRjaCkKICAgICAqCiAgICAgKiBAcGFyYW0gc3RhdGUgKHN0cmluZykgInN0YXJ0IiwgInN0b3AiCiAgICAgKiAgLSB0aGUgbmV3IHN0YXRlIG9mIHRoZSBhdXRvIHNob3cKICAgICAqLwogICAgdmFyIHVwZGF0ZUF1dG9Db250cm9scyA9IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgIC8vIGlmIGF1dG9Db250cm9sc0NvbWJpbmUgaXMgdHJ1ZSwgcmVwbGFjZSB0aGUgY3VycmVudCBjb250cm9sIHdpdGggdGhlIG5ldyBzdGF0ZQogICAgICBpZiAoc2xpZGVyLnNldHRpbmdzLmF1dG9Db250cm9sc0NvbWJpbmUpIHsKICAgICAgICBzbGlkZXIuY29udHJvbHMuYXV0b0VsLmh0bWwoc2xpZGVyLmNvbnRyb2xzW3N0YXRlXSk7CiAgICAgIC8vIGlmIGF1dG9Db250cm9sc0NvbWJpbmUgaXMgZmFsc2UsIGFwcGx5IHRoZSAiYWN0aXZlIiBjbGFzcyB0byB0aGUgYXBwcm9wcmlhdGUgY29udHJvbAogICAgICB9IGVsc2UgewogICAgICAgIHNsaWRlci5jb250cm9scy5hdXRvRWwuZmluZCgnYScpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsKICAgICAgICBzbGlkZXIuY29udHJvbHMuYXV0b0VsLmZpbmQoJ2E6bm90KC5ieC0nICsgc3RhdGUgKyAnKScpLmFkZENsYXNzKCdhY3RpdmUnKTsKICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIFVwZGF0ZXMgdGhlIGRpcmVjdGlvbiBjb250cm9scyAoY2hlY2tzIGlmIGVpdGhlciBzaG91bGQgYmUgaGlkZGVuKQogICAgICovCiAgICB2YXIgdXBkYXRlRGlyZWN0aW9uQ29udHJvbHMgPSBmdW5jdGlvbigpIHsKICAgICAgaWYgKGdldFBhZ2VyUXR5KCkgPT09IDEpIHsKICAgICAgICBzbGlkZXIuY29udHJvbHMucHJldi5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICBzbGlkZXIuY29udHJvbHMubmV4dC5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgfSBlbHNlIGlmICghc2xpZGVyLnNldHRpbmdzLmluZmluaXRlTG9vcCAmJiBzbGlkZXIuc2V0dGluZ3MuaGlkZUNvbnRyb2xPbkVuZCkgewogICAgICAgIC8vIGlmIGZpcnN0IHNsaWRlCiAgICAgICAgaWYgKHNsaWRlci5hY3RpdmUuaW5kZXggPT09IDApIHsKICAgICAgICAgIHNsaWRlci5jb250cm9scy5wcmV2LmFkZENsYXNzKCdkaXNhYmxlZCcpOwogICAgICAgICAgc2xpZGVyLmNvbnRyb2xzLm5leHQucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgICAgICAgLy8gaWYgbGFzdCBzbGlkZQogICAgICAgIH0gZWxzZSBpZiAoc2xpZGVyLmFjdGl2ZS5pbmRleCA9PT0gZ2V0UGFnZXJRdHkoKSAtIDEpIHsKICAgICAgICAgIHNsaWRlci5jb250cm9scy5uZXh0LmFkZENsYXNzKCdkaXNhYmxlZCcpOwogICAgICAgICAgc2xpZGVyLmNvbnRyb2xzLnByZXYucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgICAgICAgLy8gaWYgYW55IHNsaWRlIGluIHRoZSBtaWRkbGUKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc2xpZGVyLmNvbnRyb2xzLnByZXYucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgICAgICAgICBzbGlkZXIuY29udHJvbHMubmV4dC5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CgkvKiBhdXRvIHN0YXJ0IGFuZCBzdG9wIGZ1bmN0aW9ucyAqLwoJdmFyIHdpbmRvd0ZvY3VzSGFuZGxlciA9IGZ1bmN0aW9uKCkgeyBlbC5zdGFydEF1dG8oKTsgfTsKCXZhciB3aW5kb3dCbHVySGFuZGxlciA9IGZ1bmN0aW9uKCkgeyBlbC5zdG9wQXV0bygpOyB9OwogICAgLyoqCiAgICAgKiBJbml0aWFsaXplcyB0aGUgYXV0byBwcm9jZXNzCiAgICAgKi8KICAgIHZhciBpbml0QXV0byA9IGZ1bmN0aW9uKCkgewogICAgICAvLyBpZiBhdXRvRGVsYXkgd2FzIHN1cHBsaWVkLCBsYXVuY2ggdGhlIGF1dG8gc2hvdyB1c2luZyBhIHNldFRpbWVvdXQoKSBjYWxsCiAgICAgIGlmIChzbGlkZXIuc2V0dGluZ3MuYXV0b0RlbGF5ID4gMCkgewogICAgICAgIHNldFRpbWVvdXQoZWwuc3RhcnRBdXRvLCBzbGlkZXIuc2V0dGluZ3MuYXV0b0RlbGF5KTsKICAgICAgLy8gaWYgYXV0b0RlbGF5IHdhcyBub3Qgc3VwcGxpZWQsIHN0YXJ0IHRoZSBhdXRvIHNob3cgbm9ybWFsbHkKICAgICAgfSBlbHNlIHsKICAgICAgICBlbC5zdGFydEF1dG8oKTsKCiAgICAgICAgLy9hZGQgZm9jdXMgYW5kIGJsdXIgZXZlbnRzIHRvIGVuc3VyZSBpdHMgcnVubmluZyBpZiB0aW1lb3V0IGdldHMgcGF1c2VkCiAgICAgICAgJCh3aW5kb3cpLmZvY3VzKHdpbmRvd0ZvY3VzSGFuZGxlcikuYmx1cih3aW5kb3dCbHVySGFuZGxlcik7CiAgICAgIH0KICAgICAgLy8gaWYgYXV0b0hvdmVyIGlzIHJlcXVlc3RlZAogICAgICBpZiAoc2xpZGVyLnNldHRpbmdzLmF1dG9Ib3ZlcikgewogICAgICAgIC8vIG9uIGVsIGhvdmVyCiAgICAgICAgZWwuaG92ZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgICAvLyBpZiB0aGUgYXV0byBzaG93IGlzIGN1cnJlbnRseSBwbGF5aW5nIChoYXMgYW4gYWN0aXZlIGludGVydmFsKQogICAgICAgICAgaWYgKHNsaWRlci5pbnRlcnZhbCkgewogICAgICAgICAgICAvLyBzdG9wIHRoZSBhdXRvIHNob3cgYW5kIHBhc3MgdHJ1ZSBhcmd1bWVudCB3aGljaCB3aWxsIHByZXZlbnQgY29udHJvbCB1cGRhdGUKICAgICAgICAgICAgZWwuc3RvcEF1dG8odHJ1ZSk7CiAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBhdXRvUGF1c2VkIHZhbHVlIHdoaWNoIHdpbGwgYmUgdXNlZCBieSB0aGUgcmVsYXRpdmUgIm1vdXNlb3V0IiBldmVudAogICAgICAgICAgICBzbGlkZXIuYXV0b1BhdXNlZCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAvLyBpZiB0aGUgYXV0b1BhdXNlZCB2YWx1ZSB3YXMgY3JlYXRlZCBiZSB0aGUgcHJpb3IgIm1vdXNlb3ZlciIgZXZlbnQKICAgICAgICAgIGlmIChzbGlkZXIuYXV0b1BhdXNlZCkgewogICAgICAgICAgICAvLyBzdGFydCB0aGUgYXV0byBzaG93IGFuZCBwYXNzIHRydWUgYXJndW1lbnQgd2hpY2ggd2lsbCBwcmV2ZW50IGNvbnRyb2wgdXBkYXRlCiAgICAgICAgICAgIGVsLnN0YXJ0QXV0byh0cnVlKTsKICAgICAgICAgICAgLy8gcmVzZXQgdGhlIGF1dG9QYXVzZWQgdmFsdWUKICAgICAgICAgICAgc2xpZGVyLmF1dG9QYXVzZWQgPSBudWxsOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogSW5pdGlhbGl6ZXMgdGhlIHRpY2tlciBwcm9jZXNzCiAgICAgKi8KICAgIHZhciBpbml0VGlja2VyID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBzdGFydFBvc2l0aW9uID0gMCwKICAgICAgcG9zaXRpb24sIHRyYW5zZm9ybSwgdmFsdWUsIGlkeCwgcmF0aW8sIHByb3BlcnR5LCBuZXdTcGVlZCwgdG90YWxEaW1lbnM7CiAgICAgIC8vIGlmIGF1dG9EaXJlY3Rpb24gaXMgIm5leHQiLCBhcHBlbmQgYSBjbG9uZSBvZiB0aGUgZW50aXJlIHNsaWRlcgogICAgICBpZiAoc2xpZGVyLnNldHRpbmdzLmF1dG9EaXJlY3Rpb24gPT09ICduZXh0JykgewogICAgICAgIGVsLmFwcGVuZChzbGlkZXIuY2hpbGRyZW4uY2xvbmUoKS5hZGRDbGFzcygnYngtY2xvbmUnKSk7CiAgICAgIC8vIGlmIGF1dG9EaXJlY3Rpb24gaXMgInByZXYiLCBwcmVwZW5kIGEgY2xvbmUgb2YgdGhlIGVudGlyZSBzbGlkZXIsIGFuZCBzZXQgdGhlIGxlZnQgcG9zaXRpb24KICAgICAgfSBlbHNlIHsKICAgICAgICBlbC5wcmVwZW5kKHNsaWRlci5jaGlsZHJlbi5jbG9uZSgpLmFkZENsYXNzKCdieC1jbG9uZScpKTsKICAgICAgICBwb3NpdGlvbiA9IHNsaWRlci5jaGlsZHJlbi5maXJzdCgpLnBvc2l0aW9uKCk7CiAgICAgICAgc3RhcnRQb3NpdGlvbiA9IHNsaWRlci5zZXR0aW5ncy5tb2RlID09PSAnaG9yaXpvbnRhbCcgPyAtcG9zaXRpb24ubGVmdCA6IC1wb3NpdGlvbi50b3A7CiAgICAgIH0KICAgICAgc2V0UG9zaXRpb25Qcm9wZXJ0eShzdGFydFBvc2l0aW9uLCAncmVzZXQnLCAwKTsKICAgICAgLy8gZG8gbm90IGFsbG93IGNvbnRyb2xzIGluIHRpY2tlciBtb2RlCiAgICAgIHNsaWRlci5zZXR0aW5ncy5wYWdlciA9IGZhbHNlOwogICAgICBzbGlkZXIuc2V0dGluZ3MuY29udHJvbHMgPSBmYWxzZTsKICAgICAgc2xpZGVyLnNldHRpbmdzLmF1dG9Db250cm9scyA9IGZhbHNlOwogICAgICAvLyBpZiBhdXRvSG92ZXIgaXMgcmVxdWVzdGVkCiAgICAgIGlmIChzbGlkZXIuc2V0dGluZ3MudGlja2VySG92ZXIpIHsKICAgICAgICBpZiAoc2xpZGVyLnVzaW5nQ1NTKSB7CiAgICAgICAgICBpZHggPSBzbGlkZXIuc2V0dGluZ3MubW9kZSA9PT0gJ2hvcml6b250YWwnID8gNCA6IDU7CiAgICAgICAgICBzbGlkZXIudmlld3BvcnQuaG92ZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRyYW5zZm9ybSA9IGVsLmNzcygnLScgKyBzbGlkZXIuY3NzUHJlZml4ICsgJy10cmFuc2Zvcm0nKTsKICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHRyYW5zZm9ybS5zcGxpdCgnLCcpW2lkeF0pOwogICAgICAgICAgICBzZXRQb3NpdGlvblByb3BlcnR5KHZhbHVlLCAncmVzZXQnLCAwKTsKICAgICAgICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0b3RhbERpbWVucyA9IDA7CiAgICAgICAgICAgIHNsaWRlci5jaGlsZHJlbi5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgICAgdG90YWxEaW1lbnMgKz0gc2xpZGVyLnNldHRpbmdzLm1vZGUgPT09ICdob3Jpem9udGFsJyA/ICQodGhpcykub3V0ZXJXaWR0aCh0cnVlKSA6ICQodGhpcykub3V0ZXJIZWlnaHQodHJ1ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIHNwZWVkIHJhdGlvICh1c2VkIHRvIGRldGVybWluZSB0aGUgbmV3IHNwZWVkIHRvIGZpbmlzaCB0aGUgcGF1c2VkIGFuaW1hdGlvbikKICAgICAgICAgICAgcmF0aW8gPSBzbGlkZXIuc2V0dGluZ3Muc3BlZWQgLyB0b3RhbERpbWVuczsKICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHdoaWNoIHByb3BlcnR5IHRvIHVzZQogICAgICAgICAgICBwcm9wZXJ0eSA9IHNsaWRlci5zZXR0aW5ncy5tb2RlID09PSAnaG9yaXpvbnRhbCcgPyAnbGVmdCcgOiAndG9wJzsKICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBuZXcgc3BlZWQKICAgICAgICAgICAgbmV3U3BlZWQgPSByYXRpbyAqICh0b3RhbERpbWVucyAtIChNYXRoLmFicyhwYXJzZUludCh2YWx1ZSkpKSk7CiAgICAgICAgICAgIHRpY2tlckxvb3AobmV3U3BlZWQpOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIG9uIGVsIGhvdmVyCiAgICAgICAgICBzbGlkZXIudmlld3BvcnQuaG92ZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGVsLnN0b3AoKTsKICAgICAgICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIHRvdGFsIHdpZHRoIG9mIGNoaWxkcmVuICh1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgc3BlZWQgcmF0aW8pCiAgICAgICAgICAgIHRvdGFsRGltZW5zID0gMDsKICAgICAgICAgICAgc2xpZGVyLmNoaWxkcmVuLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICAgICAgICB0b3RhbERpbWVucyArPSBzbGlkZXIuc2V0dGluZ3MubW9kZSA9PT0gJ2hvcml6b250YWwnID8gJCh0aGlzKS5vdXRlcldpZHRoKHRydWUpIDogJCh0aGlzKS5vdXRlckhlaWdodCh0cnVlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgc3BlZWQgcmF0aW8gKHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBuZXcgc3BlZWQgdG8gZmluaXNoIHRoZSBwYXVzZWQgYW5pbWF0aW9uKQogICAgICAgICAgICByYXRpbyA9IHNsaWRlci5zZXR0aW5ncy5zcGVlZCAvIHRvdGFsRGltZW5zOwogICAgICAgICAgICAvLyBkZXRlcm1pbmUgd2hpY2ggcHJvcGVydHkgdG8gdXNlCiAgICAgICAgICAgIHByb3BlcnR5ID0gc2xpZGVyLnNldHRpbmdzLm1vZGUgPT09ICdob3Jpem9udGFsJyA/ICdsZWZ0JyA6ICd0b3AnOwogICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIG5ldyBzcGVlZAogICAgICAgICAgICBuZXdTcGVlZCA9IHJhdGlvICogKHRvdGFsRGltZW5zIC0gKE1hdGguYWJzKHBhcnNlSW50KGVsLmNzcyhwcm9wZXJ0eSkpKSkpOwogICAgICAgICAgICB0aWNrZXJMb29wKG5ld1NwZWVkKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBzdGFydCB0aGUgdGlja2VyIGxvb3AKICAgICAgdGlja2VyTG9vcCgpOwogICAgfTsKCiAgICAvKioKICAgICAqIFJ1bnMgYSBjb250aW51b3VzIGxvb3AsIG5ld3MgdGlja2VyLXN0eWxlCiAgICAgKi8KICAgIHZhciB0aWNrZXJMb29wID0gZnVuY3Rpb24ocmVzdW1lU3BlZWQpIHsKICAgICAgdmFyIHNwZWVkID0gcmVzdW1lU3BlZWQgPyByZXN1bWVTcGVlZCA6IHNsaWRlci5zZXR0aW5ncy5zcGVlZCwKICAgICAgcG9zaXRpb24gPSB7bGVmdDogMCwgdG9wOiAwfSwKICAgICAgcmVzZXQgPSB7bGVmdDogMCwgdG9wOiAwfSwKICAgICAgYW5pbWF0ZVByb3BlcnR5LCByZXNldFZhbHVlLCBwYXJhbXM7CgogICAgICAvLyBpZiAibmV4dCIgYW5pbWF0ZSBsZWZ0IHBvc2l0aW9uIHRvIGxhc3QgY2hpbGQsIHRoZW4gcmVzZXQgbGVmdCB0byAwCiAgICAgIGlmIChzbGlkZXIuc2V0dGluZ3MuYXV0b0RpcmVjdGlvbiA9PT0gJ25leHQnKSB7CiAgICAgICAgcG9zaXRpb24gPSBlbC5maW5kKCcuYngtY2xvbmUnKS5maXJzdCgpLnBvc2l0aW9uKCk7CiAgICAgIC8vIGlmICJwcmV2IiBhbmltYXRlIGxlZnQgcG9zaXRpb24gdG8gMCwgdGhlbiByZXNldCBsZWZ0IHRvIGZpcnN0IG5vbi1jbG9uZSBjaGlsZAogICAgICB9IGVsc2UgewogICAgICAgIHJlc2V0ID0gc2xpZGVyLmNoaWxkcmVuLmZpcnN0KCkucG9zaXRpb24oKTsKICAgICAgfQogICAgICBhbmltYXRlUHJvcGVydHkgPSBzbGlkZXIuc2V0dGluZ3MubW9kZSA9PT0gJ2hvcml6b250YWwnID8gLXBvc2l0aW9uLmxlZnQgOiAtcG9zaXRpb24udG9wOwogICAgICByZXNldFZhbHVlID0gc2xpZGVyLnNldHRpbmdzLm1vZGUgPT09ICdob3Jpem9udGFsJyA/IC1yZXNldC5sZWZ0IDogLXJlc2V0LnRvcDsKICAgICAgcGFyYW1zID0ge3Jlc2V0VmFsdWU6IHJlc2V0VmFsdWV9OwogICAgICBzZXRQb3NpdGlvblByb3BlcnR5KGFuaW1hdGVQcm9wZXJ0eSwgJ3RpY2tlcicsIHNwZWVkLCBwYXJhbXMpOwogICAgfTsKCiAgICAvKioKICAgICAqIENoZWNrIGlmIGVsIGlzIG9uIHNjcmVlbgogICAgICovCiAgICB2YXIgaXNPblNjcmVlbiA9IGZ1bmN0aW9uKGVsKSB7CiAgICAgIHZhciB3aW4gPSAkKHdpbmRvdyksCiAgICAgIHZpZXdwb3J0ID0gewogICAgICAgIHRvcDogd2luLnNjcm9sbFRvcCgpLAogICAgICAgIGxlZnQ6IHdpbi5zY3JvbGxMZWZ0KCkKICAgICAgfSwKICAgICAgYm91bmRzID0gZWwub2Zmc2V0KCk7CgogICAgICB2aWV3cG9ydC5yaWdodCA9IHZpZXdwb3J0LmxlZnQgKyB3aW4ud2lkdGgoKTsKICAgICAgdmlld3BvcnQuYm90dG9tID0gdmlld3BvcnQudG9wICsgd2luLmhlaWdodCgpOwogICAgICBib3VuZHMucmlnaHQgPSBib3VuZHMubGVmdCArIGVsLm91dGVyV2lkdGgoKTsKICAgICAgYm91bmRzLmJvdHRvbSA9IGJvdW5kcy50b3AgKyBlbC5vdXRlckhlaWdodCgpOwoKICAgICAgcmV0dXJuICghKHZpZXdwb3J0LnJpZ2h0IDwgYm91bmRzLmxlZnQgfHwgdmlld3BvcnQubGVmdCA+IGJvdW5kcy5yaWdodCB8fCB2aWV3cG9ydC5ib3R0b20gPCBib3VuZHMudG9wIHx8IHZpZXdwb3J0LnRvcCA+IGJvdW5kcy5ib3R0b20pKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBJbml0aWFsaXplcyBrZXlib2FyZCBldmVudHMKICAgICAqLwogICAgdmFyIGtleVByZXNzID0gZnVuY3Rpb24oZSkgewogICAgICB2YXIgYWN0aXZlRWxlbWVudFRhZyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpLAogICAgICB0YWdGaWx0ZXJzID0gJ2lucHV0fHRleHRhcmVhJywKICAgICAgcCA9IG5ldyBSZWdFeHAoYWN0aXZlRWxlbWVudFRhZyxbJ2knXSksCiAgICAgIHJlc3VsdCA9IHAuZXhlYyh0YWdGaWx0ZXJzKTsKCiAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCAmJiBpc09uU2NyZWVuKGVsKSkgewogICAgICAgIGlmIChlLmtleUNvZGUgPT09IDM5KSB7CiAgICAgICAgICBjbGlja05leHRCaW5kKGUpOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0gZWxzZSBpZiAoZS5rZXlDb2RlID09PSAzNykgewogICAgICAgICAgY2xpY2tQcmV2QmluZChlKTsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBJbml0aWFsaXplcyB0b3VjaCBldmVudHMKICAgICAqLwogICAgdmFyIGluaXRUb3VjaCA9IGZ1bmN0aW9uKCkgewogICAgICAvLyBpbml0aWFsaXplIG9iamVjdCB0byBjb250YWluIGFsbCB0b3VjaCB2YWx1ZXMKICAgICAgc2xpZGVyLnRvdWNoID0gewogICAgICAgIHN0YXJ0OiB7eDogMCwgeTogMH0sCiAgICAgICAgZW5kOiB7eDogMCwgeTogMH0KICAgICAgfTsKICAgICAgc2xpZGVyLnZpZXdwb3J0Lm9uKCd0b3VjaHN0YXJ0IE1TUG9pbnRlckRvd24gcG9pbnRlcmRvd24nLCBvblRvdWNoU3RhcnQpOwoKICAgICAgLy9mb3IgYnJvd3NlcnMgdGhhdCBoYXZlIGltcGxlbWVudGVkIHBvaW50ZXIgZXZlbnRzIGFuZCBmaXJlIGEgY2xpY2sgYWZ0ZXIKICAgICAgLy9ldmVyeSBwb2ludGVydXAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHBvaW50ZXJ1cCBpcyBvbiBzYW1lIHNjcmVlbiBsb2NhdGlvbiBhcyBwb2ludGVyZG93biBvciBub3QKICAgICAgc2xpZGVyLnZpZXdwb3J0Lm9uKCdjbGljaycsICcuYnhzbGlkZXIgYScsIGZ1bmN0aW9uKGUpIHsKICAgICAgICBpZiAoc2xpZGVyLnZpZXdwb3J0Lmhhc0NsYXNzKCdjbGljay1kaXNhYmxlZCcpKSB7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICBzbGlkZXIudmlld3BvcnQucmVtb3ZlQ2xhc3MoJ2NsaWNrLWRpc2FibGVkJyk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciAidG91Y2hzdGFydCIKICAgICAqCiAgICAgKiBAcGFyYW0gZSAoZXZlbnQpCiAgICAgKiAgLSBET00gZXZlbnQgb2JqZWN0CiAgICAgKi8KICAgIHZhciBvblRvdWNoU3RhcnQgPSBmdW5jdGlvbihlKSB7CiAgICAgIC8vIHdhdGNoIG9ubHkgZm9yIGxlZnQgbW91c2UsIHRvdWNoIGNvbnRhY3QgYW5kIHBlbiBjb250YWN0CiAgICAgIC8vIHRvdWNoc3RhcnQgZXZlbnQgb2JqZWN0IGRvZXNuYHQgaGF2ZSBidXR0b24gcHJvcGVydHkKICAgICAgaWYgKGUudHlwZSAhPT0gJ3RvdWNoc3RhcnQnICYmIGUuYnV0dG9uICE9PSAwKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgLy9kaXNhYmxlIHNsaWRlciBjb250cm9scyB3aGlsZSB1c2VyIGlzIGludGVyYWN0aW5nIHdpdGggc2xpZGVzIHRvIGF2b2lkIHNsaWRlciBmcmVlemUgdGhhdCBoYXBwZW5zIG9uIHRvdWNoIGRldmljZXMgd2hlbiBhIHNsaWRlIHN3aXBlIGhhcHBlbnMgaW1tZWRpYXRlbHkgYWZ0ZXIgaW50ZXJhY3Rpbmcgd2l0aCBzbGlkZXIgY29udHJvbHMKICAgICAgc2xpZGVyLmNvbnRyb2xzLmVsLmFkZENsYXNzKCdkaXNhYmxlZCcpOwoKICAgICAgaWYgKHNsaWRlci53b3JraW5nKSB7CiAgICAgICAgc2xpZGVyLmNvbnRyb2xzLmVsLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIHJlY29yZCB0aGUgb3JpZ2luYWwgcG9zaXRpb24gd2hlbiB0b3VjaCBzdGFydHMKICAgICAgICBzbGlkZXIudG91Y2gub3JpZ2luYWxQb3MgPSBlbC5wb3NpdGlvbigpOwogICAgICAgIHZhciBvcmlnID0gZS5vcmlnaW5hbEV2ZW50LAogICAgICAgIHRvdWNoUG9pbnRzID0gKHR5cGVvZiBvcmlnLmNoYW5nZWRUb3VjaGVzICE9PSAndW5kZWZpbmVkJykgPyBvcmlnLmNoYW5nZWRUb3VjaGVzIDogW29yaWddOwoJCXZhciBjaHJvbWVQb2ludGVyRXZlbnRzID0gdHlwZW9mIFBvaW50ZXJFdmVudCA9PT0gJ2Z1bmN0aW9uJzsgCgkJaWYgKGNocm9tZVBvaW50ZXJFdmVudHMpIHsgCgkJCWlmIChvcmlnLnBvaW50ZXJJZCA9PT0gdW5kZWZpbmVkKSB7IAoJCQkJcmV0dXJuOwoJCQl9IAoJCX0KICAgICAgICAvLyByZWNvcmQgdGhlIHN0YXJ0aW5nIHRvdWNoIHgsIHkgY29vcmRpbmF0ZXMKICAgICAgICBzbGlkZXIudG91Y2guc3RhcnQueCA9IHRvdWNoUG9pbnRzWzBdLnBhZ2VYOwogICAgICAgIHNsaWRlci50b3VjaC5zdGFydC55ID0gdG91Y2hQb2ludHNbMF0ucGFnZVk7CgogICAgICAgIGlmIChzbGlkZXIudmlld3BvcnQuZ2V0KDApLnNldFBvaW50ZXJDYXB0dXJlKSB7CiAgICAgICAgICBzbGlkZXIucG9pbnRlcklkID0gb3JpZy5wb2ludGVySWQ7CiAgICAgICAgICBzbGlkZXIudmlld3BvcnQuZ2V0KDApLnNldFBvaW50ZXJDYXB0dXJlKHNsaWRlci5wb2ludGVySWQpOwogICAgICAgIH0KICAgICAgICAvLyBzdG9yZSBvcmlnaW5hbCBldmVudCBkYXRhIGZvciBjbGljayBmaXhhdGlvbgogICAgICAgIHNsaWRlci5vcmlnaW5hbENsaWNrVGFyZ2V0ID0gb3JpZy5vcmlnaW5hbFRhcmdldCB8fCBvcmlnLnRhcmdldDsKICAgICAgICBzbGlkZXIub3JpZ2luYWxDbGlja0J1dHRvbiA9IG9yaWcuYnV0dG9uOwogICAgICAgIHNsaWRlci5vcmlnaW5hbENsaWNrQnV0dG9ucyA9IG9yaWcuYnV0dG9uczsKICAgICAgICBzbGlkZXIub3JpZ2luYWxFdmVudFR5cGUgPSBvcmlnLnR5cGU7CiAgICAgICAgLy8gYXQgdGhpcyBtb21lbnQgd2UgZG9uYHQga25vdyB3aGF0IGl0IGlzIGNsaWNrIG9yIHN3aXBlCiAgICAgICAgc2xpZGVyLmhhc01vdmUgPSBmYWxzZTsKICAgICAgICAvLyBvbiBhICJ0b3VjaG1vdmUiIGV2ZW50IHRvIHRoZSB2aWV3cG9ydAogICAgICAgIHNsaWRlci52aWV3cG9ydC5vbigndG91Y2htb3ZlIE1TUG9pbnRlck1vdmUgcG9pbnRlcm1vdmUnLCBvblRvdWNoTW92ZSk7CiAgICAgICAgLy8gb24gYSAidG91Y2hlbmQiIGV2ZW50IHRvIHRoZSB2aWV3cG9ydAogICAgICAgIHNsaWRlci52aWV3cG9ydC5vbigndG91Y2hlbmQgTVNQb2ludGVyVXAgcG9pbnRlcnVwJywgb25Ub3VjaEVuZCk7CiAgICAgICAgc2xpZGVyLnZpZXdwb3J0Lm9uKCdNU1BvaW50ZXJDYW5jZWwgcG9pbnRlcmNhbmNlbCcsIG9uUG9pbnRlckNhbmNlbCk7CiAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBDYW5jZWwgUG9pbnRlciBmb3IgV2luZG93cyBQaG9uZQogICAgICoKICAgICAqIEBwYXJhbSBlIChldmVudCkKICAgICAqICAtIERPTSBldmVudCBvYmplY3QKICAgICAqLwogICAgdmFyIG9uUG9pbnRlckNhbmNlbCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAvKiBvblBvaW50ZXJDYW5jZWwgaGFuZGxlciBpcyBuZWVkZWQgdG8gZGVhbCB3aXRoIHNpdHVhdGlvbnMgd2hlbiBhIHRvdWNoZW5kCiAgICAgIGRvZXNuJ3QgZmlyZSBhZnRlciBhIHRvdWNoc3RhcnQgKHRoaXMgaGFwcGVucyBvbiB3aW5kb3dzIHBob25lcyBvbmx5KSAqLwogICAgICBzZXRQb3NpdGlvblByb3BlcnR5KHNsaWRlci50b3VjaC5vcmlnaW5hbFBvcy5sZWZ0LCAncmVzZXQnLCAwKTsKCiAgICAgIC8vcmVtb3ZlIGhhbmRsZXJzCiAgICAgIHNsaWRlci5jb250cm9scy5lbC5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgc2xpZGVyLnZpZXdwb3J0Lm9mZignTVNQb2ludGVyQ2FuY2VsIHBvaW50ZXJjYW5jZWwnLCBvblBvaW50ZXJDYW5jZWwpOwogICAgICBzbGlkZXIudmlld3BvcnQub2ZmKCd0b3VjaG1vdmUgTVNQb2ludGVyTW92ZSBwb2ludGVybW92ZScsIG9uVG91Y2hNb3ZlKTsKICAgICAgc2xpZGVyLnZpZXdwb3J0Lm9mZigndG91Y2hlbmQgTVNQb2ludGVyVXAgcG9pbnRlcnVwJywgb25Ub3VjaEVuZCk7CiAgICAgIGlmIChzbGlkZXIudmlld3BvcnQuZ2V0KDApLnJlbGVhc2VQb2ludGVyQ2FwdHVyZSkgewogICAgICAgIHNsaWRlci52aWV3cG9ydC5nZXQoMCkucmVsZWFzZVBvaW50ZXJDYXB0dXJlKHNsaWRlci5wb2ludGVySWQpOwogICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogRXZlbnQgaGFuZGxlciBmb3IgInRvdWNobW92ZSIKICAgICAqCiAgICAgKiBAcGFyYW0gZSAoZXZlbnQpCiAgICAgKiAgLSBET00gZXZlbnQgb2JqZWN0CiAgICAgKi8KICAgIHZhciBvblRvdWNoTW92ZSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgdmFyIG9yaWcgPSBlLm9yaWdpbmFsRXZlbnQsCiAgICAgIHRvdWNoUG9pbnRzID0gKHR5cGVvZiBvcmlnLmNoYW5nZWRUb3VjaGVzICE9PSAndW5kZWZpbmVkJykgPyBvcmlnLmNoYW5nZWRUb3VjaGVzIDogW29yaWddLAogICAgICAvLyBpZiBzY3JvbGxpbmcgb24geSBheGlzLCBkbyBub3QgcHJldmVudCBkZWZhdWx0CiAgICAgIHhNb3ZlbWVudCA9IE1hdGguYWJzKHRvdWNoUG9pbnRzWzBdLnBhZ2VYIC0gc2xpZGVyLnRvdWNoLnN0YXJ0LngpLAogICAgICB5TW92ZW1lbnQgPSBNYXRoLmFicyh0b3VjaFBvaW50c1swXS5wYWdlWSAtIHNsaWRlci50b3VjaC5zdGFydC55KSwKICAgICAgdmFsdWUgPSAwLAogICAgICBjaGFuZ2UgPSAwOwogICAgICAvLyB0aGlzIGlzIHN3aXBlCiAgICAgIHNsaWRlci5oYXNNb3ZlID0gdHJ1ZTsKCiAgICAgIC8vIHggYXhpcyBzd2lwZQogICAgICBpZiAoKHhNb3ZlbWVudCAqIDMpID4geU1vdmVtZW50ICYmIHNsaWRlci5zZXR0aW5ncy5wcmV2ZW50RGVmYXVsdFN3aXBlWCkgewogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgLy8geSBheGlzIHN3aXBlCiAgICAgIH0gZWxzZSBpZiAoKHlNb3ZlbWVudCAqIDMpID4geE1vdmVtZW50ICYmIHNsaWRlci5zZXR0aW5ncy5wcmV2ZW50RGVmYXVsdFN3aXBlWSkgewogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgfQogICAgICBpZiAoZS50eXBlICE9PSAndG91Y2htb3ZlJykgewogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgfQoKICAgICAgaWYgKHNsaWRlci5zZXR0aW5ncy5tb2RlICE9PSAnZmFkZScgJiYgc2xpZGVyLnNldHRpbmdzLm9uZVRvT25lVG91Y2gpIHsKICAgICAgICAvLyBpZiBob3Jpem9udGFsLCBkcmFnIGFsb25nIHggYXhpcwogICAgICAgIGlmIChzbGlkZXIuc2V0dGluZ3MubW9kZSA9PT0gJ2hvcml6b250YWwnKSB7CiAgICAgICAgICBjaGFuZ2UgPSB0b3VjaFBvaW50c1swXS5wYWdlWCAtIHNsaWRlci50b3VjaC5zdGFydC54OwogICAgICAgICAgdmFsdWUgPSBzbGlkZXIudG91Y2gub3JpZ2luYWxQb3MubGVmdCArIGNoYW5nZTsKICAgICAgICAvLyBpZiB2ZXJ0aWNhbCwgZHJhZyBhbG9uZyB5IGF4aXMKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY2hhbmdlID0gdG91Y2hQb2ludHNbMF0ucGFnZVkgLSBzbGlkZXIudG91Y2guc3RhcnQueTsKICAgICAgICAgIHZhbHVlID0gc2xpZGVyLnRvdWNoLm9yaWdpbmFsUG9zLnRvcCArIGNoYW5nZTsKICAgICAgICB9CiAgICAgICAgc2V0UG9zaXRpb25Qcm9wZXJ0eSh2YWx1ZSwgJ3Jlc2V0JywgMCk7CiAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBFdmVudCBoYW5kbGVyIGZvciAidG91Y2hlbmQiCiAgICAgKgogICAgICogQHBhcmFtIGUgKGV2ZW50KQogICAgICogIC0gRE9NIGV2ZW50IG9iamVjdAogICAgICovCiAgICB2YXIgb25Ub3VjaEVuZCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBzbGlkZXIudmlld3BvcnQub2ZmKCd0b3VjaG1vdmUgTVNQb2ludGVyTW92ZSBwb2ludGVybW92ZScsIG9uVG91Y2hNb3ZlKTsKICAgICAgLy9lbmFibGUgc2xpZGVyIGNvbnRyb2xzIGFzIHNvb24gYXMgdXNlciBzdG9wcyBpbnRlcmFjaW5nIHdpdGggc2xpZGVzCiAgICAgIHNsaWRlci5jb250cm9scy5lbC5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgdmFyIG9yaWcgICAgPSBlLm9yaWdpbmFsRXZlbnQsCiAgICAgIHRvdWNoUG9pbnRzID0gKHR5cGVvZiBvcmlnLmNoYW5nZWRUb3VjaGVzICE9PSAndW5kZWZpbmVkJykgPyBvcmlnLmNoYW5nZWRUb3VjaGVzIDogW29yaWddLAogICAgICB2YWx1ZSAgICAgICA9IDAsCiAgICAgIGRpc3RhbmNlICAgID0gMDsKICAgICAgLy8gcmVjb3JkIGVuZCB4LCB5IHBvc2l0aW9ucwogICAgICBzbGlkZXIudG91Y2guZW5kLnggPSB0b3VjaFBvaW50c1swXS5wYWdlWDsKICAgICAgc2xpZGVyLnRvdWNoLmVuZC55ID0gdG91Y2hQb2ludHNbMF0ucGFnZVk7CiAgICAgIC8vIGlmIGZhZGUgbW9kZSwgY2hlY2sgaWYgYWJzb2x1dGUgeCBkaXN0YW5jZSBjbGVhcnMgdGhlIHRocmVzaG9sZAogICAgICBpZiAoc2xpZGVyLnNldHRpbmdzLm1vZGUgPT09ICdmYWRlJykgewogICAgICAgIGRpc3RhbmNlID0gTWF0aC5hYnMoc2xpZGVyLnRvdWNoLnN0YXJ0LnggLSBzbGlkZXIudG91Y2guZW5kLngpOwogICAgICAgIGlmIChkaXN0YW5jZSA+PSBzbGlkZXIuc2V0dGluZ3Muc3dpcGVUaHJlc2hvbGQpIHsKICAgICAgICAgIGlmIChzbGlkZXIudG91Y2guc3RhcnQueCA+IHNsaWRlci50b3VjaC5lbmQueCkgewogICAgICAgICAgICBlbC5nb1RvTmV4dFNsaWRlKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBlbC5nb1RvUHJldlNsaWRlKCk7CiAgICAgICAgICB9CiAgICAgICAgICBlbC5zdG9wQXV0bygpOwogICAgICAgIH0KICAgICAgLy8gbm90IGZhZGUgbW9kZQogICAgICB9IGVsc2UgewogICAgICAgIC8vIGNhbGN1bGF0ZSBkaXN0YW5jZSBhbmQgZWwncyBhbmltYXRlIHByb3BlcnR5CiAgICAgICAgaWYgKHNsaWRlci5zZXR0aW5ncy5tb2RlID09PSAnaG9yaXpvbnRhbCcpIHsKICAgICAgICAgIGRpc3RhbmNlID0gc2xpZGVyLnRvdWNoLmVuZC54IC0gc2xpZGVyLnRvdWNoLnN0YXJ0Lng7CiAgICAgICAgICB2YWx1ZSA9IHNsaWRlci50b3VjaC5vcmlnaW5hbFBvcy5sZWZ0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkaXN0YW5jZSA9IHNsaWRlci50b3VjaC5lbmQueSAtIHNsaWRlci50b3VjaC5zdGFydC55OwogICAgICAgICAgdmFsdWUgPSBzbGlkZXIudG91Y2gub3JpZ2luYWxQb3MudG9wOwogICAgICAgIH0KICAgICAgICAvLyBpZiBub3QgaW5maW5pdGUgbG9vcCBhbmQgZmlyc3QgLyBsYXN0IHNsaWRlLCBkbyBub3QgYXR0ZW1wdCBhIHNsaWRlIHRyYW5zaXRpb24KICAgICAgICBpZiAoIXNsaWRlci5zZXR0aW5ncy5pbmZpbml0ZUxvb3AgJiYgKChzbGlkZXIuYWN0aXZlLmluZGV4ID09PSAwICYmIGRpc3RhbmNlID4gMCkgfHwgKHNsaWRlci5hY3RpdmUubGFzdCAmJiBkaXN0YW5jZSA8IDApKSkgewogICAgICAgICAgc2V0UG9zaXRpb25Qcm9wZXJ0eSh2YWx1ZSwgJ3Jlc2V0JywgMjAwKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gY2hlY2sgaWYgZGlzdGFuY2UgY2xlYXJzIHRocmVzaG9sZAogICAgICAgICAgaWYgKE1hdGguYWJzKGRpc3RhbmNlKSA+PSBzbGlkZXIuc2V0dGluZ3Muc3dpcGVUaHJlc2hvbGQpIHsKICAgICAgICAgICAgaWYgKGRpc3RhbmNlIDwgMCkgewogICAgICAgICAgICAgIGVsLmdvVG9OZXh0U2xpZGUoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBlbC5nb1RvUHJldlNsaWRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWwuc3RvcEF1dG8oKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIGVsLmFuaW1hdGUocHJvcGVydHksIDIwMCk7CiAgICAgICAgICAgIHNldFBvc2l0aW9uUHJvcGVydHkodmFsdWUsICdyZXNldCcsIDIwMCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHNsaWRlci52aWV3cG9ydC5vZmYoJ3RvdWNoZW5kIE1TUG9pbnRlclVwIHBvaW50ZXJ1cCcsIG9uVG91Y2hFbmQpOwoKICAgICAgaWYgKHNsaWRlci52aWV3cG9ydC5nZXQoMCkucmVsZWFzZVBvaW50ZXJDYXB0dXJlKSB7CiAgICAgICAgc2xpZGVyLnZpZXdwb3J0LmdldCgwKS5yZWxlYXNlUG9pbnRlckNhcHR1cmUoc2xpZGVyLnBvaW50ZXJJZCk7CiAgICAgIH0KICAgICAgLy8gaWYgc2xpZGVyIGhhZCBzd2lwZSB3aXRoIGxlZnQgbW91c2UsIHRvdWNoIGNvbnRhY3QgYW5kIHBlbiBjb250YWN0CiAgICAgIGlmIChzbGlkZXIuaGFzTW92ZSA9PT0gZmFsc2UgJiYgKHNsaWRlci5vcmlnaW5hbENsaWNrQnV0dG9uID09PSAwIHx8IHNsaWRlci5vcmlnaW5hbEV2ZW50VHlwZSA9PT0gJ3RvdWNoc3RhcnQnKSkgewogICAgICAgIC8vIHRyaWdnZXIgY2xpY2sgZXZlbnQgKGZpeCBmb3IgRmlyZWZveDU5IGFuZCBQb2ludGVyRXZlbnQgc3RhbmRhcmQgY29tcGF0aWJpbGl0eSkKICAgICAgICAkKHNsaWRlci5vcmlnaW5hbENsaWNrVGFyZ2V0KS50cmlnZ2VyKHsKICAgICAgICAgIHR5cGU6ICdjbGljaycsCiAgICAgICAgICBidXR0b246IHNsaWRlci5vcmlnaW5hbENsaWNrQnV0dG9uLAogICAgICAgICAgYnV0dG9uczogc2xpZGVyLm9yaWdpbmFsQ2xpY2tCdXR0b25zCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBXaW5kb3cgcmVzaXplIGV2ZW50IGNhbGxiYWNrCiAgICAgKi8KICAgIHZhciByZXNpemVXaW5kb3cgPSBmdW5jdGlvbihlKSB7CiAgICAgIC8vIGRvbid0IGRvIGFueXRoaW5nIGlmIHNsaWRlciBpc24ndCBpbml0aWFsaXplZC4KICAgICAgaWYgKCFzbGlkZXIuaW5pdGlhbGl6ZWQpIHsgcmV0dXJuOyB9CiAgICAgIC8vIERlbGF5IGlmIHNsaWRlciB3b3JraW5nLgogICAgICBpZiAoc2xpZGVyLndvcmtpbmcpIHsKICAgICAgICB3aW5kb3cuc2V0VGltZW91dChyZXNpemVXaW5kb3csIDEwKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBnZXQgdGhlIG5ldyB3aW5kb3cgZGltZW5zIChhZ2FpbiwgdGhhbmsgeW91IElFKQogICAgICAgIHZhciB3aW5kb3dXaWR0aE5ldyA9ICQod2luZG93KS53aWR0aCgpLAogICAgICAgIHdpbmRvd0hlaWdodE5ldyA9ICQod2luZG93KS5oZWlnaHQoKTsKICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCBpdCBpcyBhIHRydWUgd2luZG93IHJlc2l6ZQogICAgICAgIC8vICp3ZSBtdXN0IGNoZWNrIHRoaXMgYmVjYXVzZSBvdXIgZGlub3NhdXIgZnJpZW5kIElFIGZpcmVzIGEgd2luZG93IHJlc2l6ZSBldmVudCB3aGVuIGNlcnRhaW4gRE9NIGVsZW1lbnRzCiAgICAgICAgLy8gYXJlIHJlc2l6ZWQuIENhbiB5b3UganVzdCBkaWUgYWxyZWFkeT8qCiAgICAgICAgaWYgKHdpbmRvd1dpZHRoICE9PSB3aW5kb3dXaWR0aE5ldyB8fCB3aW5kb3dIZWlnaHQgIT09IHdpbmRvd0hlaWdodE5ldykgewogICAgICAgICAgLy8gc2V0IHRoZSBuZXcgd2luZG93IGRpbWVucwogICAgICAgICAgd2luZG93V2lkdGggPSB3aW5kb3dXaWR0aE5ldzsKICAgICAgICAgIHdpbmRvd0hlaWdodCA9IHdpbmRvd0hlaWdodE5ldzsKICAgICAgICAgIC8vIHVwZGF0ZSBhbGwgZHluYW1pYyBlbGVtZW50cwogICAgICAgICAgZWwucmVkcmF3U2xpZGVyKCk7CiAgICAgICAgICAvLyBDYWxsIHVzZXIgcmVzaXplIGhhbmRsZXIKICAgICAgICAgIHNsaWRlci5zZXR0aW5ncy5vblNsaWRlclJlc2l6ZS5jYWxsKGVsLCBzbGlkZXIuYWN0aXZlLmluZGV4KTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBBZGRzIGFuIGFyaWEtaGlkZGVuPXRydWUgYXR0cmlidXRlIHRvIGVhY2ggZWxlbWVudAogICAgICoKICAgICAqIEBwYXJhbSBzdGFydFZpc2libGVJbmRleCAoaW50KQogICAgICogIC0gdGhlIGZpcnN0IHZpc2libGUgZWxlbWVudCdzIGluZGV4CiAgICAgKi8KICAgIHZhciBhcHBseUFyaWFIaWRkZW5BdHRyaWJ1dGVzID0gZnVuY3Rpb24oc3RhcnRWaXNpYmxlSW5kZXgpIHsKICAgICAgdmFyIG51bWJlck9mU2xpZGVzU2hvd2luZyA9IGdldE51bWJlclNsaWRlc1Nob3dpbmcoKTsKICAgICAgLy8gb25seSBhcHBseSBhdHRyaWJ1dGVzIGlmIHRoZSBzZXR0aW5nIGlzIGVuYWJsZWQgYW5kIG5vdCBpbiB0aWNrZXIgbW9kZQogICAgICBpZiAoc2xpZGVyLnNldHRpbmdzLmFyaWFIaWRkZW4gJiYgIXNsaWRlci5zZXR0aW5ncy50aWNrZXIpIHsKICAgICAgICAvLyBhZGQgYXJpYS1oaWRkZW49dHJ1ZSB0byBhbGwgZWxlbWVudHMKICAgICAgICBzbGlkZXIuY2hpbGRyZW4uYXR0cignYXJpYS1oaWRkZW4nLCAndHJ1ZScpOwogICAgICAgIC8vIGdldCB0aGUgdmlzaWJsZSBlbGVtZW50cyBhbmQgY2hhbmdlIHRvIGFyaWEtaGlkZGVuPWZhbHNlCiAgICAgICAgc2xpZGVyLmNoaWxkcmVuLnNsaWNlKHN0YXJ0VmlzaWJsZUluZGV4LCBzdGFydFZpc2libGVJbmRleCArIG51bWJlck9mU2xpZGVzU2hvd2luZykuYXR0cignYXJpYS1oaWRkZW4nLCAnZmFsc2UnKTsKICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIFJldHVybnMgaW5kZXggYWNjb3JkaW5nIHRvIHByZXNlbnQgcGFnZSByYW5nZQogICAgICoKICAgICAqIEBwYXJhbSBzbGlkZU9uZGV4IChpbnQpCiAgICAgKiAgLSB0aGUgZGVzaXJlZCBzbGlkZSBpbmRleAogICAgICovCiAgICB2YXIgc2V0U2xpZGVJbmRleCA9IGZ1bmN0aW9uKHNsaWRlSW5kZXgpIHsKICAgICAgaWYgKHNsaWRlSW5kZXggPCAwKSB7CiAgICAgICAgaWYgKHNsaWRlci5zZXR0aW5ncy5pbmZpbml0ZUxvb3ApIHsKICAgICAgICAgIHJldHVybiBnZXRQYWdlclF0eSgpIC0gMTsKICAgICAgICB9ZWxzZSB7CiAgICAgICAgICAvL3dlIGRvbid0IGdvIHRvIHVuZGVmaW5lZCBzbGlkZXMKICAgICAgICAgIHJldHVybiBzbGlkZXIuYWN0aXZlLmluZGV4OwogICAgICAgIH0KICAgICAgLy8gaWYgc2xpZGVJbmRleCBpcyBncmVhdGVyIHRoYW4gY2hpbGRyZW4gbGVuZ3RoLCBzZXQgYWN0aXZlIGluZGV4IHRvIDAgKHRoaXMgaGFwcGVucyBkdXJpbmcgaW5maW5pdGUgbG9vcCkKICAgICAgfSBlbHNlIGlmIChzbGlkZUluZGV4ID49IGdldFBhZ2VyUXR5KCkpIHsKICAgICAgICBpZiAoc2xpZGVyLnNldHRpbmdzLmluZmluaXRlTG9vcCkgewogICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vd2UgZG9uJ3QgbW92ZSB0byB1bmRlZmluZWQgcGFnZXMKICAgICAgICAgIHJldHVybiBzbGlkZXIuYWN0aXZlLmluZGV4OwogICAgICAgIH0KICAgICAgLy8gc2V0IGFjdGl2ZSBpbmRleCB0byByZXF1ZXN0ZWQgc2xpZGUKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gc2xpZGVJbmRleDsKICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgKiA9IFBVQkxJQyBGVU5DVElPTlMKICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgKi8KCiAgICAvKioKICAgICAqIFBlcmZvcm1zIHNsaWRlIHRyYW5zaXRpb24gdG8gdGhlIHNwZWNpZmllZCBzbGlkZQogICAgICoKICAgICAqIEBwYXJhbSBzbGlkZUluZGV4IChpbnQpCiAgICAgKiAgLSB0aGUgZGVzdGluYXRpb24gc2xpZGUncyBpbmRleCAoemVyby1iYXNlZCkKICAgICAqCiAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIChzdHJpbmcpCiAgICAgKiAgLSBJTlRFUk5BTCBVU0UgT05MWSAtIHRoZSBkaXJlY3Rpb24gb2YgdHJhdmVsICgicHJldiIgLyAibmV4dCIpCiAgICAgKi8KICAgIGVsLmdvVG9TbGlkZSA9IGZ1bmN0aW9uKHNsaWRlSW5kZXgsIGRpcmVjdGlvbikgewogICAgICAvLyBvblNsaWRlQmVmb3JlLCBvblNsaWRlTmV4dCwgb25TbGlkZVByZXYgY2FsbGJhY2tzCiAgICAgIC8vIEFsbG93IHRyYW5zaXRpb24gY2FuY2VsaW5nIGJhc2VkIG9uIHJldHVybmVkIHZhbHVlCiAgICAgIHZhciBwZXJmb3JtVHJhbnNpdGlvbiA9IHRydWUsCiAgICAgIG1vdmVCeSA9IDAsCiAgICAgIHBvc2l0aW9uID0ge2xlZnQ6IDAsIHRvcDogMH0sCiAgICAgIGxhc3RDaGlsZCA9IG51bGwsCiAgICAgIGxhc3RTaG93aW5nSW5kZXgsIGVxLCB2YWx1ZSwgcmVxdWVzdEVsOwogICAgICAvLyBzdG9yZSB0aGUgb2xkIGluZGV4CiAgICAgIHNsaWRlci5vbGRJbmRleCA9IHNsaWRlci5hY3RpdmUuaW5kZXg7CiAgICAgIC8vc2V0IG5ldyBpbmRleAogICAgICBzbGlkZXIuYWN0aXZlLmluZGV4ID0gc2V0U2xpZGVJbmRleChzbGlkZUluZGV4KTsKCiAgICAgIC8vIGlmIHBsdWdpbiBpcyBjdXJyZW50bHkgaW4gbW90aW9uLCBpZ25vcmUgcmVxdWVzdAogICAgICBpZiAoc2xpZGVyLndvcmtpbmcgfHwgc2xpZGVyLmFjdGl2ZS5pbmRleCA9PT0gc2xpZGVyLm9sZEluZGV4KSB7IHJldHVybjsgfQogICAgICAvLyBkZWNsYXJlIHRoYXQgcGx1Z2luIGlzIGluIG1vdGlvbgogICAgICBzbGlkZXIud29ya2luZyA9IHRydWU7CgogICAgICBwZXJmb3JtVHJhbnNpdGlvbiA9IHNsaWRlci5zZXR0aW5ncy5vblNsaWRlQmVmb3JlLmNhbGwoZWwsIHNsaWRlci5jaGlsZHJlbi5lcShzbGlkZXIuYWN0aXZlLmluZGV4KSwgc2xpZGVyLm9sZEluZGV4LCBzbGlkZXIuYWN0aXZlLmluZGV4KTsKCiAgICAgIC8vIElmIHRyYW5zaXRpb25zIGNhbmNlbGVkLCByZXNldCBhbmQgcmV0dXJuCiAgICAgIGlmICh0eXBlb2YgKHBlcmZvcm1UcmFuc2l0aW9uKSAhPT0gJ3VuZGVmaW5lZCcgJiYgIXBlcmZvcm1UcmFuc2l0aW9uKSB7CiAgICAgICAgc2xpZGVyLmFjdGl2ZS5pbmRleCA9IHNsaWRlci5vbGRJbmRleDsgLy8gcmVzdG9yZSBvbGQgaW5kZXgKICAgICAgICBzbGlkZXIud29ya2luZyA9IGZhbHNlOyAvLyBpcyBub3QgaW4gbW90aW9uCiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBpZiAoZGlyZWN0aW9uID09PSAnbmV4dCcpIHsKICAgICAgICAvLyBQcmV2ZW50IGNhbmNlbGluZyBpbiBmdXR1cmUgZnVuY3Rpb25zIG9yIGxhY2sgdGhlcmUtb2YgZnJvbSBuZWdhdGluZyBwcmV2aW91cyBjb21tYW5kcyB0byBjYW5jZWwKICAgICAgICBpZiAoIXNsaWRlci5zZXR0aW5ncy5vblNsaWRlTmV4dC5jYWxsKGVsLCBzbGlkZXIuY2hpbGRyZW4uZXEoc2xpZGVyLmFjdGl2ZS5pbmRleCksIHNsaWRlci5vbGRJbmRleCwgc2xpZGVyLmFjdGl2ZS5pbmRleCkpIHsKICAgICAgICAgIHBlcmZvcm1UcmFuc2l0aW9uID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ3ByZXYnKSB7CiAgICAgICAgLy8gUHJldmVudCBjYW5jZWxpbmcgaW4gZnV0dXJlIGZ1bmN0aW9ucyBvciBsYWNrIHRoZXJlLW9mIGZyb20gbmVnYXRpbmcgcHJldmlvdXMgY29tbWFuZHMgdG8gY2FuY2VsCiAgICAgICAgaWYgKCFzbGlkZXIuc2V0dGluZ3Mub25TbGlkZVByZXYuY2FsbChlbCwgc2xpZGVyLmNoaWxkcmVuLmVxKHNsaWRlci5hY3RpdmUuaW5kZXgpLCBzbGlkZXIub2xkSW5kZXgsIHNsaWRlci5hY3RpdmUuaW5kZXgpKSB7CiAgICAgICAgICBwZXJmb3JtVHJhbnNpdGlvbiA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gY2hlY2sgaWYgbGFzdCBzbGlkZQogICAgICBzbGlkZXIuYWN0aXZlLmxhc3QgPSBzbGlkZXIuYWN0aXZlLmluZGV4ID49IGdldFBhZ2VyUXR5KCkgLSAxOwogICAgICAvLyB1cGRhdGUgdGhlIHBhZ2VyIHdpdGggYWN0aXZlIGNsYXNzCiAgICAgIGlmIChzbGlkZXIuc2V0dGluZ3MucGFnZXIgfHwgc2xpZGVyLnNldHRpbmdzLnBhZ2VyQ3VzdG9tKSB7IHVwZGF0ZVBhZ2VyQWN0aXZlKHNsaWRlci5hY3RpdmUuaW5kZXgpOyB9CiAgICAgIC8vIC8vIGNoZWNrIGZvciBkaXJlY3Rpb24gY29udHJvbCB1cGRhdGUKICAgICAgaWYgKHNsaWRlci5zZXR0aW5ncy5jb250cm9scykgeyB1cGRhdGVEaXJlY3Rpb25Db250cm9scygpOyB9CiAgICAgIC8vIGlmIHNsaWRlciBpcyBzZXQgdG8gbW9kZTogImZhZGUiCiAgICAgIGlmIChzbGlkZXIuc2V0dGluZ3MubW9kZSA9PT0gJ2ZhZGUnKSB7CiAgICAgICAgLy8gaWYgYWRhcHRpdmVIZWlnaHQgaXMgdHJ1ZSBhbmQgbmV4dCBoZWlnaHQgaXMgZGlmZmVyZW50IGZyb20gY3VycmVudCBoZWlnaHQsIGFuaW1hdGUgdG8gdGhlIG5ldyBoZWlnaHQKICAgICAgICBpZiAoc2xpZGVyLnNldHRpbmdzLmFkYXB0aXZlSGVpZ2h0ICYmIHNsaWRlci52aWV3cG9ydC5oZWlnaHQoKSAhPT0gZ2V0Vmlld3BvcnRIZWlnaHQoKSkgewogICAgICAgICAgc2xpZGVyLnZpZXdwb3J0LmFuaW1hdGUoe2hlaWdodDogZ2V0Vmlld3BvcnRIZWlnaHQoKX0sIHNsaWRlci5zZXR0aW5ncy5hZGFwdGl2ZUhlaWdodFNwZWVkKTsKICAgICAgICB9CiAgICAgICAgLy8gZmFkZSBvdXQgdGhlIHZpc2libGUgY2hpbGQgYW5kIHJlc2V0IGl0cyB6LWluZGV4IHZhbHVlCiAgICAgICAgc2xpZGVyLmNoaWxkcmVuLmZpbHRlcignOnZpc2libGUnKS5mYWRlT3V0KHNsaWRlci5zZXR0aW5ncy5zcGVlZCkuY3NzKHt6SW5kZXg6IDB9KTsKICAgICAgICAvLyBmYWRlIGluIHRoZSBuZXdseSByZXF1ZXN0ZWQgc2xpZGUKICAgICAgICBzbGlkZXIuY2hpbGRyZW4uZXEoc2xpZGVyLmFjdGl2ZS5pbmRleCkuY3NzKCd6SW5kZXgnLCBzbGlkZXIuc2V0dGluZ3Muc2xpZGVaSW5kZXggKyAxKS5mYWRlSW4oc2xpZGVyLnNldHRpbmdzLnNwZWVkLCBmdW5jdGlvbigpIHsKICAgICAgICAgICQodGhpcykuY3NzKCd6SW5kZXgnLCBzbGlkZXIuc2V0dGluZ3Muc2xpZGVaSW5kZXgpOwogICAgICAgICAgdXBkYXRlQWZ0ZXJTbGlkZVRyYW5zaXRpb24oKTsKICAgICAgICB9KTsKICAgICAgLy8gc2xpZGVyIG1vZGUgaXMgbm90ICJmYWRlIgogICAgICB9IGVsc2UgewogICAgICAgIC8vIGlmIGFkYXB0aXZlSGVpZ2h0IGlzIHRydWUgYW5kIG5leHQgaGVpZ2h0IGlzIGRpZmZlcmVudCBmcm9tIGN1cnJlbnQgaGVpZ2h0LCBhbmltYXRlIHRvIHRoZSBuZXcgaGVpZ2h0CiAgICAgICAgaWYgKHNsaWRlci5zZXR0aW5ncy5hZGFwdGl2ZUhlaWdodCAmJiBzbGlkZXIudmlld3BvcnQuaGVpZ2h0KCkgIT09IGdldFZpZXdwb3J0SGVpZ2h0KCkpIHsKICAgICAgICAgIHNsaWRlci52aWV3cG9ydC5hbmltYXRlKHtoZWlnaHQ6IGdldFZpZXdwb3J0SGVpZ2h0KCl9LCBzbGlkZXIuc2V0dGluZ3MuYWRhcHRpdmVIZWlnaHRTcGVlZCk7CiAgICAgICAgfQogICAgICAgIC8vIGlmIGNhcm91c2VsIGFuZCBub3QgaW5maW5pdGUgbG9vcAogICAgICAgIGlmICghc2xpZGVyLnNldHRpbmdzLmluZmluaXRlTG9vcCAmJiBzbGlkZXIuY2Fyb3VzZWwgJiYgc2xpZGVyLmFjdGl2ZS5sYXN0KSB7CiAgICAgICAgICBpZiAoc2xpZGVyLnNldHRpbmdzLm1vZGUgPT09ICdob3Jpem9udGFsJykgewogICAgICAgICAgICAvLyBnZXQgdGhlIGxhc3QgY2hpbGQgcG9zaXRpb24KICAgICAgICAgICAgbGFzdENoaWxkID0gc2xpZGVyLmNoaWxkcmVuLmVxKHNsaWRlci5jaGlsZHJlbi5sZW5ndGggLSAxKTsKICAgICAgICAgICAgcG9zaXRpb24gPSBsYXN0Q2hpbGQucG9zaXRpb24oKTsKICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGFzdCBzbGlkZQogICAgICAgICAgICBtb3ZlQnkgPSBzbGlkZXIudmlld3BvcnQud2lkdGgoKSAtIGxhc3RDaGlsZC5vdXRlcldpZHRoKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBnZXQgbGFzdCBzaG93aW5nIGluZGV4IHBvc2l0aW9uCiAgICAgICAgICAgIGxhc3RTaG93aW5nSW5kZXggPSBzbGlkZXIuY2hpbGRyZW4ubGVuZ3RoIC0gc2xpZGVyLnNldHRpbmdzLm1pblNsaWRlczsKICAgICAgICAgICAgcG9zaXRpb24gPSBzbGlkZXIuY2hpbGRyZW4uZXEobGFzdFNob3dpbmdJbmRleCkucG9zaXRpb24oKTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIGhvcml6b250YWwgY2Fyb3VzZWwsIGdvaW5nIHByZXZpb3VzIHdoaWxlIG9uIGZpcnN0IHNsaWRlIChpbmZpbml0ZUxvb3AgbW9kZSkKICAgICAgICB9IGVsc2UgaWYgKHNsaWRlci5jYXJvdXNlbCAmJiBzbGlkZXIuYWN0aXZlLmxhc3QgJiYgZGlyZWN0aW9uID09PSAncHJldicpIHsKICAgICAgICAgIC8vIGdldCB0aGUgbGFzdCBjaGlsZCBwb3NpdGlvbgogICAgICAgICAgZXEgPSBzbGlkZXIuc2V0dGluZ3MubW92ZVNsaWRlcyA9PT0gMSA/IHNsaWRlci5zZXR0aW5ncy5tYXhTbGlkZXMgLSBnZXRNb3ZlQnkoKSA6ICgoZ2V0UGFnZXJRdHkoKSAtIDEpICogZ2V0TW92ZUJ5KCkpIC0gKHNsaWRlci5jaGlsZHJlbi5sZW5ndGggLSBzbGlkZXIuc2V0dGluZ3MubWF4U2xpZGVzKTsKICAgICAgICAgIGxhc3RDaGlsZCA9IGVsLmNoaWxkcmVuKCcuYngtY2xvbmUnKS5lcShlcSk7CiAgICAgICAgICBwb3NpdGlvbiA9IGxhc3RDaGlsZC5wb3NpdGlvbigpOwogICAgICAgIC8vIGlmIGluZmluaXRlIGxvb3AgYW5kICJOZXh0IiBpcyBjbGlja2VkIG9uIHRoZSBsYXN0IHNsaWRlCiAgICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICduZXh0JyAmJiBzbGlkZXIuYWN0aXZlLmluZGV4ID09PSAwKSB7CiAgICAgICAgICAvLyBnZXQgdGhlIGxhc3QgY2xvbmUgcG9zaXRpb24KICAgICAgICAgIHBvc2l0aW9uID0gZWwuZmluZCgnPiAuYngtY2xvbmUnKS5lcShzbGlkZXIuc2V0dGluZ3MubWF4U2xpZGVzKS5wb3NpdGlvbigpOwogICAgICAgICAgc2xpZGVyLmFjdGl2ZS5sYXN0ID0gZmFsc2U7CiAgICAgICAgLy8gbm9ybWFsIG5vbi16ZXJvIHJlcXVlc3RzCiAgICAgICAgfSBlbHNlIGlmIChzbGlkZUluZGV4ID49IDApIHsKICAgICAgICAgIC8vcGFyc2VJbnQgaXMgYXBwbGllZCB0byBhbGxvdyBmbG9hdHMgZm9yIHNsaWRlcy9wYWdlCiAgICAgICAgICByZXF1ZXN0RWwgPSBzbGlkZUluZGV4ICogcGFyc2VJbnQoZ2V0TW92ZUJ5KCkpOwogICAgICAgICAgcG9zaXRpb24gPSBzbGlkZXIuY2hpbGRyZW4uZXEocmVxdWVzdEVsKS5wb3NpdGlvbigpOwogICAgICAgIH0KCiAgICAgICAgLyogSWYgdGhlIHBvc2l0aW9uIGRvZXNuJ3QgZXhpc3QKICAgICAgICAgKiAoZS5nLiBpZiB5b3UgZGVzdHJveSB0aGUgc2xpZGVyIG9uIGEgbmV4dCBjbGljayksCiAgICAgICAgICogaXQgZG9lc24ndCB0aHJvdyBhbiBlcnJvci4KICAgICAgICAgKi8KICAgICAgICBpZiAodHlwZW9mIChwb3NpdGlvbikgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICB2YWx1ZSA9IHNsaWRlci5zZXR0aW5ncy5tb2RlID09PSAnaG9yaXpvbnRhbCcgPyAtKHBvc2l0aW9uLmxlZnQgLSBtb3ZlQnkpIDogLXBvc2l0aW9uLnRvcDsKICAgICAgICAgIC8vIHBsdWdpbiB2YWx1ZXMgdG8gYmUgYW5pbWF0ZWQKICAgICAgICAgIHNldFBvc2l0aW9uUHJvcGVydHkodmFsdWUsICdzbGlkZScsIHNsaWRlci5zZXR0aW5ncy5zcGVlZCk7CiAgICAgICAgfQogICAgICAgIHNsaWRlci53b3JraW5nID0gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKHNsaWRlci5zZXR0aW5ncy5hcmlhSGlkZGVuKSB7IGFwcGx5QXJpYUhpZGRlbkF0dHJpYnV0ZXMoc2xpZGVyLmFjdGl2ZS5pbmRleCAqIGdldE1vdmVCeSgpKTsgfQogICAgfTsKCiAgICAvKioKICAgICAqIFRyYW5zaXRpb25zIHRvIHRoZSBuZXh0IHNsaWRlIGluIHRoZSBzaG93CiAgICAgKi8KICAgIGVsLmdvVG9OZXh0U2xpZGUgPSBmdW5jdGlvbigpIHsKICAgICAgLy8gaWYgaW5maW5pdGVMb29wIGlzIGZhbHNlIGFuZCBsYXN0IHBhZ2UgaXMgc2hvd2luZywgZGlzcmVnYXJkIGNhbGwKICAgICAgaWYgKCFzbGlkZXIuc2V0dGluZ3MuaW5maW5pdGVMb29wICYmIHNsaWRlci5hY3RpdmUubGFzdCkgeyByZXR1cm47IH0KCSAgaWYgKHNsaWRlci53b3JraW5nID09PSB0cnVlKXsgcmV0dXJuIDt9CiAgICAgIHZhciBwYWdlckluZGV4ID0gcGFyc2VJbnQoc2xpZGVyLmFjdGl2ZS5pbmRleCkgKyAxOwogICAgICBlbC5nb1RvU2xpZGUocGFnZXJJbmRleCwgJ25leHQnKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBUcmFuc2l0aW9ucyB0byB0aGUgcHJldiBzbGlkZSBpbiB0aGUgc2hvdwogICAgICovCiAgICBlbC5nb1RvUHJldlNsaWRlID0gZnVuY3Rpb24oKSB7CiAgICAgIC8vIGlmIGluZmluaXRlTG9vcCBpcyBmYWxzZSBhbmQgbGFzdCBwYWdlIGlzIHNob3dpbmcsIGRpc3JlZ2FyZCBjYWxsCiAgICAgIGlmICghc2xpZGVyLnNldHRpbmdzLmluZmluaXRlTG9vcCAmJiBzbGlkZXIuYWN0aXZlLmluZGV4ID09PSAwKSB7IHJldHVybjsgfQoJICBpZiAoc2xpZGVyLndvcmtpbmcgPT09IHRydWUpeyByZXR1cm4gO30KICAgICAgdmFyIHBhZ2VySW5kZXggPSBwYXJzZUludChzbGlkZXIuYWN0aXZlLmluZGV4KSAtIDE7CiAgICAgIGVsLmdvVG9TbGlkZShwYWdlckluZGV4LCAncHJldicpOwogICAgfTsKCiAgICAvKioKICAgICAqIFN0YXJ0cyB0aGUgYXV0byBzaG93CiAgICAgKgogICAgICogQHBhcmFtIHByZXZlbnRDb250cm9sVXBkYXRlIChib29sZWFuKQogICAgICogIC0gaWYgdHJ1ZSwgYXV0byBjb250cm9scyBzdGF0ZSB3aWxsIG5vdCBiZSB1cGRhdGVkCiAgICAgKi8KICAgIGVsLnN0YXJ0QXV0byA9IGZ1bmN0aW9uKHByZXZlbnRDb250cm9sVXBkYXRlKSB7CiAgICAgIC8vIGlmIGFuIGludGVydmFsIGFscmVhZHkgZXhpc3RzLCBkaXNyZWdhcmQgY2FsbAogICAgICBpZiAoc2xpZGVyLmludGVydmFsKSB7IHJldHVybjsgfQogICAgICAvLyBjcmVhdGUgYW4gaW50ZXJ2YWwKICAgICAgc2xpZGVyLmludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHNsaWRlci5zZXR0aW5ncy5hdXRvRGlyZWN0aW9uID09PSAnbmV4dCcpIHsKICAgICAgICAgIGVsLmdvVG9OZXh0U2xpZGUoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZWwuZ29Ub1ByZXZTbGlkZSgpOwogICAgICAgIH0KICAgICAgfSwgc2xpZGVyLnNldHRpbmdzLnBhdXNlKTsKCSAgLy9hbGxiYWNrIGZvciB3aGVuIHRoZSBhdXRvIHJvdGF0ZSBzdGF0dXMgY2hhbmdlcwoJICBzbGlkZXIuc2V0dGluZ3Mub25BdXRvQ2hhbmdlLmNhbGwoZWwsIHRydWUpOwogICAgICAvLyBpZiBhdXRvIGNvbnRyb2xzIGFyZSBkaXNwbGF5ZWQgYW5kIHByZXZlbnRDb250cm9sVXBkYXRlIGlzIG5vdCB0cnVlCiAgICAgIGlmIChzbGlkZXIuc2V0dGluZ3MuYXV0b0NvbnRyb2xzICYmIHByZXZlbnRDb250cm9sVXBkYXRlICE9PSB0cnVlKSB7IHVwZGF0ZUF1dG9Db250cm9scygnc3RvcCcpOyB9CiAgICB9OwoKICAgIC8qKgogICAgICogU3RvcHMgdGhlIGF1dG8gc2hvdwogICAgICoKICAgICAqIEBwYXJhbSBwcmV2ZW50Q29udHJvbFVwZGF0ZSAoYm9vbGVhbikKICAgICAqICAtIGlmIHRydWUsIGF1dG8gY29udHJvbHMgc3RhdGUgd2lsbCBub3QgYmUgdXBkYXRlZAogICAgICovCiAgICBlbC5zdG9wQXV0byA9IGZ1bmN0aW9uKHByZXZlbnRDb250cm9sVXBkYXRlKSB7CiAgICAgIC8vIGlmIHNsaWRlciBpcyBhdXRvIHBhdXNlZCwganVzdCBjbGVhciB0aGF0IHN0YXRlCiAgICAgIGlmIChzbGlkZXIuYXV0b1BhdXNlZCkgc2xpZGVyLmF1dG9QYXVzZWQgPSBmYWxzZTsKICAgICAgLy8gaWYgbm8gaW50ZXJ2YWwgZXhpc3RzLCBkaXNyZWdhcmQgY2FsbAogICAgICBpZiAoIXNsaWRlci5pbnRlcnZhbCkgeyByZXR1cm47IH0KICAgICAgLy8gY2xlYXIgdGhlIGludGVydmFsCiAgICAgIGNsZWFySW50ZXJ2YWwoc2xpZGVyLmludGVydmFsKTsKICAgICAgc2xpZGVyLmludGVydmFsID0gbnVsbDsKCSAgLy9hbGxiYWNrIGZvciB3aGVuIHRoZSBhdXRvIHJvdGF0ZSBzdGF0dXMgY2hhbmdlcwoJICBzbGlkZXIuc2V0dGluZ3Mub25BdXRvQ2hhbmdlLmNhbGwoZWwsIGZhbHNlKTsKICAgICAgLy8gaWYgYXV0byBjb250cm9scyBhcmUgZGlzcGxheWVkIGFuZCBwcmV2ZW50Q29udHJvbFVwZGF0ZSBpcyBub3QgdHJ1ZQogICAgICBpZiAoc2xpZGVyLnNldHRpbmdzLmF1dG9Db250cm9scyAmJiBwcmV2ZW50Q29udHJvbFVwZGF0ZSAhPT0gdHJ1ZSkgeyB1cGRhdGVBdXRvQ29udHJvbHMoJ3N0YXJ0Jyk7IH0KICAgIH07CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGN1cnJlbnQgc2xpZGUgaW5kZXggKHplcm8tYmFzZWQpCiAgICAgKi8KICAgIGVsLmdldEN1cnJlbnRTbGlkZSA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc2xpZGVyLmFjdGl2ZS5pbmRleDsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGN1cnJlbnQgc2xpZGUgZWxlbWVudAogICAgICovCiAgICBlbC5nZXRDdXJyZW50U2xpZGVFbGVtZW50ID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBzbGlkZXIuY2hpbGRyZW4uZXEoc2xpZGVyLmFjdGl2ZS5pbmRleCk7CiAgICB9OwoKICAgIC8qKgogICAgICogUmV0dXJucyBhIHNsaWRlIGVsZW1lbnQKICAgICAqIEBwYXJhbSBpbmRleCAoaW50KQogICAgICogIC0gVGhlIGluZGV4ICh6ZXJvLWJhc2VkKSBvZiB0aGUgZWxlbWVudCB5b3Ugd2FudCByZXR1cm5lZC4KICAgICAqLwogICAgZWwuZ2V0U2xpZGVFbGVtZW50ID0gZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgcmV0dXJuIHNsaWRlci5jaGlsZHJlbi5lcShpbmRleCk7CiAgICB9OwoKICAgIC8qKgogICAgICogUmV0dXJucyBudW1iZXIgb2Ygc2xpZGVzIGluIHNob3cKICAgICAqLwogICAgZWwuZ2V0U2xpZGVDb3VudCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc2xpZGVyLmNoaWxkcmVuLmxlbmd0aDsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXR1cm4gc2xpZGVyLndvcmtpbmcgdmFyaWFibGUKICAgICAqLwogICAgZWwuaXNXb3JraW5nID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBzbGlkZXIud29ya2luZzsKICAgIH07CgogICAgLyoqCiAgICAgKiBVcGRhdGUgYWxsIGR5bmFtaWMgc2xpZGVyIGVsZW1lbnRzCiAgICAgKi8KICAgIGVsLnJlZHJhd1NsaWRlciA9IGZ1bmN0aW9uKCkgewogICAgICAvLyByZXNpemUgYWxsIGNoaWxkcmVuIGluIHJhdGlvIHRvIG5ldyBzY3JlZW4gc2l6ZQogICAgICBzbGlkZXIuY2hpbGRyZW4uYWRkKGVsLmZpbmQoJy5ieC1jbG9uZScpKS5vdXRlcldpZHRoKGdldFNsaWRlV2lkdGgoKSk7CiAgICAgIC8vIGFkanVzdCB0aGUgaGVpZ2h0CiAgICAgIHNsaWRlci52aWV3cG9ydC5jc3MoJ2hlaWdodCcsIGdldFZpZXdwb3J0SGVpZ2h0KCkpOwogICAgICAvLyB1cGRhdGUgdGhlIHNsaWRlIHBvc2l0aW9uCiAgICAgIGlmICghc2xpZGVyLnNldHRpbmdzLnRpY2tlcikgeyBzZXRTbGlkZVBvc2l0aW9uKCk7IH0KICAgICAgLy8gaWYgYWN0aXZlLmxhc3Qgd2FzIHRydWUgYmVmb3JlIHRoZSBzY3JlZW4gcmVzaXplLCB3ZSB3YW50CiAgICAgIC8vIHRvIGtlZXAgaXQgbGFzdCBubyBtYXR0ZXIgd2hhdCBzY3JlZW4gc2l6ZSB3ZSBlbmQgb24KICAgICAgaWYgKHNsaWRlci5hY3RpdmUubGFzdCkgeyBzbGlkZXIuYWN0aXZlLmluZGV4ID0gZ2V0UGFnZXJRdHkoKSAtIDE7IH0KICAgICAgLy8gaWYgdGhlIGFjdGl2ZSBpbmRleCAocGFnZSkgbm8gbG9uZ2VyIGV4aXN0cyBkdWUgdG8gdGhlIHJlc2l6ZSwgc2ltcGx5IHNldCB0aGUgaW5kZXggYXMgbGFzdAogICAgICBpZiAoc2xpZGVyLmFjdGl2ZS5pbmRleCA+PSBnZXRQYWdlclF0eSgpKSB7IHNsaWRlci5hY3RpdmUubGFzdCA9IHRydWU7IH0KICAgICAgLy8gaWYgYSBwYWdlciBpcyBiZWluZyBkaXNwbGF5ZWQgYW5kIGEgY3VzdG9tIHBhZ2VyIGlzIG5vdCBiZWluZyB1c2VkLCB1cGRhdGUgaXQKICAgICAgaWYgKHNsaWRlci5zZXR0aW5ncy5wYWdlciAmJiAhc2xpZGVyLnNldHRpbmdzLnBhZ2VyQ3VzdG9tKSB7CiAgICAgICAgcG9wdWxhdGVQYWdlcigpOwogICAgICAgIHVwZGF0ZVBhZ2VyQWN0aXZlKHNsaWRlci5hY3RpdmUuaW5kZXgpOwogICAgICB9CiAgICAgIGlmIChzbGlkZXIuc2V0dGluZ3MuYXJpYUhpZGRlbikgeyBhcHBseUFyaWFIaWRkZW5BdHRyaWJ1dGVzKHNsaWRlci5hY3RpdmUuaW5kZXggKiBnZXRNb3ZlQnkoKSk7IH0KICAgIH07CgogICAgLyoqCiAgICAgKiBEZXN0cm95IHRoZSBjdXJyZW50IGluc3RhbmNlIG9mIHRoZSBzbGlkZXIgKHJldmVydCBldmVyeXRoaW5nIGJhY2sgdG8gb3JpZ2luYWwgc3RhdGUpCiAgICAgKi8KICAgIGVsLmRlc3Ryb3lTbGlkZXIgPSBmdW5jdGlvbigpIHsKICAgICAgLy8gZG9uJ3QgZG8gYW55dGhpbmcgaWYgc2xpZGVyIGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkCiAgICAgIGlmICghc2xpZGVyLmluaXRpYWxpemVkKSB7IHJldHVybjsgfQogICAgICBzbGlkZXIuaW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgICAgJCgnLmJ4LWNsb25lJywgdGhpcykucmVtb3ZlKCk7CiAgICAgIHNsaWRlci5jaGlsZHJlbi5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIGlmICgkKHRoaXMpLmRhdGEoJ29yaWdTdHlsZScpICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICQodGhpcykuYXR0cignc3R5bGUnLCAkKHRoaXMpLmRhdGEoJ29yaWdTdHlsZScpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgJCh0aGlzKS5yZW1vdmVBdHRyKCdzdHlsZScpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGlmICgkKHRoaXMpLmRhdGEoJ29yaWdTdHlsZScpICE9PSB1bmRlZmluZWQpIHsKICAgICAgICB0aGlzLmF0dHIoJ3N0eWxlJywgJCh0aGlzKS5kYXRhKCdvcmlnU3R5bGUnKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgJCh0aGlzKS5yZW1vdmVBdHRyKCdzdHlsZScpOwogICAgICB9CiAgICAgICQodGhpcykudW53cmFwKCkudW53cmFwKCk7CiAgICAgIGlmIChzbGlkZXIuY29udHJvbHMuZWwpIHsgc2xpZGVyLmNvbnRyb2xzLmVsLnJlbW92ZSgpOyB9CiAgICAgIGlmIChzbGlkZXIuY29udHJvbHMubmV4dCkgeyBzbGlkZXIuY29udHJvbHMubmV4dC5yZW1vdmUoKTsgfQogICAgICBpZiAoc2xpZGVyLmNvbnRyb2xzLnByZXYpIHsgc2xpZGVyLmNvbnRyb2xzLnByZXYucmVtb3ZlKCk7IH0KICAgICAgaWYgKHNsaWRlci5wYWdlckVsICYmIHNsaWRlci5zZXR0aW5ncy5jb250cm9scyAmJiAhc2xpZGVyLnNldHRpbmdzLnBhZ2VyQ3VzdG9tKSB7IHNsaWRlci5wYWdlckVsLnJlbW92ZSgpOyB9CiAgICAgICQoJy5ieC1jYXB0aW9uJywgdGhpcykucmVtb3ZlKCk7CiAgICAgIGlmIChzbGlkZXIuY29udHJvbHMuYXV0b0VsKSB7IHNsaWRlci5jb250cm9scy5hdXRvRWwucmVtb3ZlKCk7IH0KICAgICAgY2xlYXJJbnRlcnZhbChzbGlkZXIuaW50ZXJ2YWwpOwogICAgICBpZiAoc2xpZGVyLnNldHRpbmdzLnJlc3BvbnNpdmUpIHsgJCh3aW5kb3cpLm9mZigncmVzaXplJywgcmVzaXplV2luZG93KTsgfQogICAgICBpZiAoc2xpZGVyLnNldHRpbmdzLmtleWJvYXJkRW5hYmxlZCkgeyAkKGRvY3VtZW50KS5vZmYoJ2tleWRvd24nLCBrZXlQcmVzcyk7IH0KICAgICAgLy9yZW1vdmUgc2VsZiByZWZlcmVuY2UgaW4gZGF0YQogICAgICAkKHRoaXMpLnJlbW92ZURhdGEoJ2J4U2xpZGVyJyk7CgkgIC8vIHJlbW92ZSBnbG9iYWwgd2luZG93IGhhbmRsZXJzCgkgICQod2luZG93KS5vZmYoJ2JsdXInLCB3aW5kb3dCbHVySGFuZGxlcikub2ZmKCdmb2N1cycsIHdpbmRvd0ZvY3VzSGFuZGxlcik7CiAgICB9OwoKICAgIC8qKgogICAgICogUmVsb2FkIHRoZSBzbGlkZXIgKHJldmVydCBhbGwgRE9NIGNoYW5nZXMsIGFuZCByZS1pbml0aWFsaXplKQogICAgICovCiAgICBlbC5yZWxvYWRTbGlkZXIgPSBmdW5jdGlvbihzZXR0aW5ncykgewogICAgICBpZiAoc2V0dGluZ3MgIT09IHVuZGVmaW5lZCkgeyBvcHRpb25zID0gc2V0dGluZ3M7IH0KICAgICAgZWwuZGVzdHJveVNsaWRlcigpOwogICAgICBpbml0KCk7CiAgICAgIC8vc3RvcmUgcmVmZXJlbmNlIHRvIHNlbGYgaW4gb3JkZXIgdG8gYWNjZXNzIHB1YmxpYyBmdW5jdGlvbnMgbGF0ZXIKICAgICAgJChlbCkuZGF0YSgnYnhTbGlkZXInLCB0aGlzKTsKICAgIH07CgogICAgaW5pdCgpOwoKICAgICQoZWwpLmRhdGEoJ2J4U2xpZGVyJywgdGhpcyk7CgogICAgLy8gcmV0dXJucyB0aGUgY3VycmVudCBqUXVlcnkgb2JqZWN0CiAgICByZXR1cm4gdGhpczsKICB9OwoKfSkoalF1ZXJ5KTsKCiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewokKCcjYmFubmVyJykuYnhTbGlkZXIoewoJYXV0bzogdHJ1ZSwKCXBhdXNlOiA0NTAwLAoJY29udHJvbHM6IHRydWUsCgltb2RlOiAnZmFkZScKfSk7CgkKCn0pOwo>/script> link relstylesheet hrefhttps://www.hitechfea.com/wp-content/cache/autoptimize/css/autoptimize_single_d632fa8c13dc8e4d10c7603258fcabaa.css> script defer srcdata:text/javascript;base64,CiAgV2ViRm9udENvbmZpZyA9IHsKICAgIGdvb2dsZTogeyBmYW1pbGllczogWyAnTGF0bzo0MDAsNzAwJyBdIH0KICB9OwogIChmdW5jdGlvbigpIHsKICAgIHZhciB3ZiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwogICAgd2Yuc3JjID0gKCdodHRwczonID09IGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sID8gJ2h0dHBzJyA6ICdodHRwJykgKwogICAgICAnOi8vYWpheC5nb29nbGVhcGlzLmNvbS9hamF4L2xpYnMvd2ViZm9udC8xLjUuMTgvd2ViZm9udC5qcyc7CiAgICB3Zi50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7CiAgICB3Zi5hc3luYyA9ICd0cnVlJzsKICAgIHZhciBzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpWzBdOwogICAgcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh3Ziwgcyk7CiAgfSkoKTsK>/script> script typeapplication/ld+json>{ @context: http://schema.org, @type: Corporation, additionalType: http://www.productontology.org/id/Finite_element_method, name: Hi-Tech FEA, url : https://www.hitechfea.com, sameAs : https://www.facebook.com/hitechfeaservices/, https://twitter.com/HiTechFEA, https://plus.google.com/+Hitechfea , ContactPoint: { @type: PostalAddress, streetAddress: Hi-Tech House, Near Gurukul Tower, addressRegion: Gurukul, addressLocality: Ahmedabad, Gujarat, postalCode: 380052, addressCountry: India, telephone: +917940003202, faxNumber: +917940003202, email: info@hitechfea.com }, { @type: PostalAddress, streetAddress: 1460 Broadway, addressRegion: New York, addressLocality: NY, postalCode: 10036, addressCountry: USA }, { @type: PostalAddress, streetAddress: 547 Moreland Way, addressRegion: Santa Clara, addressLocality: California, postalCode: 95054, addressCountry: USA }, { @type: PostalAddress, streetAddress: New Broad Street House, addressRegion: 35 New Broad Street, addressLocality: London, Middlesex, postalCode: EC2M 1NH, addressCountry: United Kingdom } , logo: https://www.hitechfea.com/wp-content/themes/hitechfea/images/hitech-fea-logo.svg, description: HiTech FEA extends Finite Element Analysis (FEA) & consulting services for effective product design & optimization.}/script> button typebutton aria-controlsrmp-container-755 aria-labelMenu Trigger idrmp_menu_trigger-755 classrmp_menu_trigger rmp-menu-trigger-boring> span classrmp-trigger-box> span classresponsive-menu-pro-inner>/span> /span> /button>div idrmp-container-755 classrmp-container rmp-container rmp-slide-right>div idrmp-menu-title-755 classrmp-menu-title> span classrmp-menu-title-link> span>/span> /span>/div>div idrmp-menu-wrap-755 classrmp-menu-wrap>ul idrmp-menu-755 classrmp-menu rolemenubar aria-labelDefault Menu>li idrmp-menu-item-679 classmegamenu menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children rmp-menu-item rmp-menu-item-has-children rmp-menu-top-level-item rolenone>a hrefhttps://www.hitechfea.com/fea-analysis-services.html classrmp-menu-item-link rolemenuitem>Servicesdiv classrmp-menu-subarrow>img alt srchttps://www.hitechfea.com/wp-content/themes/hitechfea/images/menu-expand.png />/div>/a>ul aria-labelServices rolemenu data-depth2 classrmp-submenu rmp-submenu-depth-1>li idrmp-menu-item-569 class menu-item menu-item-type-post_type menu-item-object-page rmp-menu-item rmp-menu-sub-level-item rolenone>a hrefhttps://www.hitechfea.com/static-fea-analysis-services.html classrmp-menu-item-link rolemenuitem>Static FEA Analysis/a>/li>li idrmp-menu-item-570 class menu-item menu-item-type-post_type menu-item-object-page rmp-menu-item rmp-menu-sub-level-item rolenone>a hrefhttps://www.hitechfea.com/thermal-analysis-services.html classrmp-menu-item-link rolemenuitem>Thermal Analysis/a>/li>li idrmp-menu-item-571 class menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children rmp-menu-item rmp-menu-item-has-children rmp-menu-sub-level-item rolenone>a hrefhttps://www.hitechfea.com/dynamic-analysis-services.html classrmp-menu-item-link rolemenuitem>Dynamic Analysisdiv classrmp-menu-subarrow>img alt srchttps://www.hitechfea.com/wp-content/themes/hitechfea/images/menu-expand.png />/div>/a>ul aria-labelDynamic Analysis rolemenu data-depth3 classrmp-submenu rmp-submenu-depth-2>li idrmp-menu-item-572 class menu-item menu-item-type-post_type menu-item-object-page rmp-menu-item rmp-menu-sub-level-item rolenone>a hrefhttps://www.hitechfea.com/buckling-analysis-services.html classrmp-menu-item-link rolemenuitem>Buckling Analysis/a>/li>li idrmp-menu-item-573 class menu-item menu-item-type-post_type menu-item-object-page rmp-menu-item rmp-menu-sub-level-item rolenone>a hrefhttps://www.hitechfea.com/crash-analysis-services.html classrmp-menu-item-link rolemenuitem>Crash Analysis/a>/li>li idrmp-menu-item-574 class menu-item menu-item-type-post_type menu-item-object-page rmp-menu-item rmp-menu-sub-level-item rolenone>a hrefhttps://www.hitechfea.com/harmonic-analysis-services.html classrmp-menu-item-link rolemenuitem>Harmonic Analysis/a>/li>li idrmp-menu-item-575 class menu-item menu-item-type-post_type menu-item-object-page rmp-menu-item rmp-menu-sub-level-item rolenone>a hrefhttps://www.hitechfea.com/modal-analysis-services.html classrmp-menu-item-link rolemenuitem>Modal Analysis/a>/li>li idrmp-menu-item-576 class menu-item menu-item-type-post_type menu-item-object-page rmp-menu-item rmp-menu-sub-level-item rolenone>a hrefhttps://www.hitechfea.com/seismic-analysis-services.html classrmp-menu-item-link rolemenuitem>Seismic Analysis/a>/li>/ul>/li>li idrmp-menu-item-577 class menu-item menu-item-type-post_type menu-item-object-page rmp-menu-item rmp-menu-sub-level-item rolenone>a hrefhttps://www.hitechfea.com/fatigue-analysis-services.html classrmp-menu-item-link rolemenuitem>Fatigue Analysis/a>/li>li idrmp-menu-item-578 class menu-item menu-item-type-post_type menu-item-object-page rmp-menu-item rmp-menu-sub-level-item rolenone>a hrefhttps://www.hitechfea.com/coupled-field-analysis-services.html classrmp-menu-item-link rolemenuitem>Coupled Field Analysis/a>/li>li idrmp-menu-item-579 class menu-item menu-item-type-post_type menu-item-object-page rmp-menu-item rmp-menu-sub-level-item rolenone>a hrefhttps://www.hitechfea.com/manufacturing-process-simulation-services.html classrmp-menu-item-link rolemenuitem>Manufacturing Process Simulation/a>/li>/ul>/li>li idrmp-menu-item-680 classmegamenu menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children rmp-menu-item rmp-menu-item-has-children rmp-menu-top-level-item rolenone>a hrefhttps://www.hitechfea.com/fea-projects.html classrmp-menu-item-link rolemenuitem>Projectsdiv classrmp-menu-subarrow>img alt srchttps://www.hitechfea.com/wp-content/themes/hitechfea/images/menu-expand.png />/div>/a>ul aria-labelProjects rolemenu data-depth2 classrmp-submenu rmp-submenu-depth-1>li idrmp-menu-item-581 class menu-item menu-item-type-post_type menu-item-object-page rmp-menu-item rmp-menu-sub-level-item rolenone>a hrefhttps://www.hitechfea.com/bracket-fea-analysis.html classrmp-menu-item-link rolemenuitem>Bracket FEA Analysis/a>/li>li idrmp-menu-item-582 class menu-item menu-item-type-post_type menu-item-object-page rmp-menu-item rmp-menu-sub-level-item rolenone>a hrefhttps://www.hitechfea.com/bracket-structural-analysis.html classrmp-menu-item-link rolemenuitem>Bracket Structural Analysis/a>/li>li idrmp-menu-item-583 class menu-item menu-item-type-post_type menu-item-object-page rmp-menu-item rmp-menu-sub-level-item rolenone>a hrefhttps://www.hitechfea.com/curing-tool-thermal-analysis.html classrmp-menu-item-link rolemenuitem>Curing Tool Thermal Analysis/a>/li>li idrmp-menu-item-584 class menu-item menu-item-type-post_type menu-item-object-page rmp-menu-item rmp-menu-sub-level-item rolenone>a hrefhttps://www.hitechfea.com/fifth-wheel-assembly.html classrmp-menu-item-link rolemenuitem>Fifth Wheel Assembly/a>/li>li idrmp-menu-item-585 class menu-item menu-item-type-post_type menu-item-object-page rmp-menu-item rmp-menu-sub-level-item rolenone>a hrefhttps://www.hitechfea.com/oil-tank-static-structural-analysis.html classrmp-menu-item-link rolemenuitem>Oil Tank Static Structural Analysis/a>/li>li idrmp-menu-item-586 class menu-item menu-item-type-post_type menu-item-object-page rmp-menu-item rmp-menu-sub-level-item rolenone>a hrefhttps://www.hitechfea.com/plastic-pin-stress-analysis.html classrmp-menu-item-link rolemenuitem>Plastic Pin Stress Analysis/a>/li>li idrmp-menu-item-587 class menu-item menu-item-type-post_type menu-item-object-page rmp-menu-item rmp-menu-sub-level-item rolenone>a hrefhttps://www.hitechfea.com/storage-frames-dynamics.html classrmp-menu-item-link rolemenuitem>Storage Frames Dynamics/a>/li>li idrmp-menu-item-588 class menu-item menu-item-type-post_type menu-item-object-page rmp-menu-item rmp-menu-sub-level-item rolenone>a hrefhttps://www.hitechfea.com/valve-body-fea-analysis.html classrmp-menu-item-link rolemenuitem>Valve Body FEA Analysis/a>/li>li idrmp-menu-item-589 class menu-item menu-item-type-post_type menu-item-object-page rmp-menu-item rmp-menu-sub-level-item rolenone>a hrefhttps://www.hitechfea.com/structural-optimization-of-breaker-plate-for-auto-screening-machine.html classrmp-menu-item-link rolemenuitem>Breaker Plate for Auto Machine/a>/li>li idrmp-menu-item-590 class menu-item menu-item-type-post_type menu-item-object-page rmp-menu-item rmp-menu-sub-level-item rolenone>a hrefhttps://www.hitechfea.com/seismic-qualification-of-industrial-pc-rack.html classrmp-menu-item-link rolemenuitem>Industrial PC Rack/a>/li>li idrmp-menu-item-591 class menu-item menu-item-type-post_type menu-item-object-page rmp-menu-item rmp-menu-sub-level-item rolenone>a hrefhttps://www.hitechfea.com/skid-accumulator-stress-analysis.html classrmp-menu-item-link rolemenuitem>Skid Accumulator Stress Analysis/a>/li>/ul>/li>li idrmp-menu-item-592 class menu-item menu-item-type-post_type menu-item-object-page rmp-menu-item rmp-menu-top-level-item rolenone>a hrefhttps://www.hitechfea.com/clients.html classrmp-menu-item-link rolemenuitem>Clients/a>/li>li idrmp-menu-item-606 class menu-item menu-item-type-post_type menu-item-object-page rmp-menu-item rmp-menu-top-level-item rolenone>a hrefhttps://www.hitechfea.com/fea-knowledgebase/ classrmp-menu-item-link rolemenuitem>Blog/a>/li>li idrmp-menu-item-593 class menu-item menu-item-type-post_type menu-item-object-page rmp-menu-item rmp-menu-top-level-item rolenone>a hrefhttps://www.hitechfea.com/about-us.html classrmp-menu-item-link rolemenuitem>About Us/a>/li>li idrmp-menu-item-594 class menu-item menu-item-type-post_type menu-item-object-page rmp-menu-item rmp-menu-top-level-item rolenone>a hrefhttps://www.hitechfea.com/contact-us.html classrmp-menu-item-link rolemenuitem>Contact Us/a>/li>li idrmp-menu-item-595 classfr requestaquote mobile-off menu-item menu-item-type-post_type menu-item-object-page rmp-menu-item rmp-menu-top-level-item rolenone>a hrefhttps://www.hitechfea.com/request-quote.html classrmp-menu-item-link rolemenuitem>Request Quote/a>/li>/ul>/div>/div>div idmv-grow-data data-settings{"floatingSidebar":{"stopSelector":false},"general":{"contentSelector":false,"show_count":{"content":false,"sidebar":true},"isTrellis":false,"license_last4":""},"post":null,"shareCounts":{"facebook":0,"linkedin":0},"shouldRun":true}>/div>script defer iddpsp-frontend-js-pro-js-extra srcdata:text/javascript;base64,Ci8qIDwhW0NEQVRBWyAqLwp2YXIgZHBzcF9hamF4X3NlbmRfc2F2ZV90aGlzX2VtYWlsID0geyJhamF4X3VybCI6Imh0dHBzOlwvXC93d3cuaGl0ZWNoZmVhLmNvbVwvd3AtYWRtaW5cL2FkbWluLWFqYXgucGhwIiwiZHBzcF90b2tlbiI6IjQ3NmQwYWViYzYifTsKLyogXV0+ICovCg>/script> script defer typetext/javascript data-noptimize data-cfasyncfalse srchttps://www.hitechfea.com/wp-content/cache/autoptimize/js/autoptimize_single_4a899caa7a79a369ffe0d0727cfa5500.js?ver1.34.7 iddpsp-frontend-js-pro-js>/script> script defer idppress-frontend-script-js-extra srcdata:text/javascript;base64,Ci8qIDwhW0NEQVRBWyAqLwp2YXIgcHBfYWpheF9mb3JtID0geyJhamF4dXJsIjoiaHR0cHM6XC9cL3d3dy5oaXRlY2hmZWEuY29tXC93cC1hZG1pblwvYWRtaW4tYWpheC5waHAiLCJjb25maXJtX2RlbGV0ZSI6IkFyZSB5b3Ugc3VyZT8iLCJkZWxldGluZ190ZXh0IjoiRGVsZXRpbmcuLi4iLCJkZWxldGluZ19lcnJvciI6IkFuIGVycm9yIG9jY3VycmVkLiBQbGVhc2UgdHJ5IGFnYWluLiIsIm5vbmNlIjoiMWVkNDdmNTJjOSIsImRpc2FibGVfYWpheF9mb3JtIjoiZmFsc2UiLCJpc19jaGVja291dCI6IjAiLCJpc19jaGVja291dF90YXhfZW5hYmxlZCI6IjAiLCJpc19jaGVja291dF9hdXRvc2Nyb2xsX2VuYWJsZWQiOiJ0cnVlIn07Ci8qIF1dPiAqLwo>/script> script defer typetext/javascript srchttps://www.hitechfea.com/wp-content/plugins/wp-user-avatar/assets/js/frontend.min.js?ver4.15.17 idppress-frontend-script-js>/script> script defer typetext/javascript srchttps://www.hitechfea.com/wp-content/plugins/lazy-loading-responsive-images/js/lazysizes.min.js?ver1713159716 idlazysizes-js>/script> script defer typetext/javascript srchttps://www.hitechfea.com/wp-content/plugins/lazy-loading-responsive-images/js/ls.unveilhooks.min.js?ver1713159716 idlazysizes-unveilhooks-js>/script> /body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]