Help
RSS
API
Feed
Maltego
Contact
Domain > umfer.us
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2024-11-19
3.168.73.110
(
ClassC
)
2024-12-01
18.161.34.60
(
ClassC
)
2024-12-29
3.167.99.50
(
ClassC
)
2026-02-12
3.169.252.23
(
ClassC
)
Port 80
HTTP/1.1 301 Moved PermanentlyServer: CloudFrontDate: Thu, 12 Feb 2026 10:24:44 GMTContent-Type: text/htmlContent-Length: 167Connection: keep-aliveLocation: https://umfer.us/X-Cache: Redirect from cloudfrontVia: 1.1 6957b6fac4a3f8180355a074ea5833e2.cloudfront.net (CloudFront)X-Amz-Cf-Pop: HIO52-P4X-Amz-Cf-Id: 2-I0jhdVvZa73qtigWaAxh01t55i_iaP8hzO4zhMbP-hhP__Tk4_dwLink: https://fonts.googleapis.com>; relpreconnect, https://fonts.gstatic.com>; relpreconnect, https://fonts.googleapis.com/css2?familyLato:wght@100;300;400;700&familyRaleway:wght@100..900&familyRoboto+Serif:opsz,wght@8..144,100..900&displayswap>; relpreload; asstyleVary: Origin html>head>title>301 Moved Permanently/title>/head>body>center>h1>301 Moved Permanently/h1>/center>hr>center>CloudFront/center>/body>/html>
Port 443
HTTP/1.1 200 OKContent-Type: text/html;charsetUTF-8Content-Length: 97330Connection: keep-aliveDate: Thu, 12 Feb 2026 10:24:45 GMTLast-Modified: Thu, 12 Feb 2026 10:21:03 GMTEtag: 3eb03ae5511a6c057cff0dd25c75fa16X-Amz-Server-Side-Encryption: AES256Accept-Ranges: bytesServer: AmazonS3Via: 1.1 11017c4db22106ac70e16ce75190a430.cloudfront.net (CloudFront)Link: https://fonts.googleapis.com>; relpreconnect, https://fonts.gstatic.com>; relpreconnect, https://fonts.googleapis.com/css2?familyLato:wght@100;300;400;700&familyRaleway:wght@100..900&familyRoboto+Serif:opsz,wght@8..144,100..900&displayswap>; relpreload; asstyleVary: OriginServer-Timing: cdn-upstream-layer;descREC,cdn-upstream-dns;dur0,cdn-upstream-connect;dur111,cdn-upstream-fbl;dur237,cdn-cache-miss,cdn-pop;descHIO52-P4,cdn-rid;desc6ev8beeAXeWBwc_VouV9KiHJmmceIkPN8VugkJHytHvbICtulKva4A,cdn-downstream-fbl;dur343Set-Cookie: nonce30ozgsueth53085jbp249v; Path/X-Cache: Miss from cloudfrontX-Amz-Cf-Pop: HIO52-P4X-Amz-Cf-Id: 6ev8beeAXeWBwc_VouV9KiHJmmceIkPN8VugkJHytHvbICtulKva4A !DOCTYPE html>head> meta nameviewport contentwidthdevice-width, initial-scale1> meta namedescription contentIve been writing code since year 15. I can 0-to-1 an entire business. Ive never failed to deliver.> meta nametwitter:creator content@aumfer> meta propertyog:title contentAnthony Umfer - Software Developer> meta propertyog:image contenthttps://umfer.us/image.jpg> title>umfer.us/title>/head>footer idрезюме itemtypehttps://schema.org/ProfilePage itemscope>link relpreconnect hrefhttps://fonts.googleapis.com>link relpreconnect hrefhttps://fonts.gstatic.com crossorigin>link hrefhttps://fonts.googleapis.com/css2?familyLato:wght@100;300;400;700&familyRaleway:wght@100..900&familyRoboto+Serif:opsz,wght@8..144,100..900&displayswap relstylesheet>style> body { margin: 0; background: linear-gradient(to right, #fff 64%, #eee 100%); } h1,h2,h3,h4,h5,h6 { font-family: Raleway, sans-serif; } h1 a,h2 a,h3 a,h4 a,h5 a,h6 a { text-decoration: none; color: inherit; } h1 { font-size: 24pt; font-weight: 900; margin-bottom: 0; } h2 { font-size: 16pt; font-weight: 700; color: #ff6601; margin-top: 0; } h3 { font-size: 12pt; font-weight: 600; } h4 { font-family: Lato, sans-serif; font-size: 11pt; margin-bottom: 0; } h5 { font-family: Lato, sans-serif; font-size: 10pt; font-weight: 400; margin-top: 0; margin-bottom: 0.25em; } section,aside { font-family: Lato, sans-serif; } p { font-family: Roboto Serif, serif; } ul,ol,dl { font-family: Roboto Serif, serif; font-size: 11pt; font-weight: 300; list-style: none; padding-left: 0; line-height: 1.2; } dl dt,dd { display: inline; } dl dt:before { content: ; display: block; } dl dd { font-family: Raleway, sans-serif; font-size: 10pt; font-weight: 200; margin-left: 1em; } dl ul,ol { font: inherit; display: inline; } dl li { display: inline; } a { color: #3c78d8; line-height: 23px; display: inline-flex; align-items: start; } small { line-height: 23px; } footer { display: flex; justify-content: space-around; } section,aside { padding: 1em; } svg,img { margin-right: 0.7em; margin-top: 0.3em; filter: saturate(20%); display: block; } svg:hover,img:hover { filter: saturate(80%) } ol { font-family: Lato, sans-serif; font-size: 9pt; color: #666; } aside { max-width: 39%; } section { max-width: 61%; } hide { display: none; } data { visibility: hidden; } @media(width 412px) { hide-mobile { display: none; } show-mobile { display: inherit; } } @media(width 480px) and (width > 412px) { hide-compact { display: none; } show-compact { display: inherit; } } @media(width > 480px) { hide-desktop { display: none; } show-desktop { display: inherit; } } @media(width 640px) { dd { display: none; } } @media not print { print { display: none; } } @media not screen { screen { display: none; } } itemproptelephone span { display: none; } itemproptelephone::after { content: 610‑331‑5720 } .overlay { border:1px solid #eee;background: rgb(255 255 255 / 66.67%); }/style>aside classoverlay itempropmainEntity itemscope itemtypehttps://schema.org/Person> h1>a itempropname hrefhttps://umfer.us>Anthony Umfer/a>/h1> h2>a itempropjobTitle hrefhttps://umfer.us>Software Developer/a>/h2> small>EST US /small> span itemproptelephone value+16103315720>span>610-331-xxxx/span>/span>br /> mail-to>a hrefmailto:aumfer@gmail.com>svg width1em hide-compact xmlnshttp://www.w3.org/2000/svg viewBox0 0 512 512>!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc. -->path dM64 112c-8.8 0-16 7.2-16 16l0 22.1L220.5 291.7c20.7 17 50.4 17 71.1 0L464 150.1l0-22.1c0-8.8-7.2-16-16-16L64 112zM48 212.2L48 384c0 8.8 7.2 16 16 16l384 0c8.8 0 16-7.2 16-16l0-171.8L322 328.8c-38.4 31.5-93.7 31.5-132 0L48 212.2zM0 128C0 92.7 28.7 64 64 64l384 0c35.3 0 64 28.7 64 64l0 256c0 35.3-28.7 64-64 64L64 448c-35.3 0-64-28.7-64-64L0 128z/>/svg>span itempropemail hide-mobile>aumfer@gmail.com/span>/a>/mail-to>br/> a hrefhttps://github.com/aumfer>svg width1em hide-compact xmlnshttp://www.w3.org/2000/svg viewBox0 0 496 512>!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc. -->path dM165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z/>/svg>span hide-mobile>github.com/aumfer/span>/a>br /> a hrefhttps://www.linkedin.com/in/anthony-umfer/>svg width1em hide-compact xmlnshttp://www.w3.org/2000/svg viewBox0 0 448 512>!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc. -->path dM416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z/>/svg>span hide-mobile>in/anthony-umfer/a>/span>br /> flash-message screen>/flash-message> span screen> h3>Languages/h3> ul> li>C#/li> li>JS/TS/li> li>C/C++/li> li>SQL/li> li>Bash/li> /ul> h3>Infrastructure/h3> ul> li>CloudFlare/li> li>AWS/li> li>Terraform/li> li>Docker/li> li>Packer/li> /ul> h3>Platforms/h3> ul> li>ASP.NET/li> li>NodeJS/li> li>React/li> li>Webpack/li> li>DOM/li> /ul> /span> span print> h3>Platforms/h3> ul> li>.NET Core/li> li>AWS/li> li>React Webpack/li> li>NodeJS/li> /ul> h3>Languages/h3> ul> li>C#/li> li>JavaScript/li> li>TypeScript/li> li>Java/li> li>Bash/li> li>GLSL/li> li>C/C++/li> /ul> h3>Tools/h3> dl> dt>NoSQL/dt> dd> ul> li>DynamoDB/li> li>Apache/li> /ul> /dd> dt>SQL/dt> dd> ul> li>MSSQL/li> li>MySQL/li> li>Postgres/li> /ul> /dd> dt>Queues/dt> dd> ul> li>RabbitMQ/li> li>SQS/li> /ul> /dd> dt>Containers/dt> dd> ul> li>ECS/li> li>Docker/li> /ul> /dd> dt>Compute/dt> dd> ul> li>EC2/li> li>Lambda/li> li>OnPrem/li> /ul> /dd> dt>Cache/dt> dd> ul> li>CloudFront/li> li>CloudFlare/li> /ul> /dd> dt>Elasticsearch/dt> dd>/dd> dt>CI/dt> dd> ul> li>Git Actions/li> li>AWS CodeBuild/li> /ul> /dd> dt>CD/dt> dd> ul> li>Terraform/li> li>Serverless/li> /ul> /dd> /dl> h3>Education/h3> h4>Drexel University/h4> h5>Computer Science/h5> ol hide-mobile> li>2006 - GlaxoSmithKline/li> li>2007 - Delphic Sage/li> li>2008 - InterviewStream/li> /ol> /span>/aside>section classoverlay> span screen styledisplay:flex;margin-bottom:2em;justify-content:end;> a language hrefhttps://api.login.yahoo.com/oauth2/request_auth?response_typecode&scopeemail+profile&redirect_urihttps://auth.umfer.us/api.login.yahoo.com&client_iddj0yJmk9Y1M1N29FTExTUzRoJmQ9WVdrOWVIWktOMU15Y1hnbWNHbzlNQT09JnM9Y29uc3VtZXJzZWNyZXQmc3Y9MCZ4PWQ5> svg yahoo-profile height1em xmlnshttp://www.w3.org/2000/svg viewBox0 0 512 512>!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc. -->path dM223.69,141.06,167,284.23,111,141.06H14.93L120.76,390.19,82.19,480h94.17L317.27,141.06Zm105.4,135.79a58.22,58.22,0,1,0,58.22,58.22A58.22,58.22,0,0,0,329.09,276.85ZM394.65,32l-93,223.47H406.44L499.07,32Z/>/svg> /a> a hrefhttps://accounts.google.com/o/oauth2/v2/auth?response_typecode&scopeemail&redirect_urihttps://auth.umfer.us/accounts.google.com&client_id263268479128-1eq6drfrvhhg0r1rp3c0k3c3b5ujb3ui.apps.googleusercontent.com> svg google-profile height1em xmlnshttp://www.w3.org/2000/svg viewBox0 0 488 512>!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc. -->path dM488 261.8C488 403.3 391.1 504 248 504 110.8 504 0 393.2 0 256S110.8 8 248 8c66.8 0 123 24.5 166.3 64.9l-67.5 64.9C258.5 52.6 94.3 116.6 94.3 256c0 86.5 69.1 156.6 153.7 156.6 98.2 0 135-70.4 140.8-106.9H248v-85.3h236.1c2.3 12.7 3.9 24.9 3.9 41.4z/>/svg> /a> a hrefhttps://discord.com/oauth2/authorize?response_typecode&scopeemail+identify&redirect_urihttps://auth.umfer.us/discord.com&client_id1360353023993577473> svg discord-profile height1em xmlnshttp://www.w3.org/2000/svg viewBox0 0 640 512>!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc. -->path dM524.531,69.836a1.5,1.5,0,0,0-.764-.7A485.065,485.065,0,0,0,404.081,32.03a1.816,1.816,0,0,0-1.923.91,337.461,337.461,0,0,0-14.9,30.6,447.848,447.848,0,0,0-134.426,0,309.541,309.541,0,0,0-15.135-30.6,1.89,1.89,0,0,0-1.924-.91A483.689,483.689,0,0,0,116.085,69.137a1.712,1.712,0,0,0-.788.676C39.068,183.651,18.186,294.69,28.43,404.354a2.016,2.016,0,0,0,.765,1.375A487.666,487.666,0,0,0,176.02,479.918a1.9,1.9,0,0,0,2.063-.676A348.2,348.2,0,0,0,208.12,430.4a1.86,1.86,0,0,0-1.019-2.588,321.173,321.173,0,0,1-45.868-21.853,1.885,1.885,0,0,1-.185-3.126c3.082-2.309,6.166-4.711,9.109-7.137a1.819,1.819,0,0,1,1.9-.256c96.229,43.917,200.41,43.917,295.5,0a1.812,1.812,0,0,1,1.924.233c2.944,2.426,6.027,4.851,9.132,7.16a1.884,1.884,0,0,1-.162,3.126,301.407,301.407,0,0,1-45.89,21.83,1.875,1.875,0,0,0-1,2.611,391.055,391.055,0,0,0,30.014,48.815,1.864,1.864,0,0,0,2.063.7A486.048,486.048,0,0,0,610.7,405.729a1.882,1.882,0,0,0,.765-1.352C623.729,277.594,590.933,167.465,524.531,69.836ZM222.491,337.58c-28.972,0-52.844-26.587-52.844-59.239S193.056,219.1,222.491,219.1c29.665,0,53.306,26.82,52.843,59.239C275.334,310.993,251.924,337.58,222.491,337.58Zm195.38,0c-28.971,0-52.843-26.587-52.843-59.239S388.437,219.1,417.871,219.1c29.667,0,53.307,26.82,52.844,59.239C470.715,310.993,447.538,337.58,417.871,337.58Z/>/svg> /a> a hrefhttps://steamcommunity.com/openid/login?openid.modecheckid_setup&openid.claimed_idhttp://specs.openid.net/auth/2.0/identifier_select&openid.identityhttp://specs.openid.net/auth/2.0/identifier_select&openid.return_tohttps://auth.umfer.us/steamcommunity.com&openid.realmhttps://auth.umfer.us&openid.nshttp://specs.openid.net/auth/2.0> svg steam-profile height1em xmlnshttp://www.w3.org/2000/svg viewBox0 0 496 512>!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc. -->path dM496 256c0 137-111.2 248-248.4 248-113.8 0-209.6-76.3-239-180.4l95.2 39.3c6.4 32.1 34.9 56.4 68.9 56.4 39.2 0 71.9-32.4 70.2-73.5l84.5-60.2c52.1 1.3 95.8-40.9 95.8-93.5 0-51.6-42-93.5-93.7-93.5s-93.7 42-93.7 93.5v1.2L176.6 279c-15.5-.9-30.7 3.4-43.5 12.1L0 236.1C10.2 108.4 117.1 8 247.6 8 384.8 8 496 119 496 256zM155.7 384.3l-30.5-12.6a52.79 52.79 0 0 0 27.2 25.8c26.9 11.2 57.8-1.6 69-28.4 5.4-13 5.5-27.3.1-40.3-5.4-13-15.5-23.2-28.5-28.6-12.9-5.4-26.7-5.2-38.9-.6l31.5 13c19.8 8.2 29.2 30.9 20.9 50.7-8.3 19.9-31 29.2-50.8 21zm173.8-129.9c-34.4 0-62.4-28-62.4-62.3s28-62.3 62.4-62.3 62.4 28 62.4 62.3-27.9 62.3-62.4 62.3zm.1-15.6c25.9 0 46.9-21 46.9-46.8 0-25.9-21-46.8-46.9-46.8s-46.9 21-46.9 46.8c.1 25.8 21.1 46.8 46.9 46.8z/>/svg> /a> a hrefhttps://www.facebook.com/v22.0/dialog/oauth?response_typecode&scopeemail+public_profile&redirect_urihttps://auth.umfer.us/graph.facebook.com&client_id1231717094967659> svg facebook-profile height1em xmlnshttp://www.w3.org/2000/svg viewBox0 0 512 512>!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc. -->path dM512 256C512 114.6 397.4 0 256 0S0 114.6 0 256C0 376 82.7 476.8 194.2 504.5V334.2H141.4V256h52.8V222.3c0-87.1 39.4-127.5 125-127.5c16.2 0 44.2 3.2 55.7 6.4V172c-6-.6-16.5-1-29.6-1c-42 0-58.2 15.9-58.2 57.2V256h83.6l-14.4 78.2H287V510.1C413.8 494.8 512 386.9 512 256h0z/>/svg> /a> a code-challenge hrefhttps://x.com/i/oauth2/authorize?response_typecode&scopeusers.email+users.read+tweet.read&redirect_urihttps://auth.umfer.us/x.com&client_idWEVGNElwU0JEMjZNVG1qQmJFMHk6MTpjaQ> svg twitter-profile height1em xmlnshttp://www.w3.org/2000/svg viewBox0 0 512 512>!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc. -->path dM459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z/>/svg> /a> a hrefhttps://www.amazon.com/ap/oa?response_typecode&scopeprofile&redirect_urihttps://auth.umfer.us/www.amazon.com&client_idamzn1.application-oa2-client.603bac300d3b457baaaf6187ae780987> svg amazon-profile height1em xmlnshttp://www.w3.org/2000/svg viewBox0 0 448 512>!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc. -->path dM257.2 162.7c-48.7 1.8-169.5 15.5-169.5 117.5 0 109.5 138.3 114 183.5 43.2 6.5 10.2 35.4 37.5 45.3 46.8l56.8-56S341 288.9 341 261.4V114.3C341 89 316.5 32 228.7 32 140.7 32 94 87 94 136.3l73.5 6.8c16.3-49.5 54.2-49.5 54.2-49.5 40.7-.1 35.5 29.8 35.5 69.1zm0 86.8c0 80-84.2 68-84.2 17.2 0-47.2 50.5-56.7 84.2-57.8v40.6zm136 163.5c-7.7 10-70 67-174.5 67S34.2 408.5 9.7 379c-6.8-7.7 1-11.3 5.5-8.3C88.5 415.2 203 488.5 387.7 401c7.5-3.7 13.3 2 5.5 12zm39.8 2.2c-6.5 15.8-16 26.8-21.2 31-5.5 4.5-9.5 2.7-6.5-3.8s19.3-46.5 12.7-55c-6.5-8.3-37-4.3-48-3.2-10.8 1-13 2-14-.3-2.3-5.7 21.7-15.5 37.5-17.5 15.7-1.8 41-.8 46 5.7 3.7 5.1 0 27.1-6.5 43.1z/>/svg> /a> a hrefhttps://id.twitch.tv/oauth2/authorize?response_typecode&scopeuser:read:email+openid&claims%7B%22id_token%22%3A%7B%22email%22%3Anull%2C%22email_verified%22%3Anull%7D%2C%22userinfo%22%3A%7B%22picture%22%3Anull%7D%7D&redirect_urihttps://auth.umfer.us/id.twitch.tv&client_id5smgvp7uiuggn4ljd7vqswhdzzkakl> svg twitch-profile height1em xmlnshttp://www.w3.org/2000/svg viewBox0 0 512 512>!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc. -->path dM391.17,103.47H352.54v109.7h38.63ZM285,103H246.37V212.75H285ZM120.83,0,24.31,91.42V420.58H140.14V512l96.53-91.42h77.25L487.69,256V0ZM449.07,237.75l-77.22,73.12H294.61l-67.6,64v-64H140.14V36.58H449.07Z/>/svg> /a> a hide hrefhttps://www.tiktok.com/v2/auth/authorize?response_typecode&scopeuser.info.basic&redirect_urihttps://auth.umfer.us/www.tiktok.com&client_keyawkklyjdyjawdm94> svg tiktok-profile height1em xmlnshttp://www.w3.org/2000/svg viewBox0 0 448 512>!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc. -->path dM448,209.91a210.06,210.06,0,0,1-122.77-39.25V349.38A162.55,162.55,0,1,1,185,188.31V278.2a74.62,74.62,0,1,0,52.23,71.18V0l88,0a121.18,121.18,0,0,0,1.86,22.17h0A122.18,122.18,0,0,0,381,102.39a121.43,121.43,0,0,0,67,20.14Z/>/svg> /a> /span> script> //https://stackoverflow.com/a/13403498 function generateQuickGuid() { return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15); } document.querySelectorAll(acode-challenge).forEach(function pkce(e) { const challenge generateQuickGuid() + - + generateQuickGuid() + - + generateQuickGuid() e.href + &code_challenge_methodplain&code_challenge + challenge + &state + challenge; }); document.querySelectorAll(alanguage).forEach(function addLanguage(e) { e.href + `&language${navigator.language}` }) /script> script> if (document.cookie.includes(Bearer)) { let req new XMLHttpRequest() req.responseType json req.withCredentials true req.addEventListener(load, function getProfile() { const profile req.response; console.log(profile) window.profile profile; const emails {} if (profile.facebook) { const facebook document.createElement(img) facebook.toggleAttribute(facebook-profile, true) facebook.style.height 1em facebook.src profile.facebook.picture.data.url document.querySelector(facebook-profile).replaceWith(facebook) if (!emailsprofile.facebook.email) { emailsprofile.facebook.email facebook } else { emailsprofile.facebook.email.push(facebook) } } if (profile.twitch) { const twitch document.createElement(img) twitch.toggleAttribute(twitch-profile, true) twitch.style.height 1em twitch.src profile.twitch.picture document.querySelector(twitch-profile).replaceWith(twitch) } if (profile.yahoo) { const yahoo document.createElement(img) yahoo.toggleAttribute(yahoo-profile, true) yahoo.style.height 1em yahoo.src profile.yahoo.picture document.querySelector(yahoo-profile).replaceWith(yahoo) if (!emailsprofile.yahoo.email) { emailsprofile.yahoo.email yahoo } else { emailsprofile.yahoo.email.push(yahoo) } } if (profile.google) { const google document.createElement(img) google.toggleAttribute(google-profile, true) google.style.height 1em google.src profile.google.picture document.querySelector(google-profile).replaceWith(google) if (!emailsprofile.google.email) { emailsprofile.google.email google } else { emailsprofile.google.email.push(google) } } if (profile.discord) { const discord document.createElement(img) discord.toggleAttribute(discord-profile, true) discord.style.height 1em discord.src `https://cdn.discordapp.com/avatars/${profile.discord.id}/${profile.discord.avatar}.png` document.querySelector(discord-profile).replaceWith(discord) if (!emailsprofile.discord.email) { emailsprofile.discord.email discord } else { emailsprofile.discord.email.push(discord) } } if (profile.steam) { const steam document.createElement(img) steam.toggleAttribute(steam-profile, true) steam.style.height 1em steam.src profile.steam.response.players0.avatar document.querySelector(steam-profile).replaceWith(steam) } if (profile.twitter) { const twitter document.createElement(img) twitter.toggleAttribute(twitter-profile, true) twitter.style.height 1em twitter.src profile.twitter.data.profile_image_url document.querySelector(twitter-profile).replaceWith(twitter) if (!emailsprofile.twitter.data.confirmed_email) { emailsprofile.twitter.data.confirmed_email twitter } else { emailsprofile.twitter.data.confirmed_email.push(twitter) } } profile.emails emails }) req.open(POST, `https://auth.umfer.us`) req.send() } /script> span print> img srcsig.jpg width50% /> hr /> /span> span screen styledisplay: flex;margin-bottom:1em;> a hrefhttps://umfer.us/Profile.pdf aria-labelResume (PDF)>svg height2em xmlnshttp://www.w3.org/2000/svg viewBox0 0 512 512>!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc. -->path dM64 464l48 0 0 48-48 0c-35.3 0-64-28.7-64-64L0 64C0 28.7 28.7 0 64 0L229.5 0c17 0 33.3 6.7 45.3 18.7l90.5 90.5c12 12 18.7 28.3 18.7 45.3L384 304l-48 0 0-144-80 0c-17.7 0-32-14.3-32-32l0-80L64 48c-8.8 0-16 7.2-16 16l0 384c0 8.8 7.2 16 16 16zM176 352l32 0c30.9 0 56 25.1 56 56s-25.1 56-56 56l-16 0 0 32c0 8.8-7.2 16-16 16s-16-7.2-16-16l0-48 0-80c0-8.8 7.2-16 16-16zm32 80c13.3 0 24-10.7 24-24s-10.7-24-24-24l-16 0 0 48 16 0zm96-80l32 0c26.5 0 48 21.5 48 48l0 64c0 26.5-21.5 48-48 48l-32 0c-8.8 0-16-7.2-16-16l0-128c0-8.8 7.2-16 16-16zm32 128c8.8 0 16-7.2 16-16l0-64c0-8.8-7.2-16-16-16l-16 0 0 96 16 0zm80-112c0-8.8 7.2-16 16-16l48 0c8.8 0 16 7.2 16 16s-7.2 16-16 16l-32 0 0 32 32 0c8.8 0 16 7.2 16 16s-7.2 16-16 16l-32 0 0 48c0 8.8-7.2 16-16 16s-16-7.2-16-16l0-64 0-64z/>/svg>/a> a hrefhttps://stratz.com/players/2986703 aria-labelStratz.com Profile>svg height2em stylemargin-right: -5em; xmlns:dchttp://purl.org/dc/elements/1.1/ xmlns:cchttp://creativecommons.org/ns# xmlns:rdfhttp://www.w3.org/1999/02/22-rdf-syntax-ns# xmlns:svghttp://www.w3.org/2000/svg xmlnshttp://www.w3.org/2000/svg xmlns:xlinkhttp://www.w3.org/1999/xlink viewBox0 0 57.483463 13.348072 version1.1 idsvg8> defs iddefs2> linearGradient idlinearGradient922> stop idstop918 offset0 stylestop-color:#0000ff;stop-opacity:1; /> stop idstop920 offset1 stylestop-color:#0000ff;stop-opacity:0; /> /linearGradient> radialGradient gradientUnitsuserSpaceOnUse gradientTransformmatrix(0.26458333,0,0,0.26245004,-4.61776,-4.795903) r25.429729 fy43.703316 fx42.882683 cy43.703316 cx42.882683 idradialGradient924 xlink:href#linearGradient922 /> /defs> path idpath875 dM 2.4267712,7.9107662 1.5338024,10.341625 3.0386201,11.631469 5.3702607,10.755037 Z stylefill:none;stroke:#0000ff;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1 /> path idpath894 dm 7.80112,2.7679277 2.480469,-0.686263 0.942578,0.6614583 -0.42168,2.3399088 z stylefill:none;stroke:#0000ff;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1 /> path idpath900 dM 5.5148518,13.174876 5.3160701,13.00284 4.9732778,12.976285 c -0.298486,-0.02312 -0.3677634,-0.03663 -0.5359927,-0.104494 l -0.1932003,-0.07794 -0.16559,0.06903 c -0.1402689,0.05848 -0.2075715,0.07107 -0.4401365,0.08232 l -0.2745465,0.01329 -0.035633,-0.08528 c -0.019598,-0.04691 -0.04723,-0.08528 -0.061404,-0.08528 -0.014174,0 -0.1568371,0.0419 -0.3170275,0.09311 l -0.291256,0.09311 -0.1145235,-0.05803 c -0.1418847,-0.0719 -0.150263,-0.07184 -0.3952973,0.0029 l -0.1997808,0.06094 -0.1928635,-0.04047 c -0.205822,-0.04319 -0.2714384,-0.03954 -0.88847459,0.04952 l -0.23902352,0.0345 -0.12346067,-0.08513 c -0.11157055,-0.07693 -0.1342509,-0.08387 -0.23549662,-0.07201 -0.10192226,0.01194 -0.11435953,0.008 -0.13777436,-0.04336 -0.0208942,-0.04586 -0.0155945,-0.07979 0.0281493,-0.180253 0.0502134,-0.115325 0.0562255,-0.180242 0.0881742,-0.952067 0.0298559,-0.721267 0.029949,-0.859427 7.1437e-4,-1.069151 -0.0378166,-0.271347 -0.0377685,-0.271442 0.12267301,-0.242038 0.0570008,0.01044 0.10775579,0.01491 0.11278923,0.0099 0.005032,-0.005 0.0212857,-0.364513 0.0361177,-0.7989432 0.0246406,-0.7217151 0.0179229,-0.9412409 -0.028829,-0.9422305 -0.009043,-1.87e-4 -0.0554879,-0.034393 -0.10321237,-0.076005 L 0.30160053,8.4965878 0.22826253,8.0756383 C 0.1879268,7.844116 0.14923201,7.5425082 0.142274,7.405399 0.1306535,7.1764355 0.133855,7.149263 0.1815144,7.0721473 0.2100545,7.0259683 0.241102,6.9881853 0.250509,6.9881853 c 0.009406,0 0.0480126,0.032533 0.0857904,0.072295 0.037778,0.039762 0.0993555,0.094328 0.13683906,0.1212572 l 0.0681522,0.048962 -0.0156713,-0.4154167 C 0.51249064,6.4672831 0.50192583,6.3812229 0.46052859,6.2849894 0.43261346,6.2200988 0.41699246,6.147618 0.42462913,6.1184154 0.43373873,6.0835801 0.40786778,6.0118632 0.34530811,5.8985335 L 0.25246793,5.7303484 0.28390017,5.4547687 C 0.30948802,5.2304391 0.3098796,5.1451393 0.28601683,4.9960985 0.25133631,4.7795052 0.17723075,4.5469947 0.09729616,4.4039758 L 0.03973844,4.3009939 0.0876857,3.9258885 0.13563323,3.5507834 0.08601115,3.345979 0.03638908,3.1411746 0.09524167,2.9207552 0.15409426,2.7003359 0.10900291,2.569964 C 0.01517187,2.2986717 0.01332799,2.2602632 0.08629637,2.0969584 0.2137324,1.8117492 0.23143303,1.4647058 0.14396628,0.96626889 0.11405328,0.79580738 0.0959071,0.74666394 0.04851493,0.70776807 -0.03513865,0.63911161 -0.00832895,0.52906769 0.11134527,0.44987102 c 0.0701204,-0.0464037 0.085865,-0.0696955 0.0773213,-0.11438757 -0.0097,-0.0507392 -0.003207,-0.0557593 0.067718,-0.0523663 0.0431451,0.002064 0.25551447,-0.0165629 0.47193146,-0.0413954 l 0.39348597,-0.045148 0.4601062,0.0659355 0.4601062,0.0659355 0.5921959,-0.0266949 0.5921963,-0.0266946 0.1327724,0.0794904 0.1327726,0.0794904 0.4639411,0.0152135 C 4.565181,0.46923085 4.8164772,0.42765687 5.17342,0.24782487 5.3220386,0.17294938 5.5034207,0.1049467 5.6626261,0.06441518 L 5.9156418,5.1946266e-7 6.2048454,0.09022634 6.4940485,0.18045217 6.7391516,0.0983763 6.9842545,0.01630017 7.2609994,0.10218551 c 0.1882815,0.0584314 0.3791982,0.14130152 0.5972558,0.25924721 l 0.3205113,0.17336188 0.3791471,-0.006432 0.3791468,-0.006432 0.018084,-0.058465 c 0.00995,-0.0321559 0.040198,-0.13476234 0.067226,-0.22801447 l 0.049146,-0.16954606 h 0.2764523 c 0.203913,0 0.3770053,0.01810015 0.6596663,0.06897873 0.210768,0.0379383 0.492252,0.0862076 0.625519,0.10726552 l 0.242305,0.0382865 0.133129,-0.0597448 c 0.08451,-0.0379246 0.212464,-0.0687321 0.350345,-0.0843515 0.19494,-0.0220821 0.230785,-0.0198781 0.349535,0.0215 0.07278,0.0253603 0.237556,0.0626253 0.36618,0.0828138 0.206112,0.0323506 0.271322,0.0328882 0.549573,0.004532 l 0.315712,-0.0321752 0.175395,0.12594008 c 0.09647,0.0692671 0.191718,0.13877475 0.211666,0.15446163 0.02129,0.0167428 0.04713,0.0997482 0.06256,0.20097829 l 0.02629,0.17245674 -0.129456,0.23382284 c -0.101986,0.1842053 -0.122705,0.2381004 -0.09764,0.2539813 0.0175,0.011086 0.04482,0.02032 0.06072,0.020516 0.0159,1.963e-4 0.05799,0.044289 0.09355,0.097983 l 0.06464,0.097625 0.0075,0.6916557 c 0.0073,0.672844 -0.0281,2.0998393 -0.05269,2.1244281 -0.0067,0.00673 -0.0959,0.00249 -0.19816,-0.00941 l -0.185919,-0.021653 -0.0279,0.1478706 c -0.01535,0.081329 -0.02138,0.188633 -0.01342,0.2384538 0.01239,0.077468 9.52e-4,0.1140636 -0.07902,0.2527626 -0.05143,0.089199 -0.0935,0.1701357 -0.0935,0.1798602 0,0.029774 0.140696,0.2038293 0.286492,0.3544195 l 0.138369,0.1429194 -0.05121,0.1719609 -0.05121,0.171961 0.06458,0.4217813 c 0.07436,0.4856958 0.07082,0.5350912 -0.0734,1.0220113 -0.06472,0.2185154 -0.07713,0.2873004 -0.05438,0.3013633 0.01622,0.010022 0.100021,0.025305 0.186233,0.033964 l 0.156748,0.015743 0.01526,0.5767245 c 0.0814,3.0770118 0.08736,3.4813288 0.05952,4.0378648 -0.01544,0.308696 -0.03107,0.564704 -0.03472,0.568905 -0.0037,0.0042 -0.190547,-0.073 -0.415324,-0.171554 l -0.408684,-0.179194 -0.183919,0.07902 -0.183918,0.07902 -0.02058,0.128517 -0.02058,0.128517 -0.353599,0.07589 -0.353599,0.07589 -0.245554,-0.09031 c -0.241603,-0.08886 -0.248465,-0.08994 -0.426528,-0.06716 -0.152561,0.01951 -0.202547,0.01662 -0.318387,-0.01846 l -0.137414,-0.0416 -0.19532,0.08819 -0.1953209,0.08819 -0.386656,0.01012 c -0.212661,0.0056 -0.48137,3.97e-4 -0.597131,-0.01148 -0.2502776,-0.02568 -0.8182705,0.02951 -1.2518067,0.121644 -0.2452928,0.05213 -0.2944805,0.05541 -0.5457354,0.03646 C 7.0148742,13.3146 6.7573356,13.287843 6.5944457,13.266594 L 6.2982822,13.22796 6.0320458,13.28858 C 5.8856159,13.32192 5.7540693,13.34869 5.7397199,13.34806 5.7253719,13.347425 5.6241782,13.2695 5.5148484,13.17488 Z M 4.3104685,11.282124 C 5.0050352,11.02102 5.568055,10.797916 5.561624,10.786338 5.5450781,10.75655 2.407867,7.7260081 2.386781,7.7194433 2.3772348,7.716472 2.1499265,8.313422 1.8816523,9.0460011 l -0.4877716,1.3319619 0.066822,0.05686 c 0.036752,0.03127 0.3983198,0.341701 0.8034837,0.689844 0.4051639,0.348143 0.7471852,0.632809 0.7600476,0.632592 0.012861,-2.11e-4 0.5916679,-0.214027 1.2862346,-0.475132 z M 11.875627,10.045916 C 12.201195,9.2580975 12.472023,8.5968156 12.477468,8.5764012 12.484745,8.549115 11.172271,7.6514716 7.52225,5.1873679 4.7914352,3.3438142 2.5461461,1.8354519 2.5327188,1.8354519 c -0.029291,0 -1.4407266,0.6373913 -1.4698265,0.6637602 -0.011163,0.010115 0.00323,0.03241 0.031979,0.049544 0.028752,0.017134 1.972011,2.0332935 4.3183539,4.4803549 l 4.2660784,4.449202 h 0.8021914 0.802191 z M 11.116176,4.018153 c 0.123185,-0.6881355 0.22877,-1.2674103 0.234635,-1.2872776 0.0075,-0.025556 -0.142445,-0.1435446 -0.51283,-0.4034099 -0.287922,-0.2020083 -0.533106,-0.3672877 -0.544853,-0.3672877 -0.02542,0 -2.7266452,0.7469034 -2.736362,0.7566205 -0.00369,0.00369 0.7429735,0.5853506 1.6592444,1.2925866 0.9162706,0.707236 1.6682526,1.2800428 1.6710706,1.2729038 0.0028,-0.00714 0.105911,-0.576 0.229095,-1.2641357 z styleopacity:1;fill:#9b3425;fill-opacity:1;stroke:url(#radialGradient924);stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0 /> path idpath2430 dM 5.5094876,13.166163 5.3154629,13.000966 5.053459,12.979353 C 4.7262784,12.952361 4.5737694,12.92238 4.3891471,12.848761 l -0.145061,-0.05784 -0.1546661,0.06188 c -0.1323605,0.05295 -0.4562806,0.10166 -0.7018491,0.105537 -0.013258,2.11e-4 -0.036013,-0.03117 -0.050567,-0.06972 -0.014555,-0.03856 -0.042817,-0.07638 -0.062808,-0.08405 -0.019992,-0.0077 -0.1684686,0.02586 -0.3299518,0.07452 l -0.2936055,0.08846 -0.1053682,-0.05119 c -0.1334585,-0.06484 -0.1905127,-0.06421 -0.4132866,0.0045 -0.1693669,0.05226 -0.1896404,0.05376 -0.3274052,0.0242 -0.2021541,-0.04337 -0.3726632,-0.0402 -0.7542228,0.01399 -0.41718659,0.05925 -0.42532332,0.05889 -0.54791959,-0.02418 -0.0823399,-0.05579 -0.12782735,-0.06973 -0.22756892,-0.06973 -0.11346894,0 -0.12597606,-0.0052 -0.13933408,-0.05847 -0.00844,-0.03363 0.001826,-0.0997 0.0241538,-0.155518 0.06198,-0.154903 0.0868505,-0.53327 0.0943065,-1.43473 l 0.006964,-0.841899 0.11693313,0.0078 0.11693314,0.0078 0.0177694,-0.4872158 c 0.009774,-0.2679687 0.0188542,-0.6537958 0.0201824,-0.857394 l 0.002408,-0.3701777 -0.0624994,-0.045555 C 0.30148914,8.5050245 0.30976716,8.5232083 0.23866568,8.1157619 0.20182536,7.904649 0.16517051,7.5947878 0.15721026,7.4271814 0.14306299,7.1293243 0.14399961,7.121 0.19864375,7.0585827 l 0.0559064,-0.063859 0.13944097,0.1198242 c 0.0766927,0.065904 0.14320811,0.1085233 0.14781239,0.094711 C 0.562703,7.1465593 0.5004603,6.3910447 0.46661295,6.2965824 0.44644641,6.2403002 0.42994567,6.1629115 0.42994567,6.1246069 c 0,-0.038305 -0.0382278,-0.1423929 -0.0849508,-0.2313069 L 0.26004375,5.731638 0.28833114,5.4439576 C 0.32575751,5.0633301 0.27840133,4.7836365 0.11939628,4.4461758 L 0.04777198,4.2941663 0.09323481,3.9171837 0.13869789,3.5402009 0.08956159,3.3442246 0.04042556,3.1482482 0.09779252,2.9294397 0.15515921,2.7106314 0.08969045,2.4972073 0.02422142,2.2837833 0.10430656,2.0612055 c 0.0785162,-0.2182172 0.0800595,-0.22968 0.0787596,-0.5850623 -0.001455,-0.3998706 -0.044436,-0.66001794 -0.12619805,-0.76396135 -0.07121975,-0.0905412 -0.05985404,-0.15288234 0.04567264,-0.25051941 0.0514493,-0.0476028 0.0935442,-0.10717371 0.0935442,-0.13238003 0,-0.0394631 0.017055,-0.0460841 0.12277698,-0.047662 0.0675272,-0.001005 0.27537119,-0.0194231 0.46187519,-0.0409257 l 0.33909828,-0.039093 0.4443354,0.0646914 c 0.4438258,0.0646173 0.4450339,0.0646618 1.0529353,0.0387757 l 0.6085996,-0.0259159 0.1444995,0.086078 0.1444996,0.086078 0.5916003,-0.008718 0.591601,-0.008718 0.1987817,-0.0719331 C 5.0060176,0.32237652 5.1796594,0.25213176 5.2825582,0.20584 5.3854568,0.15954823 5.5698748,0.09501451 5.6923758,0.0624316 L 5.915105,0.00319007 6.2027055,0.09429034 6.490306,0.18539062 6.7387177,0.10220641 6.9871297,0.01902247 7.2541028,0.10688954 c 0.146835,0.0483269 0.4209298,0.16703674 0.6090994,0.26379937 l 0.3421266,0.17593204 0.3590369,-0.0109114 c 0.2712612,-0.008244 0.3639238,-0.0188198 0.3790259,-0.0432554 0.010993,-0.0177879 0.044227,-0.12064259 0.07385,-0.22856454 l 0.053862,-0.19622164 0.3390982,0.01146704 c 0.2530994,0.0085593 0.4802736,0.03620347 0.8957612,0.10900066 l 0.556663,0.0975323 0.14492,-0.0578064 c 0.07971,-0.0317937 0.229875,-0.0693714 0.33371,-0.0835062 0.176073,-0.0239686 0.206006,-0.0213307 0.444335,0.0391597 0.223795,0.056801 0.299128,0.0648089 0.606336,0.0644549 0.192935,-2.2225e-4 0.394047,-0.008004 0.446915,-0.0172932 0.09122,-0.0160285 0.106091,-0.009692 0.291639,0.12430178 0.107532,0.0776547 0.203163,0.15356681 0.212511,0.16869357 0.0093,0.0151262 0.02876,0.0972629 0.04315,0.18252519 l 0.02615,0.15502202 -0.118462,0.22171007 c -0.06516,0.1219403 -0.118463,0.2322999 -0.118463,0.2452433 0,0.012943 0.02588,0.035326 0.05752,0.049739 0.03163,0.014412 0.08588,0.069071 0.120553,0.121462 l 0.06304,0.095256 -0.01534,1.2796102 c -0.0084,0.7037859 -0.02213,1.3310529 -0.03042,1.3939274 l -0.01507,0.1143172 -0.192917,-0.013615 -0.192918,-0.013615 -0.01582,0.1055089 c -0.0087,0.05803 -0.01582,0.1648778 -0.01582,0.2374392 0,0.1074756 -0.01677,0.1643132 -0.09047,0.306637 l -0.09047,0.1747068 0.05003,0.071803 c 0.02752,0.039492 0.123282,0.1479979 0.212807,0.2411243 l 0.162773,0.1693214 -0.04934,0.1814701 -0.04934,0.1814697 0.05865,0.3858705 c 0.07031,0.4625324 0.06447,0.5794743 -0.04893,0.9809892 -0.04522,0.1601052 -0.08221,0.3092323 -0.08221,0.3313938 0,0.041666 0.03157,0.052314 0.239708,0.080859 0.09297,0.01275 0.11113,0.023381 0.111368,0.065197 1.64e-4,0.02748 0.01536,0.6182452 0.03379,1.3128119 0.06055,2.2819447 0.06617,2.7800167 0.03717,3.2970097 -0.01514,0.269874 -0.03149,0.49465 -0.03634,0.499502 -0.0049,0.0049 -0.19095,-0.06935 -0.41355,-0.164895 l -0.404727,-0.173719 -0.174985,0.07609 c -0.17965,0.07812 -0.197654,0.09823 -0.222042,0.248062 -0.01616,0.0993 -0.0044,0.09445 -0.448351,0.185249 l -0.260661,0.05332 -0.253832,-0.08517 c -0.235401,-0.07899 -0.268267,-0.08425 -0.452614,-0.07243 -0.13912,0.0089 -0.233733,0.0025 -0.31523,-0.02148 -0.116394,-0.03421 -0.116538,-0.03418 -0.312545,0.05594 l -0.1960976,0.09017 -0.7281352,-6.35e-4 c -0.7668146,-6.62e-4 -0.9244832,0.01114 -1.453104,0.108776 -0.3646676,0.06735 -0.4928709,0.06599 -1.1320084,-0.01206 l -0.3368818,-0.04114 -0.2360774,0.05372 c -0.1298424,0.02955 -0.2623865,0.0536 -0.2945424,0.05345 -0.038293,-1.87e-4 -0.1254101,-0.05727 -0.25249,-0.165466 z M 4.0907331,11.100123 C 4.6533915,10.888229 5.1170931,10.711516 5.1211806,10.707428 5.1284858,10.700123 2.9271938,8.5648675 2.6352684,8.2960884 2.5531819,8.2205101 2.4812346,8.1634591 2.4753857,8.1693082 2.4695358,8.1751582 2.2906174,8.6526816 2.0777879,9.2304734 1.8433694,9.8668744 1.6981283,10.292807 1.7093516,10.310945 c 0.014155,0.02288 1.3391782,1.170732 1.3549498,1.173781 0.00188,3.7e-4 0.4637735,-0.172708 1.0264317,-0.384603 z M 11.656297,9.9302124 C 11.948766,9.2227835 12.181311,8.6371564 12.173064,8.6288191 12.161735,8.6173626 6.6694175,4.9080232 2.822999,2.3140747 L 2.5149547,2.1063357 2.0099051,2.3336837 C 1.7321277,2.458725 1.5085421,2.5720916 1.513048,2.5856094 c 0.00451,0.013518 1.864769,1.9630495 4.1339177,4.3322927 l 4.1257251,4.3077149 0.6759222,-0.0046 0.675924,-0.0046 z M 10.894274,3.8512252 c 0.09699,-0.5383509 0.176344,-0.9967489 0.176344,-1.0186622 0,-0.024916 -0.141856,-0.1397146 -0.378631,-0.306414 -0.208248,-0.1466146 -0.392086,-0.2748047 -0.40853,-0.284867 -0.02991,-0.018304 -2.1842325,0.564125 -2.1814276,0.5897567 0.00188,0.017132 2.6002896,2.0146177 2.6091616,2.0057459 0.0037,-0.00371 0.08609,-0.4472085 0.183083,-0.9855594 z styleopacity:1;fill:#9b3425;fill-opacity:1;stroke:#0000ff;stroke-width:0;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0 /> /svg> /a> a hide-mobile hrefhttps://umfer-descript.s3.us-east-1.amazonaws.com/index.html> svg height2em xmlnshttp://www.w3.org/2000/svg viewBox0 0 512 512>!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc. -->path dM149.1 64.8L138.7 96 64 96C28.7 96 0 124.7 0 160L0 416c0 35.3 28.7 64 64 64l384 0c35.3 0 64-28.7 64-64l0-256c0-35.3-28.7-64-64-64l-74.7 0L362.9 64.8C356.4 45.2 338.1 32 317.4 32L194.6 32c-20.7 0-39 13.2-45.5 32.8zM256 192a96 96 0 1 1 0 192 96 96 0 1 1 0-192z/>/svg> /a> a hide hrefhttps://llama.umfer.us> svg height2em xmlnshttp://www.w3.org/2000/svg viewBox0 0 512 512>!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc. -->path dM512 240c0 114.9-114.6 208-256 208c-37.1 0-72.3-6.4-104.1-17.9c-11.9 8.7-31.3 20.6-54.3 30.6C73.6 471.1 44.7 480 16 480c-6.5 0-12.3-3.9-14.8-9.9c-2.5-6-1.1-12.8 3.4-17.4c0 0 0 0 0 0s0 0 0 0s0 0 0 0c0 0 0 0 0 0l.3-.3c.3-.3 .7-.7 1.3-1.4c1.1-1.2 2.8-3.1 4.9-5.7c4.1-5 9.6-12.4 15.2-21.6c10-16.6 19.5-38.4 21.4-62.9C17.7 326.8 0 285.1 0 240C0 125.1 114.6 32 256 32s256 93.1 256 208z/>/svg> /a> /span> span hide show-desktop> div> p>Started at a private university offering paid co-ops. Both companies offered extensions, and after 3 years of concurrent work and school, I chose work and got a job./p> p>For an enterprise consulting firm I built a front-end, migrated a database, built another front-end, performance tuned a database./p> p>Most of the team was aqui-hired, but a friend of mine secured funding, so I left to build a hrefhttps://stratz.com/>Stratz.com/a> for the chance to work with big data without first needing to aquire big customers. Wrote 80% of the MVP. Valve released a direct competitor./p> /div> div> p>I went and got a real job at a company all-in on cloud. Infrastructure as code, automated testing and deployments, latest and greatest stuff./p> p>For a while I studied machine learning (pre-transformer) as applied to algorithmic stock trading. Didnt hit the jackpot. I replicated OpenAIs Hide-and-Seek paper in an asteroids-like space shooter video game./p> /div> div> p>Then I moved to Seattle and started at Amazon AWS. The pandemic hit, perpetual staffing continued while projects were cancelled. I helped build a small react front-end, but ultimately it was a one-way door./p> p>small>InterviewStream LLC/small> was aquired in 2016. small>STRATZ LLC/small> was aquired in early 2024./p> /div> /span> span hide-desktop> p>Longtime dev here whos been doing a lot of cloud, infrastructure and react frontends as of late./p> p>Ive got significant scale noSQL and distributed systems under my belt, along with extensive SQL and web services experience over the past decade./p> p>Highly technical, I can learn a new domain quickly, build whatever you need, and lead by example./p> /span>/section>deck-of-cards hide>/deck-of-cards>/footer>style deck-of-cards> deck-of-cards::before { content: ; } deck-of-cards { display: flex; border: 1px solid #888; margin: 1em; padding: 1em; flex-direction: column; remaining::after { content: attr(remaining); } card { max-width: 52px; margin: 0.5em; filter: saturate(50%); } deals { display: flex; flex-direction: row; flex-wrap: wrap; } cards { display: flex; flex-direction: row; margin: 1em; } } @media not screen { deck-of-cards { display: none; } }/style>template deck-of-cards> input shuffle typebutton valueshuffle>/input> pre deck-id remaining>/pre> input draw typebutton valuedraw>/input> template deck-of-cards-card> img card /> /template>/template>script deck-of-cards> async function shuffleCards() { return new Promise(function asyncShuffle(done) { let req new XMLHttpRequest() req.responseType json req.addEventListener(load, function newDeck() { const deck req.response; if (!deck.success) throw deck.error if (!done) console.log(`shuffled ${JSON.stringify(deck)}`) else done(deck) }) req.open(GET, `https://deckofcardsapi.com/api/deck/new/shuffle/?deck_count1`) req.send() }) } async function drawCards(id,count) { return new Promise(function asyncDraw(done) { let req new XMLHttpRequest() req.responseType json const target this req.addEventListener(load, function cardsDrawn() { const draw req.response if (!draw.success) throw draw.error if (!done) console.log(`drew ${count} from ${JSON.stringify(deck)}`) else done(draw) }) req.open(GET, `https://deckofcardsapi.com/api/deck/${id}/draw/?count${count}`) req.send() }) } customElements.define(deck-of-cards, class extends HTMLElement { connectedCallback() { const template document.querySelector(templatedeck-of-cards).content this.appendChild(template.cloneNode(true)) this.querySelector(shuffle).addEventListener(click, this.shuffle.bind(this)) this.querySelector(draw).addEventListener(click, this.draw.bind(this, 2)) this.render() } render() { this.querySelector(draw).toggleAttribute(disabled, !(this.deck && this.deck.remaining)) } ondraw(draw) { this.querySelector(remaining).setAttribute(remaining, `${draw.remaining}`) const template document.querySelector(templatedeck-of-cards-card).content const cardList document.createElement(ul) for (var i 0; i draw.cards.length; ++i) { const card template.cloneNode(true) cardList.appendChild(card) cardList.querySelector(:last-child).setAttribute(alt, draw.cardsi.code) cardList.querySelector(:last-child).setAttribute(src, draw.cardsi.image) cardList.querySelector(:last-child).animate({transform:rotateX(180deg)},{transform:rotateX(0)}, 333*i) } this.querySelector(deals).appendChild(cardList) cardList.toggleAttribute(cards, true) this.deck draw this.dispatchEvent(new Event(draw)) this.render() } onshuffle(deck) { const prevCards this.querySelector(deals) if (prevCards) { prevCards.remove() } this.querySelector(deck-id).setAttribute(deck-id, deck.deck_id) this.querySelector(remaining).setAttribute(remaining, `${deck.remaining}`) const dealList document.createElement(ol) this.appendChild(dealList) dealList.toggleAttribute(deals, true) this.deck deck; this.dispatchEvent(new Event(shuffle)) this.render() } shuffle() { shuffleCards().then(this.onshuffle.bind(this)) } draw(count) { if (!this.deck) return; drawCards(this.deck.deck_id, count).then(this.ondraw.bind(this)) } })/script>style blac-jac> blac-jac { display: block; width: 100%; height: 100%; font-family: Roboto Serif, serif; hand { display: flex; flex-direction: row; scale: 0.75; } card { background-image: url(https://deckofcardsapi.com/static/img/back.png); background-clip: content-box; background-repeat: no-repeat; } carddouble { transform: rotateZ(90deg); } dealerhand { scale: 0.5; } dealer card:nth-of-type(1) img { visibility: hidden; } dealer form { display: none; } img { margin: 0; /*oops*/ } } blac-jacroot::before { content: blackjack } blac-jachand::before { content: attr(cardsvalue) } @media not screen { blac-jac { display: none; } } @keyframes spin { from { transform: rotateX(180deg); } to { transform: rotateX(0deg); } }/style>script blac-jac-app> function bjCard(el, props) { const {url,double} props el.innerHTML ` img stylebackground-image: url(${url}); animation: spin 666ms; src${url}> `; } async function bjPlayer(el, props) { const {isdealer,cv,cards} props const candeal cards.length 0; const canhit cards.length&&cv21; const candouble canhit && cards.length 2; const cansplit cards.length 2 && cards0.value cards1.value; const canstay !!cv; const isbust cv>21; const is二十一点 cv21 && cards.length 2; let form el.querySelector(form) if (!form) { form document.createElement(form) el.insertBefore(form, el.firstChild) } form.innerHTML `form> input typebutton valuedeal ${!candeal ? disabled : } onclickthis.dispatchEvent(new Event(signal,{bubbles:true}));> input typebutton valuehit ${!canhit ? disabled : } onclickthis.dispatchEvent(new Event(signal,{bubbles:true}));> input typebutton valuedouble ${!candouble ? disabled : } onclickthis.dispatchEvent(new Event(signal,{bubbles:true}));> input typebutton valuesplit ${!cansplit ? disabled : } onclickthis.dispatchEvent(new Event(signal,{bubbles:true}));> input typebutton valuestay ${!canstay ? disabled : } onclickthis.dispatchEvent(new Event(signal,{bubbles:true}));> ${isbust ? p stylecolor:red;>bust/p> : } input typehidden valuebust> ${is二十一点 ? p stylecolor:green;>blackjack/p> : } /form>`; const signal new Promise(resolve > { el.addEventListener(signal, (e) > resolve(e.target.value)) }) if (isdealer) { // dealer logic if (cv 0) { form.querySelector(valuedeal).dispatchEvent(new Event(signal, {bubbles:true})); } else if (cv 17) { form.querySelector(valuehit).dispatchEvent(new Event(signal, {bubbles:true})); } else if (cv > 21) { form.querySelector(valuebust).dispatchEvent(new Event(signal, {bubbles:true})); } else { form.querySelector(valuestay).dispatchEvent(new Event(signal, {bubbles:true})); } } else { if (isbust) { form.querySelector(valuebust).dispatchEvent(new Event(signal, {bubbles:true})); } else if (is二十一点) { form.querySelector(valuestay).dispatchEvent(new Event(signal, {bubbles:true})); } } return await signal }/script>blac-jac id二十一点>blac-jac table deck> blac-jac seat> blac-jac player hand>/blac-jac> /blac-jac> blac-jac seat> blac-jac dealer hand>/blac-jac> /blac-jac>/blac-jac>/blac-jac>script blac-jac> const cardvalue { A:11, //1 2:2, 3:3, 4:4, 5:5, 6:6, 7:7, 8:8, 9:9, 0:10, J:10, Q:10, K:10 } customElements.define(blac-jac, class extends HTMLElement { connectedCallback() { this.root this while (true) { const _root this.root.parentElement.closest(blac-jac) if (_root) { this.root _root; } else { break; } } this.isroot this this.root if (this.hasAttribute(hand)) { this.cards this.cards ?? } if (this.hasAttribute(card)) { const card document.createElement(template) bjCard(card,{url:this.getAttribute(url),double:this.hasAttribute(double)}) this.replaceChildren(card.content) } if (this.isroot) { // gotcha: inner elements such as seats and hands // dont yet exist, and web components only expose // half of the tree traversal setTimeout(this.root.table.bind(this,0),0); //await this.root.table(0) } } async table(t) { const tables this.root.querySelectorAll(table) const table tablest if (!table) throw `no table ${t}` // todo will need table-level state here // to allow multiple tables to run concurrently await table.seat(0) // deal await table.seat(0) // play table.settle() if (t tables.length-1) { await this.table(t+1) } else { } } async seat(s) { const seats this.closest(table).querySelectorAll(seat) const seat seatss if (!seat) throw `no seat ${s}` await seat.hand(0) if (s seats.length-1) { await this.seat(s+1) } else { } } async hand(h) { const hands ...this.closest(seat).querySelectorAll(hand) const hand handsh if (!hand) throw `no hand ${h}` let signal; while (!deal,stay,bust,double.includes(signal)) { let cv hand.hasAttribute(cardsvalue) ? Number.parseInt(hand.getAttribute(cardsvalue)) : 0 signal await bjPlayer(hand,{ isdealer:hand.hasAttribute(dealer), cards:hand.cards, cv:cv}) const deckElement this.closest(deck) let deck deckElement.getAttribute(deck) if (deck ) { const _deck await shuffleCards() deckElement.setAttribute(deck, `${_deck.deck_id}`) deck _deck.deck_id } switch (signal) { case deal: { const deal await drawCards(deck, 2) for (var i 0; i deal.cards.length; ++i) { const card document.createElement(blac-jac) card.toggleAttribute(card, true) card.setAttribute(url, deal.cardsi.image) card.toggleAttribute(signal, true) hand.cards ...hand.cards,deal.cardsi hand.appendChild(card) } } break; case double: case hit: { const deal await drawCards(deck, 1) for (var i 0; i deal.cards.length; ++i) { const card document.createElement(blac-jac) card.toggleAttribute(card, true) card.setAttribute(url, deal.cardsi.image) card.toggleAttribute(signal, true) hand.cards ...hand.cards,deal.cardsi hand.appendChild(card) } } break; case split: { const _hand document.createElement(blac-jac) _hand.toggleAttribute(hand, true) if (hand.hasAttribute(player)) { _hand.toggleAttribute(player, true) } const cards hand.querySelectorAll(card) cards0.remove(); _hand.appendChild(cards0) _hand.cards hand.cards.shift() hand.insertAdjacentElement(afterend,_hand) hands.splice(h+1,0,_hand) } break; case stay: { } break; case bust: { } break; default: throw `no signal ${signal}` } let _cv hand.cardsvalue() hand.setAttribute(cardsvalue, `${_cv}`) hand.setAttribute(cardscount, `${hand.cards.length}`) } if(h hands.length-1) { await this.hand(h+1) } else { } } cardsvalue() { const cards this.cards var value 0; if (cards) { var aces 0; for (var i 0; i cards.length; ++i) { if (cardsi.value0 A) { ++aces; } value + cardvaluecardsi.code0 } while (value > 21 && aces > 0) { value - 10; --aces; } } return value; } settle() { let dealerHand this.querySelector(handdealer) let dealerValue Number.parseInt(dealerHand.getAttribute(cardsvalue)) dealerHand.querySelector(card:nth-of-type(1) img).style.visibility visible; this.querySelectorAll(handplayer).forEach(function payout(hand) { let cv hand.hasAttribute(cardsvalue) ? Number.parseInt(hand.getAttribute(cardsvalue)) : 0 if (cv 21 && (cv > dealerValue || dealerValue > 21)) { if (cv > dealerValue || dealerValue > 21) { const win document.createElement(p) win.style.color green; win.innerHTML win hand.querySelector(form).replaceWith(win) } else { const push document.createElement(p) push.style.color orange; push.innerHTML push hand.querySelector(form).replaceWith(push) } } else { const lose document.createElement(p) lose.style.color red lose.innerHTML lose hand.querySelector(form).replaceWith(lose) } }) } })/script>script srcterrarium-image.js>/script>style terrarium-image> terrarium-image { position: relative; }/style>terrarium-image formatterrarium hide>/terrarium-image>terrarium-image formatnormal hide>/terrarium-image>!-- usgs https://us-west-2.console.aws.amazon.com/s3/buckets/prd-tnm -->style> zrc { canvas { border: 2px solid #aaa; box-sizing: border-box; } svg { border: 2px solid #111; } canvas,svg { background: #888 linear-gradient(#777, #888); width: 100%; height: 100%; } canvas,svg { position: fixed; left: 50%; top: 50%; transform: translate(-50%, -50%); } canvas {z-index: -1;} svg {z-index:-2;} svg {margin:0;transform:translate(-75%, -25%) scale(0.25, 0.23625)} } @media not screen { zrc { display: none; } }/style>zrc idzen-rat-city>visual_scene hide> node nameroom1> scale>6.378137 6.356752314245 6.378137/scale> /node> node nameroom2 _bodystatic _shapebox> coord>30.2922151 -74.4292954/coord> scale>0.01 0.01 0.01/scale> _gltf-mesh libraryhttps://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/refs/heads/main/2.0/Cube/glTF/ srcCube.gltf>/gltf-mesh> _gltf-mesh librarymain1_sponza srcNewSponza_Main_glTF_003.gltf>/gltf-mesh> !-- collada-mesh targetzrc-mainview srchttps://raw.githubusercontent.com/SaschaWillems/VulkanSponza/refs/heads/master/data/sponza.dae libraryhttps://raw.githubusercontent.com/SaschaWillems/VulkanSponza/refs/heads/master/data TEXCOORDTEXCOORD_0>/collada-mesh>--> /node> node player bodydynamic shapesphere> scale>0.01 0.01 0.01/scale> node nameship1> rotate>0 1 0 180/rotate> scale>0.1 0.1 0.1/scale> template targetzrc-mainview> web-gl> web-gl uniform nameobject mat4nodenameship1>/web-gl> ctm-mesh srcORIGIN-315P3.ctm>/ctm-mesh> /web-gl> /template> template targetzrc-minimap> web-gl> web-gl uniform nameobject mat4nodenameship1>/web-gl> ctm-mesh refsrcORIGIN-315P3.ctm>/ctm-mesh> /web-gl> /template> /node> /node> node _bodydynamic _shapebox> coord>48.8583736 2.2919064/coord> scale>0.01 0.01 0.01/scale> node namewalk1> rotate>0 0 1 90/rotate> rotate>1 0 0 -0/rotate> scale>1 1 1/scale> template targetzrc-mainview> web-gl> _web-gl uniform nameobject mat4nodenamewalk1>/web-gl> _id5-mesh srcmarine.md5mesh>/id5-mesh> _id5-anim srcwalk_normal.md5anim meshid5-meshsrcmarine.md5mesh>/id5-anim> /web-gl> /template> template targetzrc-minimap> web-gl> _web-gl uniform nameobject mat4nodenamewalk1>/web-gl> _id5-mesh refsrcmarine.md5mesh>/id5-mesh> /web-gl> /template> /node> /node> node _bodydynamic _shapebox> coord>40.6892534 -74.0470753/coord> scale>0.01 0.01 0.01/scale> node namewalk2> rotate>0 0 1 90/rotate> rotate>1 0 0 -0/rotate> scale>1 1 1/scale> template targetzrc-mainview> web-gl> _web-gl uniform nameobject mat4nodenamewalk2>/web-gl> _id5-mesh srcskeleton.md5mesh>/id5-mesh> _id5-anim srcmedrun1.md5anim meshid5-meshsrcskeleton.md5mesh>/id5-anim> /web-gl> /template> template targetzrc-minimap> web-gl> _web-gl uniform nameobject mat4nodenamewalk2>/web-gl> _id5-mesh refsrcskeleton.md5mesh>/id5-mesh> /web-gl> /template> /node> /node>/visual_scene>svg data>!--minimap-->/svg>script srcgl-matrix.js>/script>script> mat4 glMatrix.mat4 vec3 glMatrix.vec3 quat glMatrix.quat vec2 glMatrix.vec2 mat3 glMatrix.mat3 vec4 glMatrix.vec4/script>script srcammo.wasm.js>/script>script> const wgs84 vec3.fromValues(6.378137,6.356752314245,6.378137); function ecefPosition(ecef,coord) { let lat coord0 let lng coord1 const e2 1 - (wgs841*wgs841)/(wgs840*wgs840) const n wgs840/Math.sqrt(1-e2*(Math.sin(lat)**2)) const h 0// ecef0 (n+h)*Math.cos(lat)*Math.cos(lng) ecef1 (n+h)*Math.cos(lat)*Math.sin(lng) ecef2 ((1-e2)*n+h)*Math.sin(lat) } function ecefRotation(rotationMatrix, coord) { let lat coord0; let lng coord1; // Compute Up Vector (Normal to WGS ellipsoid) const up Math.cos(lat) * Math.cos(lng), Math.cos(lat) * Math.sin(lng), Math.sin(lat) ; // Compute East Vector (Direction of increasing longitude) const east -Math.sin(lng), Math.cos(lng), 0 ; // Compute North Vector (Direction of increasing latitude) const north -Math.sin(lat) * Math.cos(lng), -Math.sin(lat) * Math.sin(lng), Math.cos(lat) ; // Construct Rotation Matrix rotationMatrix0 east0; rotationMatrix1 north0; rotationMatrix2 up0; rotationMatrix3 east1; rotationMatrix4 north1; rotationMatrix5 up1; rotationMatrix6 east2; rotationMatrix7 north2; rotationMatrix8 up2; } function ecefTransform(m,coord) { var _ecefPosition vec3.create() ecefPosition(_ecefPosition,coord) var _ecefRotation mat3.create() ecefRotation(_ecefRotation,coord) var _ecefQuat quat.create() quat.fromMat3(_ecefQuat,_ecefRotation) mat4.fromRotationTranslation(m,_ecefRotation,_ecefPosition) } function spherePosition(position,coord) { position0 coord0 position1 coord1 position2 -Math.sqrt(1 - position0 ** 2 - position1 ** 2); // Ensure it lies on the sphere if (isNaN(position2)) { position2 0; // Handle invalid case when sqrt goes negative } } function geoCoord(coord,position) { let p Math.sqrt(position0 * position0 + position1 * position1); const e2 1 - (wgs841*wgs841)/(wgs840*wgs840) let lat Math.atan2(position2, (1 - e2) * p); let lng Math.atan2(position1,position0) let N wgs840 / Math.sqrt(1 - e2 * Math.sin(lat) * Math.sin(lat)); let altitude p / Math.cos(lat) - N; coord0lat coord1lng coord2altitude } function sceneNode(e,parentMat4) { e.transform mat4.create() for (var c of e.children) { switch (c.tagName.toUpperCase()) { case LOOKAT: const _lookat c.innerHTML.split(/\s+/).filter(s>s.length>0).map(s>Number.parseFloat(s)) mat4.lookAt(e.transform,vec3.fromValues(_lookat0,_lookat1,_lookat2),vec3.fromValues(_lookat3,_lookat4,_lookat5),vec3.fromValues(_lookat6,_lookat7,_lookat8)) break; case MATRIX: const _matrix c.innerHTML.split(/\s+/).filter(s>s.length>0).map(s>Number.parseFloat(s)) mat4.multiply(e.transform,e.transform,_matrix) break; case ROTATE: const _rotate c.innerHTML.split(/\s+/).filter(s>s.length>0).map(s>Number.parseFloat(s)) mat4.rotate(e.transform,e.transform,_rotate3*(Math.PI/180.0),vec3.fromValues(_rotate0,_rotate1,_rotate2)) break; case SCALE: const _scale c.innerHTML.split(/\s+/).filter(s>s.length>0).map(s>Number.parseFloat(s)) mat4.scale(e.transform,e.transform,_scale) break; case TRANSLATE: const _translate c.innerHTML.split(/\s+/).filter(s>s.length>0).map(s>Number.parseFloat(s)) mat4.translate(e.transform,e.transform,_translate) break; case COORD: const _coord c.innerHTML.split(/\s+/).filter(s>s.length>0).map(s>Number.parseFloat(s)) _coord0 _coord0*(Math.PI/180.0) _coord1 _coord1*(Math.PI/180.0) var _ecefTransform mat4.create() ecefTransform(_ecefTransform,_coord) mat4.multiply(e.transform,e.transform,_ecefTransform) break; } } if (e.parentElement?.mat4) { e.mat4 mat4.create() mat4.multiply(e.mat4, e.parentElement.mat4, e.transform) } else { e.mat4 mat4.clone(e.transform) } for (var c of e.children) { switch (c.tagName.toUpperCase()) { case NODE: case VISUAL_SCENE: sceneNode(c) break; case TEMPLATE: const _target c.getAttribute(target) const _targetElement document.querySelector(_target) if (!_targetElement) throw `no target for template ${_target}` _targetElement.appendChild(c.content.cloneNode(true)) break; } } }/script>canvas stylebackground:blue width960 height540> script> const canvas document.querySelector(canvas) setInterval(()>{ if (canvas.style.background blue) { canvas.style.background red } else if (canvas.style.background red) { canvas.style.background blue } },1000) /script>web-gl> web-gl texture-image sampler0 srcimage.jpg texture-min-filterLINEAR texture-mag-filterLINEAR texture-wrap-sCLAMP_TO_EDGE texture-wrap-tCLAMP_TO_EDGE /> web-gl texture-atlas sampler1 imgterrarium-imageformatterrarium>img texture-min-filterNEAREST texture-mag-filterNEAREST texture-wrap-sREPEAT texture-wrap-tCLAMP_TO_EDGE /> web-gl texture-atlas sampler2 imgterrarium-imageformatnormal>img texture-min-filterLINEAR_MIPMAP_LINEAR texture-mag-filterLINEAR texture-wrap-sREPEAT texture-wrap-tCLAMP_TO_EDGE generate-mipmap /> template screen-vertex> attribute vec2 position; uniform float aspect; varying vec2 uv; void main() { vec2 _uv position; if (aspect > 1.0) { _uv.y * 1.0/aspect; } else if (aspect > 0.0) { _uv.x * aspect; } uv _uv*0.5+0.5; //uv.y 1.0-uv.y; gl_Position vec4(position, 0.0, 1.0); } /template> template glsl-util> float terrariumElevation(vec3 color) { vec3 encoded color * 256.0; float elevation ((encoded.r * 256.0 + encoded.g + (encoded.b / 256.0)) - 32768.0); return elevation; } vec3 terrariumColor(float elevation) { float v elevation + 32768.0; vec3 encoded vec3( floor(v/256.0), floor(mod(v,256.0)), floor((v-floor(v))*256.0) ); vec3 color encoded / 256.0; return color; } float terrariumNormal(float elevation) { return elevation 0.0 ? elevation / 11000.0 : elevation / 8900.0; //float normal (elevation + 11000.0) / (8900.0 + 11000.0); //return normal; } vec3 wgsNormal(vec2 ll) { float lat radians(ll.x); float lon radians(ll.y); float a 6378137.0; // WGS84 semi-major axis float b 6356752.3142; // WGS84 semi-minor axis float e2 1.0 - (b*b) / (a*a); // eccentricity squared float sinLat sin(lat); float cosLat cos(lat); float sinLon sin(lon); float cosLon cos(lon); float N a / sqrt(1.0 - e2 * sinLat * sinLat); // Prime vertical radius vec3 position vec3( N * cosLat * cosLon, N * cosLat * sinLon, (b*b / (a*a)) * N * sinLat ); return normalize(position); // Geodetic normal } vec3 wgsTangent(vec2 ll) { float lat radians(ll.x); float lon radians(ll.y); float cosLat cos(lat); float sinLat sin(lat); float cosLon cos(lon); float sinLon sin(lon); return normalize(vec3(-sinLon, cosLon, 0.0)); // East direction } vec3 wgsBitangent(vec2 ll) { float lat radians(ll.x); return normalize(vec3(-cos(lat), 0.0, sin(lat))); // North direction } mat3 wgsTBN(vec2 ll) { vec3 T wgsTangent(ll); vec3 B wgsBitangent(ll); vec3 N wgsNormal(ll); return mat3(T, B, N); } // https://iquilezles.org/articles/palettes/ vec3 palette( in float t, in vec3 a, in vec3 b, in vec3 c, in vec3 d ) { return a + b*cos( 6.283185*(c*t+d) ); } void colorGrade(inout vec4 color) { color.rgb pow(color.rgb,vec3(1.0/2.2)); } vec3 textureGrade(vec3 color) { return pow(color,vec3(2.2)); //return color; } /template> template screen-terrarium> uniform sampler2D terrarium_elevation; uniform sampler2D terrarium_normal; uniform mat4 camera_inverse; uniform mat4 lens_inverse; varying vec2 uv; void main(){ vec2 ndc uv*2.0-1.0; float depth 1.0; vec4 clip vec4(ndc,depth,1.0); vec4 view lens_inverse * clip; view / view.w; vec4 world camera_inverse * view; vec3 dir normalize(world.xyz); vec2 ll vec2( atan(dir.z, dir.x), // Longitude -PI, PI (3.14159265359 / 2.0) - acos(dir.y) // Latitude -1.484, 1.484 rad ); vec2 wm vec2( ll.x, log(tan(3.14159265359 / 4.0 + ll.y / 2.0)) // Maps latitude correctly with Mercator compression ); vec2 wmuv vec2( wm.x / (2.0 * 3.14159265359), // Normalize longitude to 0,1 0.5 * (1.0 - wm.y / log(tan(3.14159265359 / 4.0 + 1.48442223358 / 2.0))) // Normalize latitude ); wmuv.x - 0.25; float elevation terrariumElevation(texture2D(terrarium_elevation,wmuv.xy).rgb); float e terrariumNormal(elevation)*0.5+0.5; gl_FragColor vec4(0.01,e*step(0.5,e),e*step(e,0.5),0.99); //gl_FragColor.rgb palette(e, vec3(0.0,0.0,0.0),vec3(0.0,0.0,1.0),vec3(0.0,1.0,0.0),vec3(1.0,1.0,1.0)); mat3 TBN wgsTBN(ll); vec3 N texture2D(terrarium_normal,wmuv).rgb*2.0-1.0; N normalize(TBN*N); vec3 L -dir; //gl_FragColor.xyz * dot(N,L); vec2 coord (ll*(180.0/3.14159265359)); vec2 gridSize vec2(7.5); vec2 grid mod(coord,gridSize); grid min(grid,gridSize-grid); float d min(grid.x,grid.y); gl_FragColor.rgb * mix(gl_FragColor.rgb, vec3(1.0), smoothstep(0.0,0.5,(d))); colorGrade(gl_FragColor); } /template> template camera-vertex> attribute vec3 POSITION; attribute vec3 NORMAL; attribute vec2 TEXCOORD_0; uniform mat4 object; uniform mat4 camera; uniform mat4 lens; varying vec3 position; varying vec3 normal; varying vec2 uv; void main() { vec4 p vec4(POSITION, 1.0); gl_Position lens * camera * object * p; position (object * p).xyz; normal normalize((object * vec4(NORMAL, 0.0)).xyz); // Transform and normalize normal uv 1.0-TEXCOORD_0; } /template> template map-terrarium> uniform sampler2D terrarium_elevation; uniform sampler2D terrarium_normal; uniform bool invert; varying vec2 uv; void main(){ vec2 _uv uv; if (invert) _uv.y 1.0-_uv.y; float elevation terrariumElevation(texture2D(terrarium_elevation,_uv.xy).rgb); float e terrariumNormal(elevation)*0.5+0.5; gl_FragColor vec4(0.0,e*step(0.5,e),e*step(e,0.5),0.9); vec2 coord uv * vec2(180.0,360.0); vec2 gridSize vec2(15.0); vec2 grid mod(coord,gridSize); grid min(grid,gridSize-grid); float d min(grid.x,grid.y); gl_FragColor.rgb * mix(gl_FragColor.rgb, vec3(1.0), smoothstep(0.0,1.5,(d))); colorGrade(gl_FragColor); } /template> template camera-fragment> uniform sampler2D albedo; varying vec3 position; varying vec3 normal; varying vec2 uv; void main() { gl_FragColor 0.9*vec4(textureGrade(texture2D(albedo,uv).rgb),1.0); colorGrade(gl_FragColor); } /template> !-- mainview --> web-gl viewport default-framebuffer enableBLEND blend-sONE blend-dONE_MINUS_SRC_ALPHA> !-- background --> web-gl program vstemplatescreen-vertex fsglsl-util,templatescreen-terrarium disableDEPTH_TEST,CULL_FACE> web-gl uniform nameterrarium_elevation sampler1>/web-gl> web-gl uniform nameterrarium_normal sampler2>/web-gl> web-gl uniform nameaspect aspectzrc canvas>/web-gl> web-gl uniform namecamera_inverse mat4camera1_inverse>/web-gl> web-gl uniform namelens_inverse mat4lens1_inverse>/web-gl> web-gl draw-box>/web-gl> /web-gl> web-gl program vstemplatecamera-vertex fsglsl-util,templatemap-terrarium disableDEPTH_TEST,CULL_FACE> web-gl uniform nameterrarium_elevation sampler1>/web-gl> web-gl uniform namecamera mat4camera1>/web-gl> web-gl uniform namelens mat4lens1>/web-gl> web-gl uniform nameobject mat4nodenameroom1>/web-gl> _sphere-mesh>this works, draw-box should be better/sphere-mesh> _cube-mesh>todo update cube-mesh to use spherical uvs/cube-mesh> /web-gl> !-- foreground --> web-gl zrc-mainview program vstemplatecamera-vertex fsglsl-util,templatecamera-fragment enableDEPTH_TEST,CULL_FACE> web-gl uniform namealbedo sampler0>/web-gl> web-gl uniform namecamera mat4camera1>/web-gl> web-gl uniform namelens mat4lens1>/web-gl> visual_scene nodes go here /web-gl> /web-gl> !-- minimap --> web-gl viewportzrc svg default-framebuffer> web-gl program vstemplatescreen-vertex fsglsl-util,templatemap-terrarium disableDEPTH_TEST,CULL_FACE> web-gl uniform nameterrarium_elevation sampler1>/web-gl> web-gl uniform nameinvert booltrue>so i can reuse map-terrarium shader/web-gl> web-gl uniform nameaspect aspectzrc svg>/web-gl> web-gl draw-box>/web-gl> /web-gl> web-gl zrc-minimap program vstemplatecamera-vertex fsglsl-util,templatecamera-fragment enableDEPTH_TEST,CULL_FACE> web-gl uniform namealbedo sampler0>/web-gl> web-gl uniform namecamera mat4camera2>/web-gl> web-gl uniform namelens mat4lens2>/web-gl> visual_scene nodes go here /web-gl> /web-gl> webgl framebuffer> webgl program vertex draw /> /webgl>/web-gl>/canvas>script> // maintain a tree of bound functions // to enforce parent-child order class AnimationFrame { constructor(el,rootTagName) { //rootTagName rootTagName ?? CANVAS this.el el if (el.animationFrame) { //janky move if (el.animationFrame.isroot) throw `cannot move root AnimationFrame` this.animation el.animationFrame.animation } else { this.animation } el.animationFrame this if (el.parentElement && (!rootTagName || el.parentElement.tagName ! rootTagName)) { if (!el.parentElement.animationFrame) { new AnimationFrame(el.parentElement) } el.parentElement.animationFrame.use(this.frame.bind(this)) } else { this.isroot true requestAnimationFrame(this.frame.bind(this)) } } use(f) { this.animation ...this.animation, f } frame() { for (const a of this.animation) { a() } if (this.isroot) { requestAnimationFrame(this.frame.bind(this)) } } } document.querySelectorAll(visual_scene>node).forEach(function rootNode(e) { sceneNode(e); })/script>script srczrc.js>/script>script srclzma.js>/script>script srcctm.js>/script>script srcwebgl-debug.js>/script>script srcweb-gl.js>/script>script srcctm-mesh.js>/script>script srcid5-mesh.js>/script>script srcid5-anim.js>/script>script srcsphere-mesh.js>/script>script srccube-mesh.js>/script>script srccollada-mesh.js>/script>script srcgltf-mesh.js>/script>/zrc>bsp-dface planenum>/bsp-dface>style mail-to> mail-to { form { display: none; } } mail-toopened { form { position: absolute; width: 50%; height: 50%; transform: translate(50%, 0); display: flex; flex-direction: column; align-items: top; justify-items: center; padding: 1em; margin: 0.5em; box-shadow: 0 0 5px #ff6601; background: #eee; } form input { } form typetext, form textarea { border-width: 1px; white-space: normal; font-family: Consolas, monospace; } form namemail { max-lines: 80; height: 80%; } }/style>template mail-to> form methodPOST actionhttps://send.umfer.us enctypemultipart/form-data> textarea namemail>/textarea>!-- todo txt editor --> input namesend typesubmit valuesend> input nameclose typebutton valueclose> input namefile0 typefile multiple valueadd file> /form>/template>script mail-to> customElements.define(mail-to, class extends HTMLElement { connectedCallback() { this.addEventListener(click, this.open.bind(this)) this.href this.querySelector(href).getAttribute(href).slice(mailto:.length); } open(e) { if (this.hasAttribute(opened)) return const template document.querySelector(templatemail-to).content const instance template.cloneNode(true) this.appendChild(instance) if (window.profile?.emails) { for (let email in window.profile.emails) { const cc document.createElement(input) cc.setAttribute(name,cc) cc.setAttribute(type,hidden) cc.setAttribute(value, `${email}`) this.querySelector(form).appendChild(cc) } } this.querySelector(nameclose).addEventListener(click, this.close.bind(this)) //this.querySelector(namefile0).addEventListener(change, this.onfile.bind(this)) this.querySelector(form).addEventListener(drop, this.drop.bind(this)) this.querySelector(form).addEventListener(submit, this.upload.bind(this)) this.querySelector(form).action + `${this.href}` e.preventDefault(); this.toggleAttribute(opened, true) } close(e) { if (!this.hasAttribute(opened)) return this.querySelector(form).remove() this.toggleAttribute(opened, false) e.stopPropagation(); } drop(e) { e.preventDefault(); const fileInput document.querySelector(inputtypefile) const dt new DataTransfer() for (const file of event.dataTransfer.files) { dt.items.add(file); } fileInput.files dt.files } validate(e) { if (false) { e.preventDefault(); } //this.close() } upload(e) { for (var i 0; ; ++i) { const f this.querySelector(`namefile${i}`); if (!f) break; if (!f.files.length) { f.remove(); break; } } /*const fetch new XMLHttpRequest() for (var i 0; i this.querySelector(namefile0).files.length; ++i) { fetch.open(POST, this.querySelector(form).action) fetch.send(this.querySelector(namefile0).filesi) }*/ } })/script>style flash-message> /* bot styles */ flash-message { margin-top: 1em; display: block; /* Base styling for the flash message container */ divflash-message { display: flex; align-items: flex-start; max-width: 300px; padding: 15px 20px; background-color: #f8f9fa; /* Light background */ border: 1px solid #ced4da; /* Border for structure */ border-radius: 8px; box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.1); /* Subtle shadow for depth */ color: #212529; /* Neutral text color */ font-size: 14px; line-height: 1.5; animation: fadeIn 0.3s ease-in-out; } /* Dismiss button styling */ divflash-message close { text-decoration: none; color: #6c757d; /* Subtle icon color */ font-size: 16px; background: none; border: none; cursor:pointer; transition: color 0.2s ease-in-out; } divflash-message close:hover { color: #343a40; /* Darker shade on hover */ } /* Styling for the message text */ divflash-message pmsg { margin: 0; padding: 0; } /* Fade-in animation for the flash message */ @keyframes fadeIn { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: translateY(0); } } }/style>template flash-message> button typebutton close> svg xmlnshttp://www.w3.org/2000/svg width16 height16 viewBox0 0 24 24 fillnone strokecurrentColor stroke-width2 stroke-linecapround stroke-linejoinround classclose-icon > line x118 y16 x26 y218>/line> line x16 y16 x218 y218>/line> /svg>/button> p msg>/p>/template>script flash-message> customElements.define(flash-message, class extends HTMLElement { connectedCallback() { const findMessage document.cookie.match(/(?:^|;\s*)message(^;+)/) if (findMessage) { const message decodeURIComponent(findMessage1);//.replace(/\+/g, ) console.log(message) const template document.querySelector(templateflash-message).content const instance template.cloneNode(true) const wrapper document.createElement(div) wrapper.toggleAttribute(flash-message, true) this.appendChild(wrapper) instance.querySelector(close).addEventListener(click, (function closeMessage(e) { this.removeChild(wrapper) }).bind(this)) instance.querySelector(msg).innerHTML message; wrapper.appendChild(instance) document.cookie message; Domainumfer.us } } })/script>script> const fetch new XMLHttpRequest() fetch.responseType arraybuffer fetch.addEventListener(load, function loadwasm() { if (fetch.readyState ! XMLHttpRequest.DONE) return WebAssembly.instantiate(fetch.response).then(function instatiatewasm(module) { console.log(module.instance.exports) }) }) fetch.open(GET, llama.wasm) fetch.send()/script>script> document.querySelectorAll(onfoo-click).forEach((el) > { el.addEventListener(click, function onfoo(click){ }) })/script>style tet-ris> tet-ris { display: flex; justify-content: center; logo { width: 50vw; } }/style>template tet-ris> a hrefhttps://github.com/Broderick-Westrope/tetrigo/blob/main/docs/2009-Tetris-Design-Guideline.pdf> img logo srchttps://upload.wikimedia.org/wikipedia/commons/4/46/Tetris_logo.png> /a>/template>script tet-ris> customElements.define(tet-ris, class extends HTMLElement { connectedCallback() { const template document.querySelector(templatetet-ris).content const instance template.cloneNode(true) this.appendChild(instance) } })/script>tet-ris hide>/tet-ris>a screen hide-mobile hrefhttps://github.com/BabylonJS/Spector.js/blob/master/documentation/extension.md tabindex-1 stylefloat:right;> img srchttps://spector.babylonjs.com/img/favicon/favicon-32x32.png />/a>aside screen hide-mobile hide-compact classoverlay stylefloat:right;scale:0.8;> h4 idterms-of-service>Terms of Service/h4> p> By using this website, you agree to use it responsibly and at your own risk. We do our best to keep everything running smoothly, but we make no guarantees. We’re not liable for any issues that may arise. We reserve the right to update these terms at any time. /p> h4 idprivacy-policy>Privacy Policy/h4> p> We respect your privacy. We don’t collect personal data unless you give it to us voluntarily. We don’t sell your data. We only use cookies if absolutely necessary for site functionality. /p> hr /> This site uses the IP2Location LITE database for a hrefhttps://lite.ip2location.com target_blank tabindex-1>IP geolocation/a>/aside>!-- copyright © anthony umfer -->
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
]