1<!DOCTYPE html> 2<html lang="en" ng-app="RoaringApps"> 3 <head> 4 <meta charset="utf-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 6 <meta name="viewport" content="width=device-width, initial-scale=1"> 7 <meta name="description" content="Crowd-sourced application compatibility for macOS, iOS and Windows."> 8 <meta name="keywords" content="mac,macos,mac os x,mojave,catalina,big sur,monterey,apple silicon,arm macs,m1 macs,catalyst apps,32-bit apps,app,application,application compatibility,apple,roaringapps,mac app store,table,windows,ios,ios 14,ios 15"> 9 10 <title> 11 Account â RoaringApps 12 </title> 13 14 15 16 17 <!-- Stylesheets --> 18 <link rel="stylesheet" href="/assets/css/site-2131.css"> 19 20 <!-- Webfonts --> 21 <link href='https://fonts.googleapis.com/css?family=Lato:100,400,700,100italic,400italic,700italic|Rancho|Merriweather+Sans:400,300,300italic,400italic,700,700italic|Cookie' rel='stylesheet' type='text/css'> 22 23 <!--[if lt IE 9]> 24
24<script src="/assets/js/ie8-responsive-file-warning.js"></script>
24 25 <![endif]--> 26 27 <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries --> 28 <!--[if lt IE 9]> 29
29<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
29 30
30<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
30 31 <![endif]--> 32 33 <!-- Favicons --> 34 <link rel="shortcut icon" href="/assets/ico/favicon.png"> 35 <link rel="shortcut icon" href="/favicon.ico"> 36 37 <!-- Angular $location.html5Mode = true requires this --> 38 <base href="/">
vendor: 75 bytes, lines 38-40
38 39 40 <script async src="https://www.googletagmanager.com/gtag/js?id=
40G-3G6DX7LY1W
vendor: 18 bytes, lines 40-41
40"></script> 41
41<script> 42
vendor: 158 bytes, lines 42-46
42window.dataLayer = window.dataLayer || []; 43 function gtag(){dataLayer.push(arguments);} 44 gtag('js', new Date()); 45 46 gtag('config', '
46G-3G6DX7LY1W
vendor: 10 bytes, lines 46-47
46'); 47
47</script>
47 48
48<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
48 49
49<script type="text/javascript"> 50 (adsbygoogle = window.adsbygoogle || []).push({ 51 google_ad_client: "ca-pub-4932023458712014", 52 enable_page_level_ads: true 53 }); 54 </script>
54 55
55<script src="/assets/js/vendor/modernizr.js" data-cfasync='true'></script>
55 56 57 <!-- First input delay polyfill - used by Firebase Performance Monitoring. 58 Ref: https://firebase.google.com/docs/perf-mon/get-started-web 59 Ref2: https://github.com/GoogleChromeLabs/first-input-delay 60 --> 61
61<script type="text/javascript"> 62 !function(n,e){var t,o,i,c=[],f={passive:!0,capture:!0},r=new Date,a="pointerup",u="pointercancel";function p(n,c){t||(t=c,o=n,i=new Date,w(e),s())}function s(){o>=0&&o<i-r&&(c.forEach(function(n){n(o,t)}),c=[])}function l(t){if(t.cancelable){var o=(t.timeStamp>1e12?new Date:performance.now())-t.timeStamp;"pointerdown"==t.type?function(t,o){function i(){p(t,o),r()}function c(){r()}function r(){e(a,i,f),e(u,c,f)}n(a,i,f),n(u,c,f)}(o,t):p(o,t)}}function w(n){["click","mousedown","keydown","touchstart","pointerdown"].forEach(function(e){n(e,l,f)})}w(n),self.perfMetrics=self.perfMetrics||{},self.perfMetrics.onFirstInputDelay=function(n){c.push(n),s()}}(addEventListener,removeEventListener); 63 </script>
63 64 65 <!-- Sentry.io error monitoring --> 66
66<script src="https://js.sentry-cdn.com/9bccfd17b53521da4d6c21b201931d8c.min.js" crossorigin="anonymous"></script>
66 67 68
68<script> 69 window.ENVIRONMENT = 'production'; 70 </script>
70 71 </head> 72 <body class="{{bodyClass}}" ng-cloak> 73 <a class="sr-only" href="#content">Skip to main content</a> 74 75 <div class="wrapper"> 76 77 <!-- Navigation component --> 78 <header class="navbar navbar-fixed-top " role="banner" ng-controller="HeaderCtrl"> 79 <div class="container"> 80 81 <div class="navbar-header"> 82 <button class="navbar-toggle collapsed" type="button" data-toggle="collapse" data-target=".bs-navbar-collapse"> 83 <span class="sr-only">Toggle navigation</span> 84 <svg class="icon"> 85 <use xlink:href="/assets/svg/icons.svg#shape-chevron-down" /> 86 </svg> 87 </button> 88 <a href="/" class="navbar-brand">RoaringApps</a> 89 </div> 90 91 <nav class="collapse navbar-collapse bs-navbar-collapse" role="navigation"> 92 <ul class="nav navbar-nav navbar-centre"> 93 <li> <a href="/apps">Apps</a> </li> 94 95 <li class="dropdown main-dropdown"> 96 <a href="#" class="dropdown-toggle" data-toggle="dropdown">Collections</a> 97 <ul class="dropdown-menu" role="menu"> 98 <li><a href="/collections/list-of-apple-silicon-native-apps">Apps ready for Apple Silicon</a></li> 99 <li><a href="/collections/list-of-native-windows-arm-apps">Apps native on Windows ARM</a></li> 100 <li><a href="/collections/list-of-32-bit-macos-apps">macOS 32-bit apps</a></li> 101 <li><a href="/collections/discontinued-macos-ios-apps">Discontinued apps</a></li> 102 <li><a href="/app-collection/ios-carplay-apps">iOS CarPlay apps</a></li> 103 <li><a href="/app-collections">More collections...</a></li> 104 </ul> 105 </li> 106 107 <li> <a href="/mac-app">Download</a> </li> 108 109 <li> <a href="/about" class="hidden-sm">About</a> </li> 110 <li> <a href="/app/+">Add App</a> </li> 111 </ul> 112 <ul class="nav navbar-nav navbar-right"> 113 <li> <a href="#" data-toggle="modal" data-target="#modal-search" class="with-icon"> 114 <span class="sr-only">Search applications</span> 115 <svg class="icon fav-icon-outline"> 116 <use xlink:href="/assets/svg/icons.svg#shape-magnifying-glass" /> 117 </svg> 118 </a> </li> 119 <li class="hidden-sm"> <a href="#" data-toggle="modal" data-target="#modal-feedback">Feedback</a> </li> 120 121 <li class="dropdown account-dropdown" ng-if="user"> 122 <a href="#" class="dropdown-toggle" data-toggle="dropdown">{{user.username}}</a> 123 <ul class="dropdown-menu pull-right" role="menu"> 124 <li><a href="/account">Account</a></li> 125 <li><a href="/account/watching">Notifications</a></li> 126 127 <li ng-if="user.role == 'admin'" class="divider"></li> 128 <li ng-if="user.role == 'admin'"><a href="/admin/dashboard">Admin dashboard</a></li> 129 <li ng-if="user.role == 'admin'"><a href="/admin/mac-app-stats">Mac app stats</a></li> 130 <li ng-if="user.role == 'admin'"><a href="/admin/comments">Comments review</a></li> 131 <li ng-if="user.role == 'admin'"><a href="/admin/screenshots">Screenshot review</a></li> 132 <li ng-if="user.role == 'admin'"><a href="/admin/tags">Tag manager</a></li> 133 <li ng-if="user.role == 'admin'"><a href="/admin/itunes-importer">iTunes Importer</a></li> 134 <li ng-if="user.role == 'admin'" class="divider"></li> 135 136 <li><a href="{{getLogoutUrl()}}" ng-click="logout($event)">Log out</a></li> 137 </ul> 138 </li> 139 140 <li ng-if="!user"> <a href="{{getRegisterUrl()}}" class="account-register">Register</a> </li> 141 <li ng-if="!user"> <a href="{{getLoginUrl()}}" class="account-signin">Sign in</a> </li> 142 </ul> 143 </nav> 144 145 </div> 146 </header> 147 <section id="main" ng-controller="AccountPageCtrl" ng-class="{'overlay-in': state.overlayIn }"> 148 149 150 151<div class="ng-wrapper" ng-cloak> 152 153 <div class="container"> 154 <div class="row "> 155 <div class="col-xs-12"> 156 157 <ol class="breadcrumb"> 158 <li><a href="/">Home</a></li> 159 <li><a href="/account">Account</a></li> 160 </ol> 161 162 <div class="page-header underline transparent tab-bar"> 163 <h1>Preferences</h1> 164 <a href="/account/watching">Notifications</a> 165 <a href="/account/favourites">Favourites</a> 166 <a href="/account/installed">Installed Apps</a> 167 </div> 168 </div> 169 170 </div> 171 172 <div class="row"> 173 <div class="col-xs-12" class="text-centre" ng-if="user">
174 <a href="/account/favourites" class="btn">Favourites</a> 175 <a href="/apps?installed" class="btn">Installed applications</a> 176 <a href="/account/watching" class="btn">App notifications</a> 177 <!--<button class="btn">My status reports</button>--> 178 </div> 179 </div> 180 181 <hr class="invisible" /> 182 183 <div class="row"> 184 <div class="col-xs-12 col-sm-6 col-md-4" ng-if="user"> 185 <div class="border-box"> 186 <h3>Account details</h3> 187 <div class="form-group"> 188 <label>Username</label> 189 <input type="text" name="username" ng-model="user.username" disabled /> 190 </div> 191 <div class="form-group"> 192 <label>Email</label> 193 <input type="email" name="email" ng-model="user.email" disabled /> 194 </div> 195 </div> 196 197 <div class="border-box"> 198 <h3>Change email</h3> 199 <form> 200 <div class="form-group"> 201 <label for="acc-change-email-new-email">New email</label> 202 <input type="email" id="acc-change-email-new-email" ng-model="form.changeEmail.newEmail" required /> 203 </div> 204 <div class="form-group"> 205 <label for="acc-change-email-password">Password</label> 206 <input type="password" id="acc-change-email-password" ng-model="form.changeEmail.password" required /> 207 </div> 208 209 <div class="form-group"> 210 <button class="btn btn-outline" ng-click="changeEmail()" ng-hide="form.changeEmail.waiting">Change email</button> 211 <div class="btn btn-outline modal-button-loader" ng-show="form.changeEmail.waiting"> 212 <div class="spinner spinner-three-dots faster"> 213 <div class="bounce1"></div> 214 <div class="bounce2"></div> 215 <div class="bounce3"></div> 216 </div> 217 </div> 218 </div> 219 <div class="form-group"> 220 <p class="msg error" ng-if="form.changeEmail.errorMsg">{{form.changeEmail.errorMsg}}</p> 221 <p class="msg success" ng-if="form.changeEmail.successMsg">{{form.changeEmail.successMsg}}</p> 222 </div> 223 </form>
224 </div> 225 226 <div class="border-box"> 227 <h3>Change password</h3> 228 <form> 229 <div class="form-group"> 230 <label for="acc-current-password">Current password</label> 231 <input type="password" id="acc-current-password" ng-model="form.password.current" /> 232 </div> 233 <div class="form-group"> 234 <label for="acc-new-password">New password</label> 235 <input type="password" id="acc-new-password" ng-model="form.password.new" /> 236 </div> 237 <div class="form-group"> 238 <button class="btn btn-outline" ng-click="changePassword()" ng-hide="form.password.waiting">Change password</button> 239 <div class="btn btn-outline modal-button-loader" ng-show="form.password.waiting"> 240 <div class="spinner spinner-three-dots faster"> 241 <div class="bounce1"></div> 242 <div class="bounce2"></div> 243 <div class="bounce3"></div> 244 </div> 245 </div> 246 </div> 247 <div class="form-group"> 248 <p class="msg error" ng-if="form.password.errorMsg">{{form.password.errorMsg}}</p> 249 <p class="msg success" ng-if="form.password.successMsg">{{form.password.successMsg}}</p> 250 </div> 251 </form>
252 </div> 253 254 255 </div> 256 257 <div class="col-xs-12 col-sm-6 col-md-4"> 258 <div class="border-box"> 259 <h3>Site preferences</h3> 260 <form> 261 <div class="form-group"> 262 <label for="account-select-appstore-currency">App Store Currency</label> 263 <select class="form-select" name="account-select-appstore-currency" id="account-select-appstore-currency" ng-model="user.preferences.appstore_currency" ng-options="c.code as (c.code + ' â ' + c.name) for c in APPSTORE_CURRENCY_CODES"> 264 </select> 265 </div> 266 <div class="form-group"> 267 <label for="account-apps-table-rows">Apps per page on compatibility table</label> 268 <select class="form-select" name="account-apps-table-rows" id="account-apps-table-rows" ng-model="user.preferences.table_rows" ng-options="n for n in [10,25,50,100]"> 269 </select> 270 </div> 271 <div class="form-group"> 272 <label for="account-table-default-filter">Default filter on compatibility table</label> 273 <select class="form-select" name="account-table-default-filter" id="account-table-default-filter" ng-model="user.preferences.table_default_filter" ng-options="n.name as n.title for n in [{name:'all', title:'All apps'}, {name:'installed', title:'Installed'}, {name:'favourites',title: 'Favourites'}]"> 274 </select> 275 </div> 276 277 <div class="form-group"> 278 <button class="btn btn-outline" ng-click="savePreferences()">Save</button> 279 </div> 280 <div class="form-group"> 281 <p class="msg error" ng-if="form.preferences.errorMsg">{{form.preferences.errorMsg}}</p> 282 <p class="msg success" ng-if="form.preferences.successMsg">{{form.preferences.successMsg}}</p> 283 </div> 284 285 </form>
286 </div> 287 </div> 288 289 <div class="col-xs-12 col-sm-6 col-md-4"> 290 <div class="border-box"> 291 <h3>Reset</h3> 292 <p><button class="btn btn-outline btn-danger" ng-click="clearCache()">Clear cache</button></p> 293 <p class="control-hint">RoaringApps keeps a copy of application and developer data on your computer to make the site quicker and to reduce the amount of bandwidth used over time.</p> 294 <p class="control-hint">Unfortunately sometimes this local cache can become corrupted. If the site isn't working properly, or if you think the data shown is not up to date, you can clear the cache and start again from scratch.</p> 295 <div class="form-group"><p class="msg success" ng-if="state.clearCacheComplete">The cache has been cleared.</p></div> 296 </div> 297 </div> 298 299 </div> <!-- /.row --> 300 </div> <!-- /.container --> 301 302 303 304</div> 305 306 </section> 307 308 <!-- Footer --> 309 <footer role="contentinfo"> 310 <div class="container"> 311 312 <div class="row"> 313 <div class="col-md-6"> 314 <p><i>â</i> by Bryce Cameron since 10.7. 315 316 <!-- <a class="bmc-button" target="_blank" href="https://www.buymeacoffee.com/roaringapps?ref=rawf" style="align-items: center;"><span>Buy me a coffee</span><img src="https://cdn.buymeacoffee.com/buttons/bmc-new-btn-logo.svg" alt="Buy me a coffee"></a> --> 317 318 <a class="bmc-button" target="_blank" href="https://www.buymeacoffee.com/roaringapps"> 319 <img src="https://cdn.buymeacoffee.com/widget/assets/coffee%20cup.svg" alt="Support RoaringApps"> 320 <span>Buy me a coffee</span> 321 </a> 322 </p> 323 </div> 324 <div class="col-md-6"> 325 <p class="pull-right"><a href="/">Home</a> · <a href="/about">About</a> · <a href="/newsletter/join">Newsletter</a> · <a href="/help/contribute-to-roaringapps">Contribute</a> · <a href="/contact">Contact</a> · <a href="/account">Account</a> · <a href="/legal">Legal</a></p> 326 </div> 327 </div> <!-- /.row --> 328 329 </div> 330 </footer> 331 332 <!--
332<script data-name="BMC-Widget" data-cfasync="false" src="https://cdnjs.buymeacoffee.com/1.0.0/widget.prod.min.js" data-id="roaringapps" data-description="Support me on Buy me a coffee!" data-message="" data-color="#FF5F5F" data-position="Right" data-x_margin="18" data-y_margin="18"></script>
332 --> 333 </div> 334 335 <!-- Modals --> 336 <section class="the-modals" ng-controller="ModalCtrl"> 337 <!-- Sign In --> 338 <div class="modal fade narrow" id="modal-signin" tabindex="-1" role="dialog" aria-labelledby="modal-label-signin" aria-hidden="true"> 339 <div class="modal-dialog"> 340 <p class="modal-outside-meta modal-msg" ng-if="signinModalMsg">{{signinModalMsg}}</p> 341 <div class="modal-content"> 342 <div class="modal-body"> 343 344 <form id="form-signin" ng-submit="login.submit()"> 345 <div class="gravatar"></div> 346 347 <input type="email" name="signin-email" ng-model="form.login.email" placeholder="Email address" /> 348 <input type="password" name="signin-password" ng-model="form.login.password" placeholder="Password" /> 349 350 <button class="btn btn-action" action="submit" name="signin-submit" ng-hide="login.submitting"><span>Sign in</span></button> 351 <div class="btn btn-action modal-button-loader" ng-show="login.submitting"> 352 <div class="spinner spinner-three-dots faster"> 353 <div class="bounce1"></div> 354 <div class="bounce2"></div> 355 <div class="bounce3"></div> 356 </div> 357 </div> 358 </form> 359 </div> 360 </div> <!-- /.modal-content --> 361 <p class="modal-outside-meta"><a href="/account/forgot">Forgot?</a> <a class="pull-right" ng-href="{{getRegisterUrl()}}"><strong>Create an account</strong></a></p> 362 </div> 363 </div> 364 365 <!-- Register / Create account --> 366 <div class="modal fade narrow" id="modal-register" tabindex="-1" role="dialog" aria-labelledby="modal-label-register" aria-hidden="true"> 367 <div class="modal-dialog"> 368 <div class="modal-content"> 369 <div class="modal-body"> 370 371 <form id="form-register" ng-submit="register.submit()"> 372 <div class="gravatar"></div> 373 374 <input type="email" name="register-email" ng-model="form.register.email" placeholder="Email address" /> 375 <input type="text" name="register-username" ng-model="form.register.username" placeholder="Username" /> 376 <input type="password" name="register-password" ng-model="form.register.password" placeholder="Password" /> 377 378 <button class="btn btn-action" action="submit" name="register-submit" ng-hide="register.submitting"><span>Create account</span></button> 379 <div class="btn btn-action modal-button-loader" ng-show="register.submitting"> 380 <div class="spinner spinner-three-dots faster"> 381 <div class="bounce1"></div> 382 <div class="bounce2"></div> 383 <div class="bounce3"></div> 384 </div> 385 </div> 386 </form> 387 </div> 388 </div> <!-- /.modal-content --> 389 <p class="modal-outside-meta">{{register.errors.join(' ')}}</p> 390 </div> 391 </div> 392 393 <!-- Search --> 394 <div class="modal fade search-modal" id="modal-search" tabindex="-1" role="dialog" aria-labelledby="modal-label-search" aria-hidden="true"> 395 <div class="modal-dialog"> 396 <div class="modal-content"> 397 <div class="modal-body"> 398 399 <form id="form-search"> 400 <input type="search" id="search-input" name="search" ng-model="form.search.query" placeholder="Search applications" autocomplete="off" /> 401 <span class="search-result-count" ng-show="search.results.length > 0">{{search.results.length}} apps</span> 402 </form> 403 404 <p class="search-msg" ng-show="search.searching">Searching...</p> 405 <p class="search-msg" ng-show="search.empty">No results</p> 406 407 <ul class="search-results"> 408 <li class="result" ng-repeat="app in search.results | orderBy:'-_searchRank'"> 409 <a href="/app/{{app.slug}}"> 410 <img ng-src="{{app.icon}}" alt="{{app.icon ? app.name + ' icon' : 'No icon'}}" class="{{app.icon ? 'search-result-has-icon' : 'search-result-no-icon'}}" onerror="this.style.display='none'" /> 411 <strong>{{app.name}}</strong> 412 <span class="dev">{{app.developer}}</span> 413 </a> 414 </li> 415 </ul> 416 417 </div> 418 </div> <!-- /.modal-content --> 419 <p class="modal-outside-meta">{{register.errors.join(' ')}}</p> 420 </div> 421 </div> 422 423 <!-- Moderate --> 424 <div class="modal fade" id="modal-moderate" tabindex="-1" role="dialog" aria-labelledby="modal-label-moderate" aria-hidden="true"> 425 <div class="modal-dialog"> 426 <div class="modal-content"> 427 <div class="modal-header"> 428 <h4>Moderator control panel</h4> 429 </div> 430 <div class="modal-body"> 431 432 <form id="form-moderate"> 433 <div class="row"> 434 <div class="col-xs-12 col-sm-6"> 435 <div class="form-group"> 436 <label for="moderate-app-name">Application</label> 437 <input type="text" name="moderate-app-name" id="moderate-app-name" ng-model="selectedApp.name" disabled /> 438 </div> 439 </div> 440 <div class="col-xs-12 col-sm-6"> 441 <div class="form-group"> 442 <label for="moderate-app-slug">Slug</label> 443 <input type="text" name="moderate-app-slug" id="moderate-app-slug" ng-model="selectedApp.slug" disabled /> 444 </div> 445 </div> 446 <div class="col-xs-12 col-sm-6"> 447 <div class="form-group"> 448 <label for="moderate-app-developer">Developer</label> 449 <input type="text" name="moderate-app-developer" id="moderate-app-developer" ng-model="selectedApp.developer" disabled /> 450 </div> 451 </div> 452 <div class="col-xs-12 col-sm-6"> 453 <div class="form-group"> 454 <label for="moderate-app-url">URL</label> 455 <input type="text" name="moderate-app-url" id="moderate-app-url" ng-model="selectedApp.url" disabled /> 456 </div> 457 </div> 458 </div> 459 460 <div class="form-group"> 461 <p ng-if="!selectedApp.statuses">This application has no status reports.</p> 462 </div> 463 464 465 466 467 <div class="form-group"> 468 <button class="btn btn-outline btn-danger" ng-click="moderate.delete(selectedApp.slug)">Delete app</button> 469 <button class="btn btn-outline" ng-click="moderate.merge.chooseTo(selectedApp.slug)">Merge with...</button> 470 <button class="btn btn-outline" ng-click="moderate.appCollection.add(selectedApp.slug)">Add to collection...</button> 471 <button class="btn btn-outline">Update</button> 472 </div> 473 </form> 474 475 476 </div> 477 </div> <!-- /.modal-content --> 478 <p class="modal-outside-meta">For use only by approved RoaringApps moderators.</p> 479 </div> 480 </div> 481 482 <!-- Feedback --> 483 <div class="modal fade" id="modal-feedback" tabindex="-1" role="dialog" aria-labelledby="modal-label-feedback" aria-hidden="true"> 484 <div class="modal-dialog"> 485 <div class="modal-content"> 486 <div class="modal-header"> 487 <h4>Submit Feedback</h4> 488 </div> 489 <div class="modal-body"> 490 <p>I develop RoaringApps in my (rather limited) spare time, so sometimes I miss bugs here and there. If you notice something not quite working properly, or have an idea for the site, I'd love to hear from you.</p> 491 <form id="form-feedback" name="feedbackForm" ng-submit="feedback.submit(feedbackForm.$valid)" novalidate> <!-- novalidate disables HTML5 validation, so we can use the angular val
491idation --> 492 <div class="row"> 493 <div class="col-xs-12 col-sm-6"> 494 <div class="form-group"> 495 <label for="feedback-name">Name</label> 496 <input type="text" name="feedback-name" id="feedback-name" ng-model="form.feedback.name" required /> 497 </div> 498 </div> 499 <div class="col-xs-12 col-sm-6"> 500 <div class="form-group"> 501 <label for="feedback-email">Email (optional)</label> 502 <input type="email" name="feedback-email" id="feedback-email" ng-model="form.feedback.email" /> 503 </div> 504 </div> 505 </div> 506 <div class="form-group" style="position: absolute; left: -5000px;" aria-hidden="true"> 507 <label for="feedback-website">Website</label> 508 <input type="text" name="feedback-website" id="feedback-website" ng-model="form.feedback.website" tabindex="-1" autocomplete="off" /> 509 </div> 510 <div class="form-group"> 511 <label for="feedback-comment">Comment</label> 512 <textarea id="feedback-comment" ng-model="form.feedback.comment" required></textarea> 513 </div> 514 <div class="form-group form-action-area"> 515 <input type="submit" value="Send feedback" class="btn btn-outline" ng-disabled="feedbackForm.$invalid" /> 516 </div> 517 <div class="form-group"> 518 <p class="msg error" ng-if="feedback.errorMsg">{{feedback.errorMsg}}</p> 519 <p class="msg success" ng-if="feedback.successMsg">{{feedback.successMsg}}</p> 520 </div> 521 </form> 522 523 524 </div> 525 </div> <!-- /.modal-content --> 526 </div> 527 </div> 528 529 <!-- Report comment --> 530 <div class="modal fade" id="modal-report-comment" tabindex="-1" role="dialog" aria-labelledby="modal-label-report-comment" aria-hidden="true"> 531 <div class="modal-dialog"> 532 <div class="modal-content"> 533 <div class="modal-header"> 534 <h4>Report comment</h4> 535 </div> 536 <div class="modal-body"> 537 <p>Report this comment to help the moderators identify items that require attention.</p> 538 <form id="form-report-comment" name="reportCommentForm" ng-submit="reportComment.submit(reportCommentForm.$valid)" novalidate> 539 <!-- novalidate disables HTML5 validation, so we can use the angular validation --> 540 <div class="row"> 541 <div class="col-xs-12"> 542 <div class="form-group"> 543 <label for="report-comment-reason">Reason</label> 544 <select name="report-comment-reason" id="report-comment-reason" ng-model="form.reportComment.reason" required> 545 <option>Invalid advice</option> 546 <option>Illegal/inappropriate</option> 547 <option>Off-topic</option> 548 <option>Personal attack</option> 549 <option>Spam</option> 550 <option>Other</option> 551 </select> 552 </div> 553 </div> 554 <div class="col-xs-12"> 555 <div class="form-group"> 556 <label for="report-comment-description">Description (optional)</label> 557 <textarea id="report-comment-description" ng-model="form.reportComment.description"></textarea> 558 </div> 559 </div> 560 561 <div class="col-xs-12"> 562 <div class="form-group form-action-area"> 563 <input type="submit" value="Submit report" class="btn btn-outline" ng-disabled="reportCommentForm.$invalid" /> 564 </div> 565 <div class="form-group"> 566 <p class="msg error" ng-if="reportComment.errorMsg">{{reportComment.errorMsg}}</p> 567 <p class="msg success" ng-if="reportComment.successMsg">{{reportComment.successMsg}}</p> 568 </div> 569 </div> 570 </div> <!-- /.row --> 571 572 </form> 573 574 575 </div> 576 </div> <!-- /.modal-content --> 577 </div> 578 </div> <!-- /.modal (report comment) --> 579 580 581 </section> 582 <!-- JS and analytics only. --> 583 584
584<script src="/assets/js/production-2131.js"></script>
584 585 586
586<script> 587 if(typeof lucide !== undefined) lucide.createIcons(); 588 </script>
588
588<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"cf8706b74b324e67b083263fb22c492a","r":1,"spa":2}' crossorigin="anonymous"></script>
588 589</body> 590</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.