[{"data":1,"prerenderedAt":12092},["ShallowReactive",2],{"navigation":3,"/authentication-and-authorization/login-and-logout":1016,"/authentication-and-authorization/login-and-logout-surround":12087},[4,54,89,123,165,211,253,331,389,439,462,488,514,540,578,624,650,672,702,736,774,800,850,856,862,868,874,928],{"title":5,"path":6,"stem":7,"children":8},"Introduction and Foundations","/introduction-and-foundations","01.introduction-and-foundations/01.index",[9,10,14,18,22,26,30,34,38,42,46,50],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"What is Django","/introduction-and-foundations/what-is-django","01.introduction-and-foundations/02.what-is-django",{"title":15,"path":16,"stem":17},"Key Concepts and Philosophy","/introduction-and-foundations/key-concepts-and-philosophy","01.introduction-and-foundations/03.key-concepts-and-philosophy",{"title":19,"path":20,"stem":21},"MVC vs MVT: Understanding Django's Architecture","/introduction-and-foundations/mvc-vs-mvt","01.introduction-and-foundations/04.mvc-vs-mvt",{"title":23,"path":24,"stem":25},"Project Structure Overview","/introduction-and-foundations/project-structure-overview","01.introduction-and-foundations/05.project-structure-overview",{"title":27,"path":28,"stem":29},"Installing Django","/introduction-and-foundations/installing-django","01.introduction-and-foundations/06.installing-django",{"title":31,"path":32,"stem":33},"Creating Your First Django Project","/introduction-and-foundations/creating-first-project","01.introduction-and-foundations/07.creating-first-project",{"title":35,"path":36,"stem":37},"Creating Your First Django App","/introduction-and-foundations/creating-first-app","01.introduction-and-foundations/08.creating-first-app",{"title":39,"path":40,"stem":41},"Your First Django \"Hello World\"","/introduction-and-foundations/hello-world","01.introduction-and-foundations/09.hello-world",{"title":43,"path":44,"stem":45},"Django Quick Start Guide","/introduction-and-foundations/quick-start-guide","01.introduction-and-foundations/10.quick-start-guide",{"title":47,"path":48,"stem":49},"How Django Handles Requests","/introduction-and-foundations/how-django-handles-requests","01.introduction-and-foundations/11.how-django-handles-requests",{"title":51,"path":52,"stem":53},"Django Settings","/introduction-and-foundations/django-settings","01.introduction-and-foundations/12.django-settings",{"title":55,"path":56,"stem":57,"children":58},"The Development Environment","/development-environment","02.development-environment/1.index",[59,61,65,69,73,77,81,85],{"title":60,"path":56,"stem":57},"Development Environment",{"title":62,"path":63,"stem":64},"Recommended Tooling for Django Development","/development-environment/recommended-tooling","02.development-environment/2.recommended-tooling",{"title":66,"path":67,"stem":68},"Virtual Environments","/development-environment/virtual-environments","02.development-environment/3.virtual-environments",{"title":70,"path":71,"stem":72},"Django Admin and Management Commands","/development-environment/admin-and-management-commands","02.development-environment/4.admin-and-management-commands",{"title":74,"path":75,"stem":76},"Django Project Settings","/development-environment/project-settings","02.development-environment/5.project-settings",{"title":78,"path":79,"stem":80},"Managing Django Environments: Local, Staging, and Production","/development-environment/environments-local-staging-production","02.development-environment/6.environments-local-staging-production",{"title":82,"path":83,"stem":84},"Running Django Development Server","/development-environment/running-development-server","02.development-environment/7.running-development-server",{"title":86,"path":87,"stem":88},"Working with Django Shell","/development-environment/working-with-shell","02.development-environment/8.working-with-shell",{"title":90,"path":91,"stem":92,"children":93},"Templates and Presentation Layer","/templates-and-presentation","03.templates-and-presentation/1.index",[94,95,99,103,107,111,115,119],{"title":90,"path":91,"stem":92},{"title":96,"path":97,"stem":98},"Introduction to Django Templates","/templates-and-presentation/introduction-to-templates","03.templates-and-presentation/2.introduction-to-templates",{"title":100,"path":101,"stem":102},"The Django Template Language","/templates-and-presentation/django-template-language","03.templates-and-presentation/3.django-template-language",{"title":104,"path":105,"stem":106},"Template Inheritance","/templates-and-presentation/template-inheritance","03.templates-and-presentation/4.template-inheritance",{"title":108,"path":109,"stem":110},"Built-in Template Tags and Filters","/templates-and-presentation/built-in-template-tags-and-filters","03.templates-and-presentation/5.built-in-template-tags-and-filters",{"title":112,"path":113,"stem":114},"Including Static Files","/templates-and-presentation/including-static-files","03.templates-and-presentation/6.including-static-files",{"title":116,"path":117,"stem":118},"Working with Media Files","/templates-and-presentation/working-with-media-files","03.templates-and-presentation/7.working-with-media-files",{"title":120,"path":121,"stem":122},"Using Alternative Template Engines","/templates-and-presentation/using-alternative-template-engines","03.templates-and-presentation/8.using-alternative-template-engines",{"title":124,"path":125,"stem":126,"children":127},"URLs and Views","/urls-and-views","04.urls-and-views/01.index",[128,129,133,137,141,145,149,153,157,161],{"title":124,"path":125,"stem":126},{"title":130,"path":131,"stem":132},"The URL Dispatcher","/urls-and-views/the-url-dispatcher","04.urls-and-views/02.the-url-dispatcher",{"title":134,"path":135,"stem":136},"Writing Function-Based Views","/urls-and-views/writing-function-based-views","04.urls-and-views/03.writing-function-based-views",{"title":138,"path":139,"stem":140},"View Decorators","/urls-and-views/view-decorators","04.urls-and-views/04.view-decorators",{"title":142,"path":143,"stem":144},"Rendering Responses","/urls-and-views/rendering-responses","04.urls-and-views/05.rendering-responses",{"title":146,"path":147,"stem":148},"Redirects","/urls-and-views/redirects","04.urls-and-views/06.redirects",{"title":150,"path":151,"stem":152},"Handling HTTP Methods","/urls-and-views/handling-http-methods","04.urls-and-views/07.handling-http-methods",{"title":154,"path":155,"stem":156},"Conditional View Processing","/urls-and-views/conditional-view-processing","04.urls-and-views/08.conditional-view-processing",{"title":158,"path":159,"stem":160},"File Uploads","/urls-and-views/file-uploads","04.urls-and-views/09.file-uploads",{"title":162,"path":163,"stem":164},"Using Django Shortcut Functions","/urls-and-views/using-django-shortcut-functions","04.urls-and-views/10.using-django-shortcut-functions",{"title":166,"path":167,"stem":168,"children":169},"Class Based Views","/class-based-views","05.class-based-views/01.index",[170,171,175,179,183,187,191,195,199,203,207],{"title":166,"path":167,"stem":168},{"title":172,"path":173,"stem":174},"Introduction to Class-Based Views","/class-based-views/introduction-to-class-based-views","05.class-based-views/02.introduction-to-class-based-views",{"title":176,"path":177,"stem":178},"Common Base Classes","/class-based-views/common-base-classes","05.class-based-views/03.common-base-classes",{"title":180,"path":181,"stem":182},"Built-in Generic Views","/class-based-views/built-in-generic-views","05.class-based-views/04.built-in-generic-views",{"title":184,"path":185,"stem":186},"Views for CRUD Operations","/class-based-views/views-for-crud-operations","05.class-based-views/05.views-for-crud-operations",{"title":188,"path":189,"stem":190},"Handling Forms with Class-Based Views","/class-based-views/handling-forms-with-class-based-views","05.class-based-views/06.handling-forms-with-class-based-views",{"title":192,"path":193,"stem":194},"Using Mixins","/class-based-views/using-mixins","05.class-based-views/07.using-mixins",{"title":196,"path":197,"stem":198},"URL Configuration with Class-Based Views","/class-based-views/url-configuration-with-class-based-views","05.class-based-views/08.url-configuration-with-class-based-views",{"title":200,"path":201,"stem":202},"Subclassing Generic Views","/class-based-views/subclassing-generic-views","05.class-based-views/09.subclassing-generic-views",{"title":204,"path":205,"stem":206},"Asynchronous Class-Based Views","/class-based-views/asynchronous-class-based-views","05.class-based-views/10.asynchronous-class-based-views",{"title":208,"path":209,"stem":210},"Pagination","/class-based-views/pagination","05.class-based-views/11.pagination",{"title":212,"path":213,"stem":214,"children":215},"Forms and User Input","/forms-and-user-input","06.forms-and-user-input/01.index",[216,217,221,225,229,233,237,241,245,249],{"title":212,"path":213,"stem":214},{"title":218,"path":219,"stem":220},"Understanding HTML Forms","/forms-and-user-input/understanding-html-forms","06.forms-and-user-input/02.understanding-html-forms",{"title":222,"path":223,"stem":224},"Django's Role in Form Handling","/forms-and-user-input/djangos-role-in-form-handling","06.forms-and-user-input/03.djangos-role-in-form-handling",{"title":226,"path":227,"stem":228},"Creating Forms with Forms API","/forms-and-user-input/creating-forms-with-forms-api","06.forms-and-user-input/04.creating-forms-with-forms-api",{"title":230,"path":231,"stem":232},"Form Validation","/forms-and-user-input/form-validation","06.forms-and-user-input/05.form-validation",{"title":234,"path":235,"stem":236},"Built-in Fields and Widgets","/forms-and-user-input/built-in-fields-and-widgets","06.forms-and-user-input/06.built-in-fields-and-widgets",{"title":238,"path":239,"stem":240},"Form Rendering in Templates","/forms-and-user-input/form-rendering-in-templates","06.forms-and-user-input/07.form-rendering-in-templates",{"title":242,"path":243,"stem":244},"Model Forms","/forms-and-user-input/model-forms","06.forms-and-user-input/08.model-forms",{"title":246,"path":247,"stem":248},"Advanced Form Techniques","/forms-and-user-input/advanced-form-techniques","06.forms-and-user-input/09.advanced-form-techniques",{"title":250,"path":251,"stem":252},"Security Considerations for Forms","/forms-and-user-input/security-considerations-for-forms","06.forms-and-user-input/10.security-considerations-for-forms",{"title":254,"path":255,"stem":256,"children":257},"Models and Databases","/models-and-databases","07.models-and-databases/01.index",[258,259,263,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327],{"title":254,"path":255,"stem":256},{"title":260,"path":261,"stem":262},"Understanding Django Models","/models-and-databases/understanding-django-models","07.models-and-databases/02.understanding-django-models",{"title":264,"path":265,"stem":266},"Defining Fields","/models-and-databases/defining-fields","07.models-and-databases/03.defining-fields",{"title":268,"path":269,"stem":270},"Relationships and Foreign Keys","/models-and-databases/relationships-and-foreign-keys","07.models-and-databases/04.relationships-and-foreign-keys",{"title":272,"path":273,"stem":274},"Examples of Relationship Patterns","/models-and-databases/examples-of-relationship-patterns","07.models-and-databases/05.examples-of-relationship-patterns",{"title":276,"path":277,"stem":278},"Making Queries","/models-and-databases/making-queries","07.models-and-databases/06.making-queries",{"title":280,"path":281,"stem":282},"Filtering, Ordering, and Slicing","/models-and-databases/filtering-ordering-slicing","07.models-and-databases/07.filtering-ordering-slicing",{"title":284,"path":285,"stem":286},"Managers and QuerySets","/models-and-databases/managers-and-querysets","07.models-and-databases/08.managers-and-querysets",{"title":288,"path":289,"stem":290},"Aggregation","/models-and-databases/aggregation","07.models-and-databases/09.aggregation",{"title":292,"path":293,"stem":294},"Search","/models-and-databases/search","07.models-and-databases/10.search",{"title":296,"path":297,"stem":298},"Raw SQL Queries","/models-and-databases/raw-sql-queries","07.models-and-databases/11.raw-sql-queries",{"title":300,"path":301,"stem":302},"Transactions","/models-and-databases/transactions","07.models-and-databases/12.transactions",{"title":304,"path":305,"stem":306},"Multiple Databases","/models-and-databases/multiple-databases","07.models-and-databases/13.multiple-databases",{"title":308,"path":309,"stem":310},"Tablespaces","/models-and-databases/tablespaces","07.models-and-databases/14.tablespaces",{"title":312,"path":313,"stem":314},"Composite Primary Keys","/models-and-databases/composite-primary-keys","07.models-and-databases/15.composite-primary-keys",{"title":316,"path":317,"stem":318},"Database Instrumentation","/models-and-databases/database-instrumentation","07.models-and-databases/16.database-instrumentation",{"title":320,"path":321,"stem":322},"Database Optimization","/models-and-databases/database-optimization","07.models-and-databases/17.database-optimization",{"title":324,"path":325,"stem":326},"Fixtures","/models-and-databases/fixtures","07.models-and-databases/18.fixtures",{"title":328,"path":329,"stem":330},"Signals","/models-and-databases/signals","07.models-and-databases/19.signals",{"title":332,"path":333,"stem":334,"children":335},"Migrations","/migrations","08.migrations/01.index",[336,337,341,345,349,353,357,361,365,369,373,377,381,385],{"title":332,"path":333,"stem":334},{"title":338,"path":339,"stem":340},"How Migrations Work","/migrations/how-migrations-work","08.migrations/02.how-migrations-work",{"title":342,"path":343,"stem":344},"Management Commands","/migrations/management-commands","08.migrations/03.management-commands",{"title":346,"path":347,"stem":348},"Dependencies and Workflow","/migrations/dependencies-and-workflow","08.migrations/04.dependencies-and-workflow",{"title":350,"path":351,"stem":352},"Transaction Handling","/migrations/transaction-handling","08.migrations/05.transaction-handling",{"title":354,"path":355,"stem":356},"Adding Migrations to Apps","/migrations/adding-migrations-to-apps","08.migrations/06.adding-migrations-to-apps",{"title":358,"path":359,"stem":360},"Reversing Migrations","/migrations/reversing-migrations","08.migrations/07.reversing-migrations",{"title":362,"path":363,"stem":364},"Historical Models","/migrations/historical-models","08.migrations/08.historical-models",{"title":366,"path":367,"stem":368},"Considerations When Removing Fields","/migrations/considerations-when-removing-fields","08.migrations/09.considerations-when-removing-fields",{"title":370,"path":371,"stem":372},"Data Migrations","/migrations/data-migrations","08.migrations/10.data-migrations",{"title":374,"path":375,"stem":376},"Squashing Migrations","/migrations/squashing-migrations","08.migrations/11.squashing-migrations",{"title":378,"path":379,"stem":380},"Serializing Values","/migrations/serializing-values","08.migrations/12.serializing-values",{"title":382,"path":383,"stem":384},"Supporting Multiple Django Versions","/migrations/supporting-multiple-django-versions","08.migrations/13.supporting-multiple-django-versions",{"title":386,"path":387,"stem":388},"Django Serialization Framework","/migrations/django-serialization-framework","08.migrations/14.django-serialization-framework",{"title":390,"path":391,"stem":392,"children":393},"Authentication and Authorization","/authentication-and-authorization","09.authentication-and-authorization/01.index",[394,395,399,403,407,411,415,419,423,427,431,435],{"title":390,"path":391,"stem":392},{"title":396,"path":397,"stem":398},"Overview of Django's Authentication System","/authentication-and-authorization/overview-of-django-authentication-system","09.authentication-and-authorization/02.overview-of-django-authentication-system",{"title":400,"path":401,"stem":402},"Users and Groups","/authentication-and-authorization/users-and-groups","09.authentication-and-authorization/03.users-and-groups",{"title":404,"path":405,"stem":406},"Permissions","/authentication-and-authorization/permissions","09.authentication-and-authorization/04.permissions",{"title":408,"path":409,"stem":410},"Password Management","/authentication-and-authorization/password-management","09.authentication-and-authorization/05.password-management",{"title":412,"path":413,"stem":414},"Authentication Views","/authentication-and-authorization/authentication-views","09.authentication-and-authorization/06.authentication-views",{"title":416,"path":417,"stem":418},"Login and Logout","/authentication-and-authorization/login-and-logout","09.authentication-and-authorization/07.login-and-logout",{"title":420,"path":421,"stem":422},"Custom User Models","/authentication-and-authorization/custom-user-models","09.authentication-and-authorization/08.custom-user-models",{"title":424,"path":425,"stem":426},"Middleware for Authentication","/authentication-and-authorization/middleware-for-authentication","09.authentication-and-authorization/09.middleware-for-authentication",{"title":428,"path":429,"stem":430},"Authorization in Views and Templates","/authentication-and-authorization/authorization-in-views-and-templates","09.authentication-and-authorization/10.authorization-in-views-and-templates",{"title":432,"path":433,"stem":434},"Integrating Social Authentication","/authentication-and-authorization/integrating-social-authentication","09.authentication-and-authorization/11.integrating-social-authentication",{"title":436,"path":437,"stem":438},"Security Best Practices","/authentication-and-authorization/security-best-practices","09.authentication-and-authorization/12.security-best-practices",{"title":440,"path":441,"stem":442,"children":443},"Sessions, Cookies, and State","/sessions-cookies-state","10.sessions-cookies-state/01.index",[444,446,450,454,458],{"title":445,"path":441,"stem":442},"Sessions, Cookies, and State Management",{"title":447,"path":448,"stem":449},"Introduction to Sessions","/sessions-cookies-state/introduction-to-sessions","10.sessions-cookies-state/02.introduction-to-sessions",{"title":451,"path":452,"stem":453},"Working with Cookies","/sessions-cookies-state/working-with-cookies","10.sessions-cookies-state/03.working-with-cookies",{"title":455,"path":456,"stem":457},"Server-Side Session Storage Options","/sessions-cookies-state/server-side-session-storage-options","10.sessions-cookies-state/04.server-side-session-storage-options",{"title":459,"path":460,"stem":461},"Session Security","/sessions-cookies-state/session-security","10.sessions-cookies-state/05.session-security",{"title":463,"path":464,"stem":465,"children":466},"Working with Files","/working-with-files","11.working-with-files/01.index",[467,468,472,476,480,484],{"title":463,"path":464,"stem":465},{"title":469,"path":470,"stem":471},"Files in Models","/working-with-files/files-in-models","11.working-with-files/02.files-in-models",{"title":473,"path":474,"stem":475},"The File Object","/working-with-files/the-file-object","11.working-with-files/03.the-file-object",{"title":477,"path":478,"stem":479},"Storage Backends","/working-with-files/storage-backends","11.working-with-files/04.storage-backends",{"title":481,"path":482,"stem":483},"Using Cloud Storage Providers","/working-with-files/using-cloud-storage-providers","11.working-with-files/05.using-cloud-storage-providers",{"title":485,"path":486,"stem":487},"Managing Media in Production","/working-with-files/managing-media-in-production","11.working-with-files/06.managing-media-in-production",{"title":489,"path":490,"stem":491,"children":492},"Admin Site","/admin-site","12.admin-site/01.index",[493,494,498,502,506,510],{"title":489,"path":490,"stem":491},{"title":495,"path":496,"stem":497},"Enabling the Admin","/admin-site/enabling-the-admin","12.admin-site/02.enabling-the-admin",{"title":499,"path":500,"stem":501},"Registering Models","/admin-site/registering-models","12.admin-site/03.registering-models",{"title":503,"path":504,"stem":505},"Customizing Admin Display","/admin-site/customizing-admin-display","12.admin-site/04.customizing-admin-display",{"title":507,"path":508,"stem":509},"Admin Actions","/admin-site/admin-actions","12.admin-site/05.admin-actions",{"title":511,"path":512,"stem":513},"Admin Security Best Practices","/admin-site/admin-security-best-practices","12.admin-site/06.admin-security-best-practices",{"title":515,"path":516,"stem":517,"children":518},"Middleware","/middleware","13.middleware/01.index",[519,520,524,528,532,536],{"title":515,"path":516,"stem":517},{"title":521,"path":522,"stem":523},"Middleware Overview","/middleware/middleware-overview","13.middleware/02.middleware-overview",{"title":525,"path":526,"stem":527},"Built-in Middleware","/middleware/built-in-middleware","13.middleware/03.built-in-middleware",{"title":529,"path":530,"stem":531},"Creating Custom Middleware","/middleware/creating-custom-middleware","13.middleware/04.creating-custom-middleware",{"title":533,"path":534,"stem":535},"Middleware Ordering","/middleware/middleware-ordering","13.middleware/05.middleware-ordering",{"title":537,"path":538,"stem":539},"Performance and Debugging","/middleware/performance-and-debugging","13.middleware/06.performance-and-debugging",{"title":541,"path":542,"stem":543,"children":544},"Security","/security","14.security/01.index",[545,546,550,554,558,562,566,570,574],{"title":541,"path":542,"stem":543},{"title":547,"path":548,"stem":549},"Django Security Philosophy","/security/django-security-philosophy","14.security/02.django-security-philosophy",{"title":551,"path":552,"stem":553},"Cross Site Request Forgery","/security/cross-site-request-forgery","14.security/03.cross-site-request-forgery",{"title":555,"path":556,"stem":557},"Cross Site Scripting","/security/cross-site-scripting","14.security/04.cross-site-scripting",{"title":559,"path":560,"stem":561},"SQL Injection Protection","/security/sql-injection-protection","14.security/05.sql-injection-protection",{"title":563,"path":564,"stem":565},"Clickjacking Protection","/security/clickjacking-protection","14.security/06.clickjacking-protection",{"title":567,"path":568,"stem":569},"HTTPS Setup and HSTS","/security/https-setup-and-hsts","14.security/07.https-setup-and-hsts",{"title":571,"path":572,"stem":573},"Password Storage and Cryptography","/security/password-storage-and-cryptography","14.security/08.password-storage-and-cryptography",{"title":575,"path":576,"stem":577},"Secure Deployment Checklist","/security/secure-deployment-checklist","14.security/09.secure-deployment-checklist",{"title":579,"path":580,"stem":581,"children":582},"Testing","/testing","15.testing/01.index",[583,584,588,592,596,600,604,608,612,616,620],{"title":579,"path":580,"stem":581},{"title":585,"path":586,"stem":587},"Introduction to Django Testing","/testing/introduction-to-django-testing","15.testing/02.introduction-to-django-testing",{"title":589,"path":590,"stem":591},"Writing and Running Tests","/testing/writing-and-running-tests","15.testing/03.writing-and-running-tests",{"title":593,"path":594,"stem":595},"Test Tools","/testing/test-tools","15.testing/04.test-tools",{"title":597,"path":598,"stem":599},"Testing Models","/testing/testing-models","15.testing/05.testing-models",{"title":601,"path":602,"stem":603},"Testing Views","/testing/testing-views","15.testing/06.testing-views",{"title":605,"path":606,"stem":607},"Testing Forms","/testing/testing-forms","15.testing/07.testing-forms",{"title":609,"path":610,"stem":611},"Testing Templates","/testing/testing-templates","15.testing/08.testing-templates",{"title":613,"path":614,"stem":615},"Testing Authentication","/testing/testing-authentication","15.testing/09.testing-authentication",{"title":617,"path":618,"stem":619},"Advanced Testing Topics","/testing/advanced-testing-topics","15.testing/10.advanced-testing-topics",{"title":621,"path":622,"stem":623},"Performance Testing","/testing/performance-testing","15.testing/11.performance-testing",{"title":625,"path":626,"stem":627,"children":628},"Static Assets and Frontend Integration","/static-assets-and-frontend-integration","16.static-assets-and-frontend-integration/01.index",[629,630,634,638,642,646],{"title":625,"path":626,"stem":627},{"title":631,"path":632,"stem":633},"Working with Static Files","/static-assets-and-frontend-integration/working-with-static-files","16.static-assets-and-frontend-integration/02.working-with-static-files",{"title":635,"path":636,"stem":637},"Integrating CSS and JavaScript","/static-assets-and-frontend-integration/integrating-css-and-javascript","16.static-assets-and-frontend-integration/03.integrating-css-and-javascript",{"title":639,"path":640,"stem":641},"Using Build Tools like Vite or Webpack","/static-assets-and-frontend-integration/using-build-tools-like-vite-or-webpack","16.static-assets-and-frontend-integration/04.using-build-tools-like-vite-or-webpack",{"title":643,"path":644,"stem":645},"Using React or Vue with Django","/static-assets-and-frontend-integration/using-react-or-vue-with-django","16.static-assets-and-frontend-integration/05.using-react-or-vue-with-django",{"title":647,"path":648,"stem":649},"Managing CORS","/static-assets-and-frontend-integration/managing-cors","16.static-assets-and-frontend-integration/06.managing-cors",{"title":651,"path":652,"stem":653,"children":654},"Internationalization and Localization","/internationalization-and-localization","17.internationalization-and-localization/01.index",[655,656,660,664,668],{"title":651,"path":652,"stem":653},{"title":657,"path":658,"stem":659},"Enabling Translation","/internationalization-and-localization/enabling-translation","17.internationalization-and-localization/02.enabling-translation",{"title":661,"path":662,"stem":663},"Translating Text in Code and Templates","/internationalization-and-localization/translating-text-in-code-and-templates","17.internationalization-and-localization/03.translating-text-in-code-and-templates",{"title":665,"path":666,"stem":667},"Timezone Support","/internationalization-and-localization/timezone-support","17.internationalization-and-localization/04.timezone-support",{"title":669,"path":670,"stem":671},"Locale Middleware","/internationalization-and-localization/locale-middleware","17.internationalization-and-localization/05.locale-middleware",{"title":673,"path":674,"stem":675,"children":676},"Caching","/caching","18.caching/01.index",[677,678,682,686,690,694,698],{"title":673,"path":674,"stem":675},{"title":679,"path":680,"stem":681},"Introduction to Caching","/caching/introduction-to-caching","18.caching/02.introduction-to-caching",{"title":683,"path":684,"stem":685},"Cache Backends","/caching/cache-backends","18.caching/03.cache-backends",{"title":687,"path":688,"stem":689},"Per View Caching","/caching/per-view-caching","18.caching/04.per-view-caching",{"title":691,"path":692,"stem":693},"Low Level Cache API","/caching/low-level-cache-api","18.caching/05.low-level-cache-api",{"title":695,"path":696,"stem":697},"Template Fragment Caching","/caching/template-fragment-caching","18.caching/06.template-fragment-caching",{"title":699,"path":700,"stem":701},"Deployment Level Caching Patterns","/caching/deployment-level-caching-patterns","18.caching/07.deployment-level-caching-patterns",{"title":703,"path":704,"stem":705,"children":706},"Asynchronous Django","/asynchronous-django","19.asynchronous-django/01.index",[707,708,712,716,720,724,728,732],{"title":703,"path":704,"stem":705},{"title":709,"path":710,"stem":711},"Introduction to ASGI","/asynchronous-django/introduction-to-asgi","19.asynchronous-django/02.introduction-to-asgi",{"title":713,"path":714,"stem":715},"Async Views","/asynchronous-django/async-views","19.asynchronous-django/03.async-views",{"title":717,"path":718,"stem":719},"Async ORM Status","/asynchronous-django/async-orm-status","19.asynchronous-django/04.async-orm-status",{"title":721,"path":722,"stem":723},"WebSockets with Channels","/asynchronous-django/websockets-with-channels","19.asynchronous-django/05.websockets-with-channels",{"title":725,"path":726,"stem":727},"Background Tasks with Celery or RQ","/asynchronous-django/background-tasks-with-celery-or-rq","19.asynchronous-django/06.background-tasks-with-celery-or-rq",{"title":729,"path":730,"stem":731},"Asynchronous Support","/asynchronous-django/asynchronous-support","19.asynchronous-django/07.asynchronous-support",{"title":733,"path":734,"stem":735},"Django's Tasks Framework","/asynchronous-django/django-tasks-framework","19.asynchronous-django/08.django-tasks-framework",{"title":737,"path":738,"stem":739,"children":740},"Deployment","/deployment","20.deployment/01.index",[741,742,746,750,754,758,762,766,770],{"title":737,"path":738,"stem":739},{"title":743,"path":744,"stem":745},"Preparing for Production","/deployment/preparing-for-production","20.deployment/02.preparing-for-production",{"title":747,"path":748,"stem":749},"Using WSGI and ASGI Servers","/deployment/using-wsgi-and-asgi-servers","20.deployment/03.using-wsgi-and-asgi-servers",{"title":751,"path":752,"stem":753},"Deploying on Linux Servers","/deployment/deploying-on-linux-servers","20.deployment/04.deploying-on-linux-servers",{"title":755,"path":756,"stem":757},"Using Docker","/deployment/using-docker","20.deployment/05.using-docker",{"title":759,"path":760,"stem":761},"Cloud Deployment Guides","/deployment/cloud-deployment-guides","20.deployment/06.cloud-deployment-guides",{"title":763,"path":764,"stem":765},"Scaling and Load Balancing","/deployment/scaling-and-load-balancing","20.deployment/07.scaling-and-load-balancing",{"title":767,"path":768,"stem":769},"Monitoring and Logging","/deployment/monitoring-and-logging","20.deployment/08.monitoring-and-logging",{"title":771,"path":772,"stem":773},"Backup Strategies","/deployment/backup-strategies","20.deployment/09.backup-strategies",{"title":775,"path":776,"stem":777,"children":778},"Performance and Optimization","/performance-and-optimization","21.performance-and-optimization/01.index",[779,780,784,788,792,796],{"title":775,"path":776,"stem":777},{"title":781,"path":782,"stem":783},"Query Optimization","/performance-and-optimization/query-optimization","21.performance-and-optimization/02.query-optimization",{"title":785,"path":786,"stem":787},"Template Rendering Optimization","/performance-and-optimization/template-rendering-optimization","21.performance-and-optimization/03.template-rendering-optimization",{"title":789,"path":790,"stem":791},"Using Select Related and Prefetch Related","/performance-and-optimization/using-select-related-and-prefetch-related","21.performance-and-optimization/04.using-select-related-and-prefetch-related",{"title":793,"path":794,"stem":795},"Caching Strategies","/performance-and-optimization/caching-strategies","21.performance-and-optimization/05.caching-strategies",{"title":797,"path":798,"stem":799},"Profiling Django Apps","/performance-and-optimization/profiling-django-apps","21.performance-and-optimization/06.profiling-django-apps",{"title":801,"path":802,"stem":803,"children":804},"Advanced and Expert Topics","/advanced-and-expert-topics","22.advanced-and-expert-topics/01.index",[805,806,810,814,818,822,826,830,834,838,842,846],{"title":801,"path":802,"stem":803},{"title":807,"path":808,"stem":809},"System Architecture Patterns","/advanced-and-expert-topics/system-architecture-patterns","22.advanced-and-expert-topics/02.system-architecture-patterns",{"title":811,"path":812,"stem":813},"Domain Driven Design with Django","/advanced-and-expert-topics/domain-driven-design-with-django","22.advanced-and-expert-topics/03.domain-driven-design-with-django",{"title":815,"path":816,"stem":817},"Building Large Scale Django Projects","/advanced-and-expert-topics/building-large-scale-django-projects","22.advanced-and-expert-topics/04.building-large-scale-django-projects",{"title":819,"path":820,"stem":821},"Plugin Architectures for Django Apps","/advanced-and-expert-topics/plugin-architectures-for-django-apps","22.advanced-and-expert-topics/05.plugin-architectures-for-django-apps",{"title":823,"path":824,"stem":825},"Extending Django's Core","/advanced-and-expert-topics/extending-djangos-core","22.advanced-and-expert-topics/06.extending-djangos-core",{"title":827,"path":828,"stem":829},"Custom ORM Expressions","/advanced-and-expert-topics/custom-orm-expressions","22.advanced-and-expert-topics/07.custom-orm-expressions",{"title":831,"path":832,"stem":833},"Custom Management Commands","/advanced-and-expert-topics/custom-management-commands","22.advanced-and-expert-topics/08.custom-management-commands",{"title":835,"path":836,"stem":837},"Working with Signals","/advanced-and-expert-topics/working-with-signals","22.advanced-and-expert-topics/09.working-with-signals",{"title":839,"path":840,"stem":841},"Building Reusable Django Packages","/advanced-and-expert-topics/building-reusable-django-packages","22.advanced-and-expert-topics/10.building-reusable-django-packages",{"title":843,"path":844,"stem":845},"Integrating Microservices","/advanced-and-expert-topics/integrating-microservices","22.advanced-and-expert-topics/11.integrating-microservices",{"title":847,"path":848,"stem":849},"Advanced Security Hardening","/advanced-and-expert-topics/advanced-security-hardening","22.advanced-and-expert-topics/12.advanced-security-hardening",{"title":851,"path":852,"stem":853,"children":854},"Logging in Django","/logging-in-django","23.logging-in-django/01.index",[855],{"title":851,"path":852,"stem":853},{"title":857,"path":858,"stem":859,"children":860},"FAQ and Troubleshooting","/faq-and-troubleshooting","24.faq-and-troubleshooting/01.index",[861],{"title":857,"path":858,"stem":859},{"title":863,"path":864,"stem":865,"children":866},"External Packages and Ecosystem","/external-packages-and-ecosystem","25.external-packages-and-ecosystem/01.index",[867],{"title":863,"path":864,"stem":865},{"title":869,"path":870,"stem":871,"children":872},"Django Internals and Contributing","/django-internals-and-contributing","26.django-internals-and-contributing/01.index",[873],{"title":869,"path":870,"stem":871},{"title":875,"path":876,"stem":877,"children":878},"Microservices with Django","/microservices-with-django","27.microservices-with-django/01.index",[879,880,884,888,892,896,900,904,908,912,916,920,924],{"title":875,"path":876,"stem":877},{"title":881,"path":882,"stem":883},"What Is a Microservice?","/microservices-with-django/what-is-a-microservice","27.microservices-with-django/02.what-is-a-microservice",{"title":885,"path":886,"stem":887},"Introducing the Django Microservices Architecture","/microservices-with-django/django-microservices-architecture","27.microservices-with-django/03.django-microservices-architecture",{"title":889,"path":890,"stem":891},"Setting Up the Development and Runtime Environment","/microservices-with-django/development-environment","27.microservices-with-django/04.development-environment",{"title":893,"path":894,"stem":895},"Cloud-native Data Processing with MongoDB","/microservices-with-django/cloud-native-data-processing","27.microservices-with-django/05.cloud-native-data-processing",{"title":897,"path":898,"stem":899},"Creating RESTful APIs for Microservices","/microservices-with-django/restful-apis","27.microservices-with-django/06.restful-apis",{"title":901,"path":902,"stem":903},"Orchestrating Microservices with Celery and RabbitMQ","/microservices-with-django/orchestrating-celery-rabbitmq","27.microservices-with-django/07.orchestrating-celery-rabbitmq",{"title":905,"path":906,"stem":907},"Testing Microservices","/microservices-with-django/testing-microservices","27.microservices-with-django/08.testing-microservices",{"title":909,"path":910,"stem":911},"Deploying Microservices","/microservices-with-django/deploying-microservices","27.microservices-with-django/09.deploying-microservices",{"title":913,"path":914,"stem":915},"Securing Microservices","/microservices-with-django/securing-microservices","27.microservices-with-django/10.securing-microservices",{"title":917,"path":918,"stem":919},"Improving Microservices Performance with Caching","/microservices-with-django/performance-caching","27.microservices-with-django/11.performance-caching",{"title":921,"path":922,"stem":923},"Best Practices","/microservices-with-django/best-practices","27.microservices-with-django/12.best-practices",{"title":925,"path":926,"stem":927},"Transforming a Monolithic Web App into a Microservice version","/microservices-with-django/monolith-to-microservices","27.microservices-with-django/13.monolith-to-microservices",{"title":929,"path":930,"stem":931,"children":932},"Releases","/releases","releases",[933,936,940,944,948,952,956,960,964,968,972,976,980,984,988,992,996,1000,1004,1008,1012],{"title":934,"path":930,"stem":935},"Django Releases","releases/index",{"title":937,"path":938,"stem":939},"Django 5.1.10 release notes","/releases/5.1.10","releases/5.1.10",{"title":941,"path":942,"stem":943},"Django 5.1.11 release notes","/releases/5.1.11","releases/5.1.11",{"title":945,"path":946,"stem":947},"Django 5.1.12 release notes","/releases/5.1.12","releases/5.1.12",{"title":949,"path":950,"stem":951},"Django 5.1.13 release notes","/releases/5.1.13","releases/5.1.13",{"title":953,"path":954,"stem":955},"Django 5.1.14 release notes","/releases/5.1.14","releases/5.1.14",{"title":957,"path":958,"stem":959},"Django 5.1.15 release notes","/releases/5.1.15","releases/5.1.15",{"title":961,"path":962,"stem":963},"Django 5.2 release notes","/releases/5.2","releases/5.2",{"title":965,"path":966,"stem":967},"Django 5.2.1 release notes","/releases/5.2.1","releases/5.2.1",{"title":969,"path":970,"stem":971},"Django 5.2.10 release notes","/releases/5.2.10","releases/5.2.10",{"title":973,"path":974,"stem":975},"Django 5.2.2 release notes","/releases/5.2.2","releases/5.2.2",{"title":977,"path":978,"stem":979},"Django 5.2.3 release notes","/releases/5.2.3","releases/5.2.3",{"title":981,"path":982,"stem":983},"Django 5.2.4 release notes","/releases/5.2.4","releases/5.2.4",{"title":985,"path":986,"stem":987},"Django 5.2.5 release notes","/releases/5.2.5","releases/5.2.5",{"title":989,"path":990,"stem":991},"Django 5.2.6 release notes","/releases/5.2.6","releases/5.2.6",{"title":993,"path":994,"stem":995},"Django 5.2.7 release notes","/releases/5.2.7","releases/5.2.7",{"title":997,"path":998,"stem":999},"Django 5.2.8 release notes","/releases/5.2.8","releases/5.2.8",{"title":1001,"path":1002,"stem":1003},"Django 5.2.9 release notes","/releases/5.2.9","releases/5.2.9",{"title":1005,"path":1006,"stem":1007},"Django 6.0 release notes","/releases/6.0","releases/6.0",{"title":1009,"path":1010,"stem":1011},"Django 6.0.1 release notes","/releases/6.0.1","releases/6.0.1",{"title":1013,"path":1014,"stem":1015},"Django 6.1 release notes - UNDER DEVELOPMENT","/releases/6.1","releases/6.1",{"id":1017,"title":416,"body":1018,"description":1028,"extension":12082,"links":12083,"meta":12084,"navigation":1242,"path":417,"seo":12085,"stem":418,"__hash__":12086},"docs/09.authentication-and-authorization/07.login-and-logout.md",{"type":1019,"value":1020,"toc":12071},"minimark",[1021,1025,1029,1034,1039,6967,6971,6975,9671,9675,9679,12065,12068],[1022,1023,416],"h1",{"id":1024},"login-and-logout",[1026,1027,1028],"p",{},"Implementing secure and user-friendly login and logout functionality is fundamental to any Django application. Understanding how to handle authentication flows, manage sessions, and provide a smooth user experience while maintaining security is essential for building robust authentication systems.",[1030,1031,1033],"h2",{"id":1032},"login-implementation","Login Implementation",[1035,1036,1038],"h3",{"id":1037},"basic-login-flow","Basic Login Flow",[1040,1041,1046],"pre",{"className":1042,"code":1043,"language":1044,"meta":1045,"style":1045},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# Basic login implementation\nfrom django.contrib.auth import authenticate, login, logout\nfrom django.contrib.auth.forms import AuthenticationForm\nfrom django.shortcuts import render, redirect\nfrom django.contrib import messages\nfrom django.views.decorators.csrf import csrf_protect\nfrom django.views.decorators.cache import never_cache\nfrom django.utils.decorators import method_decorator\n\nclass LoginFlowManager:\n    \"\"\"Manage the complete login flow\"\"\"\n    \n    @staticmethod\n    def basic_login_process(request, username, password):\n        \"\"\"Basic login process implementation\"\"\"\n        \n        # Step 1: Authenticate user credentials\n        user = authenticate(request, username=username, password=password)\n        \n        if user is not None:\n            # Step 2: Check if user account is active\n            if user.is_active:\n                # Step 3: Log in the user (create session)\n                login(request, user)\n                \n                # Step 4: Set session preferences\n                request.session['login_timestamp'] = timezone.now().isoformat()\n                request.session['user_preferences'] = {\n                    'theme': getattr(user.profile, 'theme', 'light') if hasattr(user, 'profile') else 'light',\n                    'language': getattr(user.profile, 'language', 'en') if hasattr(user, 'profile') else 'en',\n                }\n                \n                # Step 5: Update user's last login\n                user.last_login = timezone.now()\n                user.save(update_fields=['last_login'])\n                \n                return True, \"Login successful\"\n            else:\n                return False, \"Account is disabled\"\n        else:\n            return False, \"Invalid credentials\"\n    \n    @staticmethod\n    def enhanced_login_process(request, username, password, remember_me=False):\n        \"\"\"Enhanced login with additional security features\"\"\"\n        \n        # Rate limiting check\n        if not LoginFlowManager.check_rate_limit(request, username):\n            return False, \"Too many login attempts. Please try again later.\"\n        \n        # Authenticate user\n        user = authenticate(request, username=username, password=password)\n        \n        if user is not None:\n            if user.is_active:\n                # Check for account lockout\n                if LoginFlowManager.is_account_locked(user):\n                    return False, \"Account is temporarily locked due to suspicious activity.\"\n                \n                # Successful login\n                login(request, user)\n                \n                # Handle remember me functionality\n                if remember_me:\n                    request.session.set_expiry(30 * 24 * 60 * 60)  # 30 days\n                else:\n                    request.session.set_expiry(0)  # Browser session\n                \n                # Enhanced session data\n                LoginFlowManager.set_enhanced_session_data(request, user)\n                \n                # Log successful login\n                LoginFlowManager.log_login_attempt(request, user, success=True)\n                \n                # Clear failed login attempts\n                LoginFlowManager.clear_failed_attempts(request, username)\n                \n                return True, f\"Welcome back, {user.get_full_name() or user.username}!\"\n            else:\n                LoginFlowManager.log_login_attempt(request, user, success=False, reason=\"inactive_account\")\n                return False, \"Your account has been deactivated. Please contact support.\"\n        else:\n            # Failed authentication\n            LoginFlowManager.log_failed_attempt(request, username)\n            return False, \"Invalid username or password.\"\n    \n    @staticmethod\n    def check_rate_limit(request, username):\n        \"\"\"Check if login attempts are within rate limits\"\"\"\n        \n        from django.core.cache import cache\n        \n        # IP-based rate limiting\n        ip_address = request.META.get('REMOTE_ADDR')\n        ip_key = f\"login_attempts_ip_{ip_address}\"\n        ip_attempts = cache.get(ip_key, 0)\n        \n        # Username-based rate limiting\n        username_key = f\"login_attempts_user_{username}\"\n        username_attempts = cache.get(username_key, 0)\n        \n        # Check limits\n        if ip_attempts >= 10 or username_attempts >= 5:\n            return False\n        \n        return True\n    \n    @staticmethod\n    def log_failed_attempt(request, username):\n        \"\"\"Log and track failed login attempts\"\"\"\n        \n        from django.core.cache import cache\n        import logging\n        \n        ip_address = request.META.get('REMOTE_ADDR')\n        user_agent = request.META.get('HTTP_USER_AGENT', '')\n        \n        # Increment counters\n        ip_key = f\"login_attempts_ip_{ip_address}\"\n        username_key = f\"login_attempts_user_{username}\"\n        \n        ip_attempts = cache.get(ip_key, 0) + 1\n        username_attempts = cache.get(username_key, 0) + 1\n        \n        cache.set(ip_key, ip_attempts, 300)  # 5 minutes\n        cache.set(username_key, username_attempts, 300)\n        \n        # Log the attempt\n        logger = logging.getLogger('security')\n        logger.warning(\n            f\"Failed login attempt - Username: {username}, \"\n            f\"IP: {ip_address}, User-Agent: {user_agent[:100]}\"\n        )\n    \n    @staticmethod\n    def clear_failed_attempts(request, username):\n        \"\"\"Clear failed login attempt counters\"\"\"\n        \n        from django.core.cache import cache\n        \n        ip_address = request.META.get('REMOTE_ADDR')\n        ip_key = f\"login_attempts_ip_{ip_address}\"\n        username_key = f\"login_attempts_user_{username}\"\n        \n        cache.delete(ip_key)\n        cache.delete(username_key)\n    \n    @staticmethod\n    def set_enhanced_session_data(request, user):\n        \"\"\"Set enhanced session data for security and UX\"\"\"\n        \n        request.session.update({\n            'login_timestamp': timezone.now().isoformat(),\n            'login_ip': request.META.get('REMOTE_ADDR'),\n            'user_agent_hash': hashlib.md5(\n                request.META.get('HTTP_USER_AGENT', '').encode()\n            ).hexdigest(),\n            'user_id': user.id,\n            'username': user.username,\n            'is_staff': user.is_staff,\n            'is_superuser': user.is_superuser,\n        })\n        \n        # User preferences\n        if hasattr(user, 'profile'):\n            request.session['user_preferences'] = {\n                'theme': user.profile.theme if hasattr(user.profile, 'theme') else 'light',\n                'language': user.profile.language if hasattr(user.profile, 'language') else 'en',\n                'timezone': str(user.profile.timezone) if hasattr(user.profile, 'timezone') else 'UTC',\n            }\n    \n    @staticmethod\n    def log_login_attempt(request, user, success=True, reason=None):\n        \"\"\"Log login attempts for audit purposes\"\"\"\n        \n        import logging\n        \n        logger = logging.getLogger('auth_audit')\n        \n        log_data = {\n            'username': user.username if user else 'unknown',\n            'ip_address': request.META.get('REMOTE_ADDR'),\n            'user_agent': request.META.get('HTTP_USER_AGENT', '')[:200],\n            'success': success,\n            'timestamp': timezone.now().isoformat(),\n        }\n        \n        if reason:\n            log_data['reason'] = reason\n        \n        if success:\n            logger.info(f\"Successful login: {log_data}\")\n        else:\n            logger.warning(f\"Failed login: {log_data}\")\n    \n    @staticmethod\n    def is_account_locked(user):\n        \"\"\"Check if account is locked due to suspicious activity\"\"\"\n        \n        # This would integrate with your account security system\n        # Example implementation:\n        \n        from django.core.cache import cache\n        \n        lock_key = f\"account_locked_{user.username}\"\n        return cache.get(lock_key, False)\n\n# Advanced login views\nclass AdvancedLoginView(LoginView):\n    \"\"\"Advanced login view with enhanced security\"\"\"\n    \n    template_name = 'auth/advanced_login.html'\n    form_class = AuthenticationForm\n    redirect_authenticated_user = True\n    \n    @method_decorator(csrf_protect)\n    @method_decorator(never_cache)\n    def dispatch(self, request, *args, **kwargs):\n        return super().dispatch(request, *args, **kwargs)\n    \n    def get_context_data(self, **kwargs):\n        \"\"\"Add security context to login form\"\"\"\n        \n        context = super().get_context_data(**kwargs)\n        \n        # Add security information\n        context.update({\n            'security_features': [\n                'Secure password hashing',\n                'Rate limiting protection',\n                'Session security',\n                'Login attempt monitoring'\n            ],\n            'login_help': {\n                'forgot_password': True,\n                'account_locked': True,\n                'registration': True,\n            }\n        })\n        \n        return context\n    \n    def form_valid(self, form):\n        \"\"\"Handle successful login with enhanced features\"\"\"\n        \n        user = form.get_user()\n        remember_me = self.request.POST.get('remember_me', False)\n        \n        # Enhanced login process\n        success, message = LoginFlowManager.enhanced_login_process(\n            self.request, user.username, None, remember_me\n        )\n        \n        if success:\n            messages.success(self.request, message)\n            \n            # Check if password needs updating\n            if self.password_needs_update(user):\n                messages.warning(\n                    self.request,\n                    \"Your password is old. Consider updating it for better security.\"\n                )\n            \n            # Check for security alerts\n            self.check_security_alerts(user)\n            \n            return super().form_valid(form)\n        else:\n            messages.error(self.request, message)\n            return self.form_invalid(form)\n    \n    def password_needs_update(self, user):\n        \"\"\"Check if user's password needs updating\"\"\"\n        \n        if hasattr(user, 'profile') and hasattr(user.profile, 'password_changed_at'):\n            password_age = timezone.now() - user.profile.password_changed_at\n            return password_age.days > 90  # 90 days\n        \n        return False\n    \n    def check_security_alerts(self, user):\n        \"\"\"Check for security alerts to show user\"\"\"\n        \n        alerts = []\n        \n        # Check for new login from different location\n        last_ip = self.request.session.get('last_login_ip')\n        current_ip = self.request.META.get('REMOTE_ADDR')\n        \n        if last_ip and last_ip != current_ip:\n            alerts.append(\"New login from a different location detected.\")\n        \n        # Check for unusual login time\n        current_hour = timezone.now().hour\n        if current_hour \u003C 6 or current_hour > 22:  # Outside normal hours\n            alerts.append(\"Login outside normal hours detected.\")\n        \n        # Show alerts\n        for alert in alerts:\n            messages.info(self.request, f\"Security Notice: {alert}\")\n        \n        # Store current IP for next login\n        self.request.session['last_login_ip'] = current_ip\n\n# Multi-step login with 2FA\nclass TwoFactorLoginView(LoginView):\n    \"\"\"Login view with two-factor authentication\"\"\"\n    \n    template_name = 'auth/2fa_login.html'\n    \n    def form_valid(self, form):\n        \"\"\"Handle first step of 2FA login\"\"\"\n        \n        user = form.get_user()\n        \n        # Check if user has 2FA enabled\n        if self.user_has_2fa_enabled(user):\n            # Store user temporarily in session\n            self.request.session['2fa_user_id'] = user.id\n            self.request.session['2fa_timestamp'] = timezone.now().isoformat()\n            \n            # Don't log in yet, redirect to 2FA verification\n            return redirect('2fa_verify')\n        \n        # Normal login for users without 2FA\n        return super().form_valid(form)\n    \n    def user_has_2fa_enabled(self, user):\n        \"\"\"Check if user has 2FA enabled\"\"\"\n        \n        return (hasattr(user, 'profile') and \n                getattr(user.profile, 'two_factor_enabled', False))\n\ndef two_factor_verify_view(request):\n    \"\"\"Verify two-factor authentication code\"\"\"\n    \n    # Check if user is in 2FA flow\n    user_id = request.session.get('2fa_user_id')\n    if not user_id:\n        messages.error(request, 'Invalid 2FA session. Please log in again.')\n        return redirect('login')\n    \n    # Check session timeout (5 minutes)\n    timestamp_str = request.session.get('2fa_timestamp')\n    if timestamp_str:\n        timestamp = datetime.fromisoformat(timestamp_str.replace('Z', '+00:00'))\n        if timezone.now() - timestamp > timedelta(minutes=5):\n            del request.session['2fa_user_id']\n            del request.session['2fa_timestamp']\n            messages.error(request, '2FA session expired. Please log in again.')\n            return redirect('login')\n    \n    try:\n        user = User.objects.get(id=user_id)\n    except User.DoesNotExist:\n        messages.error(request, 'Invalid user. Please log in again.')\n        return redirect('login')\n    \n    if request.method == 'POST':\n        token = request.POST.get('token', '').strip()\n        \n        if len(token) == 6 and token.isdigit():\n            # Verify TOTP token\n            if verify_totp_token(user, token):\n                # Complete login\n                login(request, user)\n                \n                # Clean up 2FA session data\n                del request.session['2fa_user_id']\n                del request.session['2fa_timestamp']\n                \n                # Set enhanced session data\n                LoginFlowManager.set_enhanced_session_data(request, user)\n                \n                messages.success(request, 'Login successful!')\n                return redirect('dashboard')\n            else:\n                messages.error(request, 'Invalid verification code. Please try again.')\n        else:\n            messages.error(request, 'Please enter a valid 6-digit code.')\n    \n    return render(request, 'auth/2fa_verify.html', {'user': user})\n\ndef verify_totp_token(user, token):\n    \"\"\"Verify TOTP token for user\"\"\"\n    \n    if not hasattr(user, 'profile') or not user.profile.totp_secret:\n        return False\n    \n    try:\n        import pyotp\n        totp = pyotp.TOTP(user.profile.totp_secret)\n        return totp.verify(token, valid_window=1)\n    except ImportError:\n        return False\n","python","",[1047,1048,1049,1058,1098,1124,1146,1163,1190,1215,1237,1244,1258,1272,1278,1288,1318,1329,1335,1341,1379,1384,1406,1412,1429,1435,1451,1457,1463,1510,1535,1616,1685,1691,1696,1702,1723,1750,1755,1775,1783,1800,1808,1825,1830,1837,1869,1879,1884,1890,1914,1930,1935,1941,1972,1977,1992,2005,2011,2030,2047,2052,2058,2073,2078,2084,2093,2134,2142,2165,2170,2176,2197,2202,2208,2238,2243,2249,2269,2274,2318,2325,2367,2383,2390,2396,2417,2433,2438,2445,2463,2473,2478,2500,2505,2511,2544,2566,2593,2598,2604,2625,2650,2655,2661,2687,2695,2700,2709,2714,2721,2739,2749,2754,2773,2782,2787,2814,2848,2853,2859,2878,2897,2902,2931,2958,2963,2993,3017,3022,3028,3055,3069,3087,3121,3127,3132,3139,3157,3167,3172,3191,3196,3223,3242,3261,3266,3282,3297,3302,3309,3327,3337,3342,3360,3385,3418,3440,3473,3484,3505,3524,3544,3564,3570,3575,3581,3602,3626,3680,3733,3795,3801,3806,3813,3848,3858,3863,3870,3875,3899,3904,3914,3947,3978,4020,4036,4060,4066,4071,4080,4102,4107,4116,4146,4153,4179,4184,4191,4205,4215,4220,4226,4232,4237,4256,4261,4286,4308,4313,4319,4335,4345,4350,4366,4376,4386,4391,4406,4420,4455,4486,4491,4511,4521,4526,4550,4555,4561,4573,4588,4600,4612,4624,4634,4640,4654,4670,4686,4702,4707,4712,4717,4725,4730,4749,4759,4764,4780,4820,4825,4831,4853,4880,4885,4890,4899,4924,4930,4936,4954,4966,4978,4989,4995,5000,5006,5022,5027,5046,5053,5077,5095,5100,5118,5128,5133,5178,5208,5230,5235,5242,5247,5265,5275,5280,5291,5296,5302,5335,5367,5372,5393,5415,5420,5426,5445,5474,5494,5499,5505,5522,5557,5562,5568,5597,5602,5608,5622,5632,5637,5651,5656,5673,5683,5688,5703,5708,5714,5732,5738,5771,5809,5814,5820,5839,5844,5850,5867,5872,5890,5900,5905,5935,5965,5970,5985,5995,6000,6006,6034,6047,6072,6090,6095,6101,6129,6139,6185,6220,6243,6264,6288,6305,6310,6318,6347,6362,6386,6403,6408,6431,6469,6474,6505,6511,6529,6535,6550,6555,6561,6583,6604,6609,6615,6634,6639,6663,6681,6688,6712,6719,6743,6748,6787,6792,6809,6819,6824,6864,6871,6876,6883,6891,6921,6950,6960],"code",{"__ignoreMap":1045},[1050,1051,1054],"span",{"class":1052,"line":1053},"line",1,[1050,1055,1057],{"class":1056},"s9Tkl","# Basic login implementation\n",[1050,1059,1061,1065,1069,1073,1076,1078,1081,1084,1087,1090,1093,1095],{"class":1052,"line":1060},2,[1050,1062,1064],{"class":1063},"siDh9","from",[1050,1066,1068],{"class":1067},"sftqT"," django",[1050,1070,1072],{"class":1071},"soVBu",".",[1050,1074,1075],{"class":1067},"contrib",[1050,1077,1072],{"class":1071},[1050,1079,1080],{"class":1067},"auth ",[1050,1082,1083],{"class":1063},"import",[1050,1085,1086],{"class":1067}," authenticate",[1050,1088,1089],{"class":1071},",",[1050,1091,1092],{"class":1067}," login",[1050,1094,1089],{"class":1071},[1050,1096,1097],{"class":1067}," logout\n",[1050,1099,1101,1103,1105,1107,1109,1111,1114,1116,1119,1121],{"class":1052,"line":1100},3,[1050,1102,1064],{"class":1063},[1050,1104,1068],{"class":1067},[1050,1106,1072],{"class":1071},[1050,1108,1075],{"class":1067},[1050,1110,1072],{"class":1071},[1050,1112,1113],{"class":1067},"auth",[1050,1115,1072],{"class":1071},[1050,1117,1118],{"class":1067},"forms ",[1050,1120,1083],{"class":1063},[1050,1122,1123],{"class":1067}," AuthenticationForm\n",[1050,1125,1127,1129,1131,1133,1136,1138,1141,1143],{"class":1052,"line":1126},4,[1050,1128,1064],{"class":1063},[1050,1130,1068],{"class":1067},[1050,1132,1072],{"class":1071},[1050,1134,1135],{"class":1067},"shortcuts ",[1050,1137,1083],{"class":1063},[1050,1139,1140],{"class":1067}," render",[1050,1142,1089],{"class":1071},[1050,1144,1145],{"class":1067}," redirect\n",[1050,1147,1149,1151,1153,1155,1158,1160],{"class":1052,"line":1148},5,[1050,1150,1064],{"class":1063},[1050,1152,1068],{"class":1067},[1050,1154,1072],{"class":1071},[1050,1156,1157],{"class":1067},"contrib ",[1050,1159,1083],{"class":1063},[1050,1161,1162],{"class":1067}," messages\n",[1050,1164,1166,1168,1170,1172,1175,1177,1180,1182,1185,1187],{"class":1052,"line":1165},6,[1050,1167,1064],{"class":1063},[1050,1169,1068],{"class":1067},[1050,1171,1072],{"class":1071},[1050,1173,1174],{"class":1067},"views",[1050,1176,1072],{"class":1071},[1050,1178,1179],{"class":1067},"decorators",[1050,1181,1072],{"class":1071},[1050,1183,1184],{"class":1067},"csrf ",[1050,1186,1083],{"class":1063},[1050,1188,1189],{"class":1067}," csrf_protect\n",[1050,1191,1193,1195,1197,1199,1201,1203,1205,1207,1210,1212],{"class":1052,"line":1192},7,[1050,1194,1064],{"class":1063},[1050,1196,1068],{"class":1067},[1050,1198,1072],{"class":1071},[1050,1200,1174],{"class":1067},[1050,1202,1072],{"class":1071},[1050,1204,1179],{"class":1067},[1050,1206,1072],{"class":1071},[1050,1208,1209],{"class":1067},"cache ",[1050,1211,1083],{"class":1063},[1050,1213,1214],{"class":1067}," never_cache\n",[1050,1216,1218,1220,1222,1224,1227,1229,1232,1234],{"class":1052,"line":1217},8,[1050,1219,1064],{"class":1063},[1050,1221,1068],{"class":1067},[1050,1223,1072],{"class":1071},[1050,1225,1226],{"class":1067},"utils",[1050,1228,1072],{"class":1071},[1050,1230,1231],{"class":1067},"decorators ",[1050,1233,1083],{"class":1063},[1050,1235,1236],{"class":1067}," method_decorator\n",[1050,1238,1240],{"class":1052,"line":1239},9,[1050,1241,1243],{"emptyLinePlaceholder":1242},true,"\n",[1050,1245,1247,1251,1255],{"class":1052,"line":1246},10,[1050,1248,1250],{"class":1249},"s5Kfy","class",[1050,1252,1254],{"class":1253},"sD-vU"," LoginFlowManager",[1050,1256,1257],{"class":1071},":\n",[1050,1259,1261,1265,1269],{"class":1052,"line":1260},11,[1050,1262,1264],{"class":1263},"sm7ve","    \"\"\"",[1050,1266,1268],{"class":1267},"sVyVU","Manage the complete login flow",[1050,1270,1271],{"class":1263},"\"\"\"\n",[1050,1273,1275],{"class":1052,"line":1274},12,[1050,1276,1277],{"class":1067},"    \n",[1050,1279,1281,1284],{"class":1052,"line":1280},13,[1050,1282,1283],{"class":1071},"    @",[1050,1285,1287],{"class":1286},"sa2tF","staticmethod\n",[1050,1289,1291,1294,1298,1301,1305,1307,1310,1312,1315],{"class":1052,"line":1290},14,[1050,1292,1293],{"class":1249},"    def",[1050,1295,1297],{"class":1296},"sljsM"," basic_login_process",[1050,1299,1300],{"class":1071},"(",[1050,1302,1304],{"class":1303},"sCyAa","request",[1050,1306,1089],{"class":1071},[1050,1308,1309],{"class":1303}," username",[1050,1311,1089],{"class":1071},[1050,1313,1314],{"class":1303}," password",[1050,1316,1317],{"class":1071},"):\n",[1050,1319,1321,1324,1327],{"class":1052,"line":1320},15,[1050,1322,1323],{"class":1263},"        \"\"\"",[1050,1325,1326],{"class":1267},"Basic login process implementation",[1050,1328,1271],{"class":1263},[1050,1330,1332],{"class":1052,"line":1331},16,[1050,1333,1334],{"class":1067},"        \n",[1050,1336,1338],{"class":1052,"line":1337},17,[1050,1339,1340],{"class":1056},"        # Step 1: Authenticate user credentials\n",[1050,1342,1344,1347,1350,1353,1355,1357,1359,1362,1364,1367,1369,1371,1373,1376],{"class":1052,"line":1343},18,[1050,1345,1346],{"class":1067},"        user ",[1050,1348,1349],{"class":1071},"=",[1050,1351,1086],{"class":1352},"siWMO",[1050,1354,1300],{"class":1071},[1050,1356,1304],{"class":1352},[1050,1358,1089],{"class":1071},[1050,1360,1309],{"class":1361},"sqOPj",[1050,1363,1349],{"class":1071},[1050,1365,1366],{"class":1352},"username",[1050,1368,1089],{"class":1071},[1050,1370,1314],{"class":1361},[1050,1372,1349],{"class":1071},[1050,1374,1375],{"class":1352},"password",[1050,1377,1378],{"class":1071},")\n",[1050,1380,1382],{"class":1052,"line":1381},19,[1050,1383,1334],{"class":1067},[1050,1385,1387,1390,1393,1397,1400,1404],{"class":1052,"line":1386},20,[1050,1388,1389],{"class":1063},"        if",[1050,1391,1392],{"class":1067}," user ",[1050,1394,1396],{"class":1395},"sVsLi","is",[1050,1398,1399],{"class":1395}," not",[1050,1401,1403],{"class":1402},"s8XtY"," None",[1050,1405,1257],{"class":1071},[1050,1407,1409],{"class":1052,"line":1408},21,[1050,1410,1411],{"class":1056},"            # Step 2: Check if user account is active\n",[1050,1413,1415,1418,1421,1423,1427],{"class":1052,"line":1414},22,[1050,1416,1417],{"class":1063},"            if",[1050,1419,1420],{"class":1067}," user",[1050,1422,1072],{"class":1071},[1050,1424,1426],{"class":1425},"sBPpx","is_active",[1050,1428,1257],{"class":1071},[1050,1430,1432],{"class":1052,"line":1431},23,[1050,1433,1434],{"class":1056},"                # Step 3: Log in the user (create session)\n",[1050,1436,1438,1441,1443,1445,1447,1449],{"class":1052,"line":1437},24,[1050,1439,1440],{"class":1352},"                login",[1050,1442,1300],{"class":1071},[1050,1444,1304],{"class":1352},[1050,1446,1089],{"class":1071},[1050,1448,1420],{"class":1352},[1050,1450,1378],{"class":1071},[1050,1452,1454],{"class":1052,"line":1453},25,[1050,1455,1456],{"class":1067},"                \n",[1050,1458,1460],{"class":1052,"line":1459},26,[1050,1461,1462],{"class":1056},"                # Step 4: Set session preferences\n",[1050,1464,1466,1469,1471,1474,1477,1481,1485,1487,1490,1493,1496,1498,1501,1504,1507],{"class":1052,"line":1465},27,[1050,1467,1468],{"class":1067},"                request",[1050,1470,1072],{"class":1071},[1050,1472,1473],{"class":1425},"session",[1050,1475,1476],{"class":1071},"[",[1050,1478,1480],{"class":1479},"sbYkP","'",[1050,1482,1484],{"class":1483},"sTbE_","login_timestamp",[1050,1486,1480],{"class":1479},[1050,1488,1489],{"class":1071},"]",[1050,1491,1492],{"class":1071}," =",[1050,1494,1495],{"class":1067}," timezone",[1050,1497,1072],{"class":1071},[1050,1499,1500],{"class":1352},"now",[1050,1502,1503],{"class":1071},"().",[1050,1505,1506],{"class":1352},"isoformat",[1050,1508,1509],{"class":1071},"()\n",[1050,1511,1513,1515,1517,1519,1521,1523,1526,1528,1530,1532],{"class":1052,"line":1512},28,[1050,1514,1468],{"class":1067},[1050,1516,1072],{"class":1071},[1050,1518,1473],{"class":1425},[1050,1520,1476],{"class":1071},[1050,1522,1480],{"class":1479},[1050,1524,1525],{"class":1483},"user_preferences",[1050,1527,1480],{"class":1479},[1050,1529,1489],{"class":1071},[1050,1531,1492],{"class":1071},[1050,1533,1534],{"class":1071}," {\n",[1050,1536,1538,1541,1544,1546,1549,1553,1555,1558,1560,1563,1565,1568,1570,1572,1574,1576,1579,1581,1584,1587,1590,1592,1594,1596,1598,1600,1602,1604,1607,1609,1611,1613],{"class":1052,"line":1537},29,[1050,1539,1540],{"class":1479},"                    '",[1050,1542,1543],{"class":1483},"theme",[1050,1545,1480],{"class":1479},[1050,1547,1548],{"class":1071},":",[1050,1550,1552],{"class":1551},"sJdAF"," getattr",[1050,1554,1300],{"class":1071},[1050,1556,1557],{"class":1352},"user",[1050,1559,1072],{"class":1071},[1050,1561,1562],{"class":1425},"profile",[1050,1564,1089],{"class":1071},[1050,1566,1567],{"class":1479}," '",[1050,1569,1543],{"class":1483},[1050,1571,1480],{"class":1479},[1050,1573,1089],{"class":1071},[1050,1575,1567],{"class":1479},[1050,1577,1578],{"class":1483},"light",[1050,1580,1480],{"class":1479},[1050,1582,1583],{"class":1071},")",[1050,1585,1586],{"class":1063}," if",[1050,1588,1589],{"class":1551}," hasattr",[1050,1591,1300],{"class":1071},[1050,1593,1557],{"class":1352},[1050,1595,1089],{"class":1071},[1050,1597,1567],{"class":1479},[1050,1599,1562],{"class":1483},[1050,1601,1480],{"class":1479},[1050,1603,1583],{"class":1071},[1050,1605,1606],{"class":1063}," else",[1050,1608,1567],{"class":1479},[1050,1610,1578],{"class":1483},[1050,1612,1480],{"class":1479},[1050,1614,1615],{"class":1071},",\n",[1050,1617,1619,1621,1624,1626,1628,1630,1632,1634,1636,1638,1640,1642,1644,1646,1648,1650,1653,1655,1657,1659,1661,1663,1665,1667,1669,1671,1673,1675,1677,1679,1681,1683],{"class":1052,"line":1618},30,[1050,1620,1540],{"class":1479},[1050,1622,1623],{"class":1483},"language",[1050,1625,1480],{"class":1479},[1050,1627,1548],{"class":1071},[1050,1629,1552],{"class":1551},[1050,1631,1300],{"class":1071},[1050,1633,1557],{"class":1352},[1050,1635,1072],{"class":1071},[1050,1637,1562],{"class":1425},[1050,1639,1089],{"class":1071},[1050,1641,1567],{"class":1479},[1050,1643,1623],{"class":1483},[1050,1645,1480],{"class":1479},[1050,1647,1089],{"class":1071},[1050,1649,1567],{"class":1479},[1050,1651,1652],{"class":1483},"en",[1050,1654,1480],{"class":1479},[1050,1656,1583],{"class":1071},[1050,1658,1586],{"class":1063},[1050,1660,1589],{"class":1551},[1050,1662,1300],{"class":1071},[1050,1664,1557],{"class":1352},[1050,1666,1089],{"class":1071},[1050,1668,1567],{"class":1479},[1050,1670,1562],{"class":1483},[1050,1672,1480],{"class":1479},[1050,1674,1583],{"class":1071},[1050,1676,1606],{"class":1063},[1050,1678,1567],{"class":1479},[1050,1680,1652],{"class":1483},[1050,1682,1480],{"class":1479},[1050,1684,1615],{"class":1071},[1050,1686,1688],{"class":1052,"line":1687},31,[1050,1689,1690],{"class":1071},"                }\n",[1050,1692,1694],{"class":1052,"line":1693},32,[1050,1695,1456],{"class":1067},[1050,1697,1699],{"class":1052,"line":1698},33,[1050,1700,1701],{"class":1056},"                # Step 5: Update user's last login\n",[1050,1703,1705,1708,1710,1713,1715,1717,1719,1721],{"class":1052,"line":1704},34,[1050,1706,1707],{"class":1067},"                user",[1050,1709,1072],{"class":1071},[1050,1711,1712],{"class":1425},"last_login",[1050,1714,1492],{"class":1071},[1050,1716,1495],{"class":1067},[1050,1718,1072],{"class":1071},[1050,1720,1500],{"class":1352},[1050,1722,1509],{"class":1071},[1050,1724,1726,1728,1730,1733,1735,1738,1741,1743,1745,1747],{"class":1052,"line":1725},35,[1050,1727,1707],{"class":1067},[1050,1729,1072],{"class":1071},[1050,1731,1732],{"class":1352},"save",[1050,1734,1300],{"class":1071},[1050,1736,1737],{"class":1361},"update_fields",[1050,1739,1740],{"class":1071},"=[",[1050,1742,1480],{"class":1479},[1050,1744,1712],{"class":1483},[1050,1746,1480],{"class":1479},[1050,1748,1749],{"class":1071},"])\n",[1050,1751,1753],{"class":1052,"line":1752},36,[1050,1754,1456],{"class":1067},[1050,1756,1758,1761,1764,1766,1769,1772],{"class":1052,"line":1757},37,[1050,1759,1760],{"class":1063},"                return",[1050,1762,1763],{"class":1402}," True",[1050,1765,1089],{"class":1071},[1050,1767,1768],{"class":1479}," \"",[1050,1770,1771],{"class":1483},"Login successful",[1050,1773,1774],{"class":1479},"\"\n",[1050,1776,1778,1781],{"class":1052,"line":1777},38,[1050,1779,1780],{"class":1063},"            else",[1050,1782,1257],{"class":1071},[1050,1784,1786,1788,1791,1793,1795,1798],{"class":1052,"line":1785},39,[1050,1787,1760],{"class":1063},[1050,1789,1790],{"class":1402}," False",[1050,1792,1089],{"class":1071},[1050,1794,1768],{"class":1479},[1050,1796,1797],{"class":1483},"Account is disabled",[1050,1799,1774],{"class":1479},[1050,1801,1803,1806],{"class":1052,"line":1802},40,[1050,1804,1805],{"class":1063},"        else",[1050,1807,1257],{"class":1071},[1050,1809,1811,1814,1816,1818,1820,1823],{"class":1052,"line":1810},41,[1050,1812,1813],{"class":1063},"            return",[1050,1815,1790],{"class":1402},[1050,1817,1089],{"class":1071},[1050,1819,1768],{"class":1479},[1050,1821,1822],{"class":1483},"Invalid credentials",[1050,1824,1774],{"class":1479},[1050,1826,1828],{"class":1052,"line":1827},42,[1050,1829,1277],{"class":1067},[1050,1831,1833,1835],{"class":1052,"line":1832},43,[1050,1834,1283],{"class":1071},[1050,1836,1287],{"class":1286},[1050,1838,1840,1842,1845,1847,1849,1851,1853,1855,1857,1859,1862,1864,1867],{"class":1052,"line":1839},44,[1050,1841,1293],{"class":1249},[1050,1843,1844],{"class":1296}," enhanced_login_process",[1050,1846,1300],{"class":1071},[1050,1848,1304],{"class":1303},[1050,1850,1089],{"class":1071},[1050,1852,1309],{"class":1303},[1050,1854,1089],{"class":1071},[1050,1856,1314],{"class":1303},[1050,1858,1089],{"class":1071},[1050,1860,1861],{"class":1303}," remember_me",[1050,1863,1349],{"class":1395},[1050,1865,1866],{"class":1402},"False",[1050,1868,1317],{"class":1071},[1050,1870,1872,1874,1877],{"class":1052,"line":1871},45,[1050,1873,1323],{"class":1263},[1050,1875,1876],{"class":1267},"Enhanced login with additional security features",[1050,1878,1271],{"class":1263},[1050,1880,1882],{"class":1052,"line":1881},46,[1050,1883,1334],{"class":1067},[1050,1885,1887],{"class":1052,"line":1886},47,[1050,1888,1889],{"class":1056},"        # Rate limiting check\n",[1050,1891,1893,1895,1897,1899,1901,1904,1906,1908,1910,1912],{"class":1052,"line":1892},48,[1050,1894,1389],{"class":1063},[1050,1896,1399],{"class":1395},[1050,1898,1254],{"class":1067},[1050,1900,1072],{"class":1071},[1050,1902,1903],{"class":1352},"check_rate_limit",[1050,1905,1300],{"class":1071},[1050,1907,1304],{"class":1352},[1050,1909,1089],{"class":1071},[1050,1911,1309],{"class":1352},[1050,1913,1317],{"class":1071},[1050,1915,1917,1919,1921,1923,1925,1928],{"class":1052,"line":1916},49,[1050,1918,1813],{"class":1063},[1050,1920,1790],{"class":1402},[1050,1922,1089],{"class":1071},[1050,1924,1768],{"class":1479},[1050,1926,1927],{"class":1483},"Too many login attempts. Please try again later.",[1050,1929,1774],{"class":1479},[1050,1931,1933],{"class":1052,"line":1932},50,[1050,1934,1334],{"class":1067},[1050,1936,1938],{"class":1052,"line":1937},51,[1050,1939,1940],{"class":1056},"        # Authenticate user\n",[1050,1942,1944,1946,1948,1950,1952,1954,1956,1958,1960,1962,1964,1966,1968,1970],{"class":1052,"line":1943},52,[1050,1945,1346],{"class":1067},[1050,1947,1349],{"class":1071},[1050,1949,1086],{"class":1352},[1050,1951,1300],{"class":1071},[1050,1953,1304],{"class":1352},[1050,1955,1089],{"class":1071},[1050,1957,1309],{"class":1361},[1050,1959,1349],{"class":1071},[1050,1961,1366],{"class":1352},[1050,1963,1089],{"class":1071},[1050,1965,1314],{"class":1361},[1050,1967,1349],{"class":1071},[1050,1969,1375],{"class":1352},[1050,1971,1378],{"class":1071},[1050,1973,1975],{"class":1052,"line":1974},53,[1050,1976,1334],{"class":1067},[1050,1978,1980,1982,1984,1986,1988,1990],{"class":1052,"line":1979},54,[1050,1981,1389],{"class":1063},[1050,1983,1392],{"class":1067},[1050,1985,1396],{"class":1395},[1050,1987,1399],{"class":1395},[1050,1989,1403],{"class":1402},[1050,1991,1257],{"class":1071},[1050,1993,1995,1997,1999,2001,2003],{"class":1052,"line":1994},55,[1050,1996,1417],{"class":1063},[1050,1998,1420],{"class":1067},[1050,2000,1072],{"class":1071},[1050,2002,1426],{"class":1425},[1050,2004,1257],{"class":1071},[1050,2006,2008],{"class":1052,"line":2007},56,[1050,2009,2010],{"class":1056},"                # Check for account lockout\n",[1050,2012,2014,2017,2019,2021,2024,2026,2028],{"class":1052,"line":2013},57,[1050,2015,2016],{"class":1063},"                if",[1050,2018,1254],{"class":1067},[1050,2020,1072],{"class":1071},[1050,2022,2023],{"class":1352},"is_account_locked",[1050,2025,1300],{"class":1071},[1050,2027,1557],{"class":1352},[1050,2029,1317],{"class":1071},[1050,2031,2033,2036,2038,2040,2042,2045],{"class":1052,"line":2032},58,[1050,2034,2035],{"class":1063},"                    return",[1050,2037,1790],{"class":1402},[1050,2039,1089],{"class":1071},[1050,2041,1768],{"class":1479},[1050,2043,2044],{"class":1483},"Account is temporarily locked due to suspicious activity.",[1050,2046,1774],{"class":1479},[1050,2048,2050],{"class":1052,"line":2049},59,[1050,2051,1456],{"class":1067},[1050,2053,2055],{"class":1052,"line":2054},60,[1050,2056,2057],{"class":1056},"                # Successful login\n",[1050,2059,2061,2063,2065,2067,2069,2071],{"class":1052,"line":2060},61,[1050,2062,1440],{"class":1352},[1050,2064,1300],{"class":1071},[1050,2066,1304],{"class":1352},[1050,2068,1089],{"class":1071},[1050,2070,1420],{"class":1352},[1050,2072,1378],{"class":1071},[1050,2074,2076],{"class":1052,"line":2075},62,[1050,2077,1456],{"class":1067},[1050,2079,2081],{"class":1052,"line":2080},63,[1050,2082,2083],{"class":1056},"                # Handle remember me functionality\n",[1050,2085,2087,2089,2091],{"class":1052,"line":2086},64,[1050,2088,2016],{"class":1063},[1050,2090,1861],{"class":1067},[1050,2092,1257],{"class":1071},[1050,2094,2096,2099,2101,2103,2105,2108,2110,2114,2117,2120,2122,2125,2127,2129,2131],{"class":1052,"line":2095},65,[1050,2097,2098],{"class":1067},"                    request",[1050,2100,1072],{"class":1071},[1050,2102,1473],{"class":1425},[1050,2104,1072],{"class":1071},[1050,2106,2107],{"class":1352},"set_expiry",[1050,2109,1300],{"class":1071},[1050,2111,2113],{"class":2112},"s7CZa","30",[1050,2115,2116],{"class":1395}," *",[1050,2118,2119],{"class":2112}," 24",[1050,2121,2116],{"class":1395},[1050,2123,2124],{"class":2112}," 60",[1050,2126,2116],{"class":1395},[1050,2128,2124],{"class":2112},[1050,2130,1583],{"class":1071},[1050,2132,2133],{"class":1056},"  # 30 days\n",[1050,2135,2137,2140],{"class":1052,"line":2136},66,[1050,2138,2139],{"class":1063},"                else",[1050,2141,1257],{"class":1071},[1050,2143,2145,2147,2149,2151,2153,2155,2157,2160,2162],{"class":1052,"line":2144},67,[1050,2146,2098],{"class":1067},[1050,2148,1072],{"class":1071},[1050,2150,1473],{"class":1425},[1050,2152,1072],{"class":1071},[1050,2154,2107],{"class":1352},[1050,2156,1300],{"class":1071},[1050,2158,2159],{"class":2112},"0",[1050,2161,1583],{"class":1071},[1050,2163,2164],{"class":1056},"  # Browser session\n",[1050,2166,2168],{"class":1052,"line":2167},68,[1050,2169,1456],{"class":1067},[1050,2171,2173],{"class":1052,"line":2172},69,[1050,2174,2175],{"class":1056},"                # Enhanced session data\n",[1050,2177,2179,2182,2184,2187,2189,2191,2193,2195],{"class":1052,"line":2178},70,[1050,2180,2181],{"class":1067},"                LoginFlowManager",[1050,2183,1072],{"class":1071},[1050,2185,2186],{"class":1352},"set_enhanced_session_data",[1050,2188,1300],{"class":1071},[1050,2190,1304],{"class":1352},[1050,2192,1089],{"class":1071},[1050,2194,1420],{"class":1352},[1050,2196,1378],{"class":1071},[1050,2198,2200],{"class":1052,"line":2199},71,[1050,2201,1456],{"class":1067},[1050,2203,2205],{"class":1052,"line":2204},72,[1050,2206,2207],{"class":1056},"                # Log successful login\n",[1050,2209,2211,2213,2215,2218,2220,2222,2224,2226,2228,2231,2233,2236],{"class":1052,"line":2210},73,[1050,2212,2181],{"class":1067},[1050,2214,1072],{"class":1071},[1050,2216,2217],{"class":1352},"log_login_attempt",[1050,2219,1300],{"class":1071},[1050,2221,1304],{"class":1352},[1050,2223,1089],{"class":1071},[1050,2225,1420],{"class":1352},[1050,2227,1089],{"class":1071},[1050,2229,2230],{"class":1361}," success",[1050,2232,1349],{"class":1071},[1050,2234,2235],{"class":1402},"True",[1050,2237,1378],{"class":1071},[1050,2239,2241],{"class":1052,"line":2240},74,[1050,2242,1456],{"class":1067},[1050,2244,2246],{"class":1052,"line":2245},75,[1050,2247,2248],{"class":1056},"                # Clear failed login attempts\n",[1050,2250,2252,2254,2256,2259,2261,2263,2265,2267],{"class":1052,"line":2251},76,[1050,2253,2181],{"class":1067},[1050,2255,1072],{"class":1071},[1050,2257,2258],{"class":1352},"clear_failed_attempts",[1050,2260,1300],{"class":1071},[1050,2262,1304],{"class":1352},[1050,2264,1089],{"class":1071},[1050,2266,1309],{"class":1352},[1050,2268,1378],{"class":1071},[1050,2270,2272],{"class":1052,"line":2271},77,[1050,2273,1456],{"class":1067},[1050,2275,2277,2279,2281,2283,2286,2289,2293,2295,2297,2300,2303,2306,2308,2310,2312,2315],{"class":1052,"line":2276},78,[1050,2278,1760],{"class":1063},[1050,2280,1763],{"class":1402},[1050,2282,1089],{"class":1071},[1050,2284,2285],{"class":1249}," f",[1050,2287,2288],{"class":1483},"\"Welcome back, ",[1050,2290,2292],{"class":2291},"s3h35","{",[1050,2294,1557],{"class":1067},[1050,2296,1072],{"class":1071},[1050,2298,2299],{"class":1352},"get_full_name",[1050,2301,2302],{"class":1071},"()",[1050,2304,2305],{"class":1395}," or",[1050,2307,1420],{"class":1067},[1050,2309,1072],{"class":1071},[1050,2311,1366],{"class":1425},[1050,2313,2314],{"class":2291},"}",[1050,2316,2317],{"class":1483},"!\"\n",[1050,2319,2321,2323],{"class":1052,"line":2320},79,[1050,2322,1780],{"class":1063},[1050,2324,1257],{"class":1071},[1050,2326,2328,2330,2332,2334,2336,2338,2340,2342,2344,2346,2348,2350,2352,2355,2357,2360,2363,2365],{"class":1052,"line":2327},80,[1050,2329,2181],{"class":1067},[1050,2331,1072],{"class":1071},[1050,2333,2217],{"class":1352},[1050,2335,1300],{"class":1071},[1050,2337,1304],{"class":1352},[1050,2339,1089],{"class":1071},[1050,2341,1420],{"class":1352},[1050,2343,1089],{"class":1071},[1050,2345,2230],{"class":1361},[1050,2347,1349],{"class":1071},[1050,2349,1866],{"class":1402},[1050,2351,1089],{"class":1071},[1050,2353,2354],{"class":1361}," reason",[1050,2356,1349],{"class":1071},[1050,2358,2359],{"class":1479},"\"",[1050,2361,2362],{"class":1483},"inactive_account",[1050,2364,2359],{"class":1479},[1050,2366,1378],{"class":1071},[1050,2368,2370,2372,2374,2376,2378,2381],{"class":1052,"line":2369},81,[1050,2371,1760],{"class":1063},[1050,2373,1790],{"class":1402},[1050,2375,1089],{"class":1071},[1050,2377,1768],{"class":1479},[1050,2379,2380],{"class":1483},"Your account has been deactivated. Please contact support.",[1050,2382,1774],{"class":1479},[1050,2384,2386,2388],{"class":1052,"line":2385},82,[1050,2387,1805],{"class":1063},[1050,2389,1257],{"class":1071},[1050,2391,2393],{"class":1052,"line":2392},83,[1050,2394,2395],{"class":1056},"            # Failed authentication\n",[1050,2397,2399,2402,2404,2407,2409,2411,2413,2415],{"class":1052,"line":2398},84,[1050,2400,2401],{"class":1067},"            LoginFlowManager",[1050,2403,1072],{"class":1071},[1050,2405,2406],{"class":1352},"log_failed_attempt",[1050,2408,1300],{"class":1071},[1050,2410,1304],{"class":1352},[1050,2412,1089],{"class":1071},[1050,2414,1309],{"class":1352},[1050,2416,1378],{"class":1071},[1050,2418,2420,2422,2424,2426,2428,2431],{"class":1052,"line":2419},85,[1050,2421,1813],{"class":1063},[1050,2423,1790],{"class":1402},[1050,2425,1089],{"class":1071},[1050,2427,1768],{"class":1479},[1050,2429,2430],{"class":1483},"Invalid username or password.",[1050,2432,1774],{"class":1479},[1050,2434,2436],{"class":1052,"line":2435},86,[1050,2437,1277],{"class":1067},[1050,2439,2441,2443],{"class":1052,"line":2440},87,[1050,2442,1283],{"class":1071},[1050,2444,1287],{"class":1286},[1050,2446,2448,2450,2453,2455,2457,2459,2461],{"class":1052,"line":2447},88,[1050,2449,1293],{"class":1249},[1050,2451,2452],{"class":1296}," check_rate_limit",[1050,2454,1300],{"class":1071},[1050,2456,1304],{"class":1303},[1050,2458,1089],{"class":1071},[1050,2460,1309],{"class":1303},[1050,2462,1317],{"class":1071},[1050,2464,2466,2468,2471],{"class":1052,"line":2465},89,[1050,2467,1323],{"class":1263},[1050,2469,2470],{"class":1267},"Check if login attempts are within rate limits",[1050,2472,1271],{"class":1263},[1050,2474,2476],{"class":1052,"line":2475},90,[1050,2477,1334],{"class":1067},[1050,2479,2481,2484,2486,2488,2491,2493,2495,2497],{"class":1052,"line":2480},91,[1050,2482,2483],{"class":1063},"        from",[1050,2485,1068],{"class":1067},[1050,2487,1072],{"class":1071},[1050,2489,2490],{"class":1067},"core",[1050,2492,1072],{"class":1071},[1050,2494,1209],{"class":1067},[1050,2496,1083],{"class":1063},[1050,2498,2499],{"class":1067}," cache\n",[1050,2501,2503],{"class":1052,"line":2502},92,[1050,2504,1334],{"class":1067},[1050,2506,2508],{"class":1052,"line":2507},93,[1050,2509,2510],{"class":1056},"        # IP-based rate limiting\n",[1050,2512,2514,2517,2519,2522,2524,2528,2530,2533,2535,2537,2540,2542],{"class":1052,"line":2513},94,[1050,2515,2516],{"class":1067},"        ip_address ",[1050,2518,1349],{"class":1071},[1050,2520,2521],{"class":1067}," request",[1050,2523,1072],{"class":1071},[1050,2525,2527],{"class":2526},"sFGJz","META",[1050,2529,1072],{"class":1071},[1050,2531,2532],{"class":1352},"get",[1050,2534,1300],{"class":1071},[1050,2536,1480],{"class":1479},[1050,2538,2539],{"class":1483},"REMOTE_ADDR",[1050,2541,1480],{"class":1479},[1050,2543,1378],{"class":1071},[1050,2545,2547,2550,2552,2554,2557,2559,2562,2564],{"class":1052,"line":2546},95,[1050,2548,2549],{"class":1067},"        ip_key ",[1050,2551,1349],{"class":1071},[1050,2553,2285],{"class":1249},[1050,2555,2556],{"class":1483},"\"login_attempts_ip_",[1050,2558,2292],{"class":2291},[1050,2560,2561],{"class":1067},"ip_address",[1050,2563,2314],{"class":2291},[1050,2565,1774],{"class":1483},[1050,2567,2569,2572,2574,2577,2579,2581,2583,2586,2588,2591],{"class":1052,"line":2568},96,[1050,2570,2571],{"class":1067},"        ip_attempts ",[1050,2573,1349],{"class":1071},[1050,2575,2576],{"class":1067}," cache",[1050,2578,1072],{"class":1071},[1050,2580,2532],{"class":1352},[1050,2582,1300],{"class":1071},[1050,2584,2585],{"class":1352},"ip_key",[1050,2587,1089],{"class":1071},[1050,2589,2590],{"class":2112}," 0",[1050,2592,1378],{"class":1071},[1050,2594,2596],{"class":1052,"line":2595},97,[1050,2597,1334],{"class":1067},[1050,2599,2601],{"class":1052,"line":2600},98,[1050,2602,2603],{"class":1056},"        # Username-based rate limiting\n",[1050,2605,2607,2610,2612,2614,2617,2619,2621,2623],{"class":1052,"line":2606},99,[1050,2608,2609],{"class":1067},"        username_key ",[1050,2611,1349],{"class":1071},[1050,2613,2285],{"class":1249},[1050,2615,2616],{"class":1483},"\"login_attempts_user_",[1050,2618,2292],{"class":2291},[1050,2620,1366],{"class":1067},[1050,2622,2314],{"class":2291},[1050,2624,1774],{"class":1483},[1050,2626,2628,2631,2633,2635,2637,2639,2641,2644,2646,2648],{"class":1052,"line":2627},100,[1050,2629,2630],{"class":1067},"        username_attempts ",[1050,2632,1349],{"class":1071},[1050,2634,2576],{"class":1067},[1050,2636,1072],{"class":1071},[1050,2638,2532],{"class":1352},[1050,2640,1300],{"class":1071},[1050,2642,2643],{"class":1352},"username_key",[1050,2645,1089],{"class":1071},[1050,2647,2590],{"class":2112},[1050,2649,1378],{"class":1071},[1050,2651,2653],{"class":1052,"line":2652},101,[1050,2654,1334],{"class":1067},[1050,2656,2658],{"class":1052,"line":2657},102,[1050,2659,2660],{"class":1056},"        # Check limits\n",[1050,2662,2664,2666,2669,2672,2675,2677,2680,2682,2685],{"class":1052,"line":2663},103,[1050,2665,1389],{"class":1063},[1050,2667,2668],{"class":1067}," ip_attempts ",[1050,2670,2671],{"class":1395},">=",[1050,2673,2674],{"class":2112}," 10",[1050,2676,2305],{"class":1395},[1050,2678,2679],{"class":1067}," username_attempts ",[1050,2681,2671],{"class":1395},[1050,2683,2684],{"class":2112}," 5",[1050,2686,1257],{"class":1071},[1050,2688,2690,2692],{"class":1052,"line":2689},104,[1050,2691,1813],{"class":1063},[1050,2693,2694],{"class":1402}," False\n",[1050,2696,2698],{"class":1052,"line":2697},105,[1050,2699,1334],{"class":1067},[1050,2701,2703,2706],{"class":1052,"line":2702},106,[1050,2704,2705],{"class":1063},"        return",[1050,2707,2708],{"class":1402}," True\n",[1050,2710,2712],{"class":1052,"line":2711},107,[1050,2713,1277],{"class":1067},[1050,2715,2717,2719],{"class":1052,"line":2716},108,[1050,2718,1283],{"class":1071},[1050,2720,1287],{"class":1286},[1050,2722,2724,2726,2729,2731,2733,2735,2737],{"class":1052,"line":2723},109,[1050,2725,1293],{"class":1249},[1050,2727,2728],{"class":1296}," log_failed_attempt",[1050,2730,1300],{"class":1071},[1050,2732,1304],{"class":1303},[1050,2734,1089],{"class":1071},[1050,2736,1309],{"class":1303},[1050,2738,1317],{"class":1071},[1050,2740,2742,2744,2747],{"class":1052,"line":2741},110,[1050,2743,1323],{"class":1263},[1050,2745,2746],{"class":1267},"Log and track failed login attempts",[1050,2748,1271],{"class":1263},[1050,2750,2752],{"class":1052,"line":2751},111,[1050,2753,1334],{"class":1067},[1050,2755,2757,2759,2761,2763,2765,2767,2769,2771],{"class":1052,"line":2756},112,[1050,2758,2483],{"class":1063},[1050,2760,1068],{"class":1067},[1050,2762,1072],{"class":1071},[1050,2764,2490],{"class":1067},[1050,2766,1072],{"class":1071},[1050,2768,1209],{"class":1067},[1050,2770,1083],{"class":1063},[1050,2772,2499],{"class":1067},[1050,2774,2776,2779],{"class":1052,"line":2775},113,[1050,2777,2778],{"class":1063},"        import",[1050,2780,2781],{"class":1067}," logging\n",[1050,2783,2785],{"class":1052,"line":2784},114,[1050,2786,1334],{"class":1067},[1050,2788,2790,2792,2794,2796,2798,2800,2802,2804,2806,2808,2810,2812],{"class":1052,"line":2789},115,[1050,2791,2516],{"class":1067},[1050,2793,1349],{"class":1071},[1050,2795,2521],{"class":1067},[1050,2797,1072],{"class":1071},[1050,2799,2527],{"class":2526},[1050,2801,1072],{"class":1071},[1050,2803,2532],{"class":1352},[1050,2805,1300],{"class":1071},[1050,2807,1480],{"class":1479},[1050,2809,2539],{"class":1483},[1050,2811,1480],{"class":1479},[1050,2813,1378],{"class":1071},[1050,2815,2817,2820,2822,2824,2826,2828,2830,2832,2834,2836,2839,2841,2843,2846],{"class":1052,"line":2816},116,[1050,2818,2819],{"class":1067},"        user_agent ",[1050,2821,1349],{"class":1071},[1050,2823,2521],{"class":1067},[1050,2825,1072],{"class":1071},[1050,2827,2527],{"class":2526},[1050,2829,1072],{"class":1071},[1050,2831,2532],{"class":1352},[1050,2833,1300],{"class":1071},[1050,2835,1480],{"class":1479},[1050,2837,2838],{"class":1483},"HTTP_USER_AGENT",[1050,2840,1480],{"class":1479},[1050,2842,1089],{"class":1071},[1050,2844,2845],{"class":1479}," ''",[1050,2847,1378],{"class":1071},[1050,2849,2851],{"class":1052,"line":2850},117,[1050,2852,1334],{"class":1067},[1050,2854,2856],{"class":1052,"line":2855},118,[1050,2857,2858],{"class":1056},"        # Increment counters\n",[1050,2860,2862,2864,2866,2868,2870,2872,2874,2876],{"class":1052,"line":2861},119,[1050,2863,2549],{"class":1067},[1050,2865,1349],{"class":1071},[1050,2867,2285],{"class":1249},[1050,2869,2556],{"class":1483},[1050,2871,2292],{"class":2291},[1050,2873,2561],{"class":1067},[1050,2875,2314],{"class":2291},[1050,2877,1774],{"class":1483},[1050,2879,2881,2883,2885,2887,2889,2891,2893,2895],{"class":1052,"line":2880},120,[1050,2882,2609],{"class":1067},[1050,2884,1349],{"class":1071},[1050,2886,2285],{"class":1249},[1050,2888,2616],{"class":1483},[1050,2890,2292],{"class":2291},[1050,2892,1366],{"class":1067},[1050,2894,2314],{"class":2291},[1050,2896,1774],{"class":1483},[1050,2898,2900],{"class":1052,"line":2899},121,[1050,2901,1334],{"class":1067},[1050,2903,2905,2907,2909,2911,2913,2915,2917,2919,2921,2923,2925,2928],{"class":1052,"line":2904},122,[1050,2906,2571],{"class":1067},[1050,2908,1349],{"class":1071},[1050,2910,2576],{"class":1067},[1050,2912,1072],{"class":1071},[1050,2914,2532],{"class":1352},[1050,2916,1300],{"class":1071},[1050,2918,2585],{"class":1352},[1050,2920,1089],{"class":1071},[1050,2922,2590],{"class":2112},[1050,2924,1583],{"class":1071},[1050,2926,2927],{"class":1395}," +",[1050,2929,2930],{"class":2112}," 1\n",[1050,2932,2934,2936,2938,2940,2942,2944,2946,2948,2950,2952,2954,2956],{"class":1052,"line":2933},123,[1050,2935,2630],{"class":1067},[1050,2937,1349],{"class":1071},[1050,2939,2576],{"class":1067},[1050,2941,1072],{"class":1071},[1050,2943,2532],{"class":1352},[1050,2945,1300],{"class":1071},[1050,2947,2643],{"class":1352},[1050,2949,1089],{"class":1071},[1050,2951,2590],{"class":2112},[1050,2953,1583],{"class":1071},[1050,2955,2927],{"class":1395},[1050,2957,2930],{"class":2112},[1050,2959,2961],{"class":1052,"line":2960},124,[1050,2962,1334],{"class":1067},[1050,2964,2966,2969,2971,2974,2976,2978,2980,2983,2985,2988,2990],{"class":1052,"line":2965},125,[1050,2967,2968],{"class":1067},"        cache",[1050,2970,1072],{"class":1071},[1050,2972,2973],{"class":1352},"set",[1050,2975,1300],{"class":1071},[1050,2977,2585],{"class":1352},[1050,2979,1089],{"class":1071},[1050,2981,2982],{"class":1352}," ip_attempts",[1050,2984,1089],{"class":1071},[1050,2986,2987],{"class":2112}," 300",[1050,2989,1583],{"class":1071},[1050,2991,2992],{"class":1056},"  # 5 minutes\n",[1050,2994,2996,2998,3000,3002,3004,3006,3008,3011,3013,3015],{"class":1052,"line":2995},126,[1050,2997,2968],{"class":1067},[1050,2999,1072],{"class":1071},[1050,3001,2973],{"class":1352},[1050,3003,1300],{"class":1071},[1050,3005,2643],{"class":1352},[1050,3007,1089],{"class":1071},[1050,3009,3010],{"class":1352}," username_attempts",[1050,3012,1089],{"class":1071},[1050,3014,2987],{"class":2112},[1050,3016,1378],{"class":1071},[1050,3018,3020],{"class":1052,"line":3019},127,[1050,3021,1334],{"class":1067},[1050,3023,3025],{"class":1052,"line":3024},128,[1050,3026,3027],{"class":1056},"        # Log the attempt\n",[1050,3029,3031,3034,3036,3039,3041,3044,3046,3048,3051,3053],{"class":1052,"line":3030},129,[1050,3032,3033],{"class":1067},"        logger ",[1050,3035,1349],{"class":1071},[1050,3037,3038],{"class":1067}," logging",[1050,3040,1072],{"class":1071},[1050,3042,3043],{"class":1352},"getLogger",[1050,3045,1300],{"class":1071},[1050,3047,1480],{"class":1479},[1050,3049,3050],{"class":1483},"security",[1050,3052,1480],{"class":1479},[1050,3054,1378],{"class":1071},[1050,3056,3058,3061,3063,3066],{"class":1052,"line":3057},130,[1050,3059,3060],{"class":1067},"        logger",[1050,3062,1072],{"class":1071},[1050,3064,3065],{"class":1352},"warning",[1050,3067,3068],{"class":1071},"(\n",[1050,3070,3072,3075,3078,3080,3082,3084],{"class":1052,"line":3071},131,[1050,3073,3074],{"class":1249},"            f",[1050,3076,3077],{"class":1483},"\"Failed login attempt - Username: ",[1050,3079,2292],{"class":2291},[1050,3081,1366],{"class":1352},[1050,3083,2314],{"class":2291},[1050,3085,3086],{"class":1483},", \"\n",[1050,3088,3090,3092,3095,3097,3099,3101,3104,3106,3109,3112,3115,3117,3119],{"class":1052,"line":3089},132,[1050,3091,3074],{"class":1249},[1050,3093,3094],{"class":1483},"\"IP: ",[1050,3096,2292],{"class":2291},[1050,3098,2561],{"class":1352},[1050,3100,2314],{"class":2291},[1050,3102,3103],{"class":1483},", User-Agent: ",[1050,3105,2292],{"class":2291},[1050,3107,3108],{"class":1352},"user_agent",[1050,3110,3111],{"class":1071},"[:",[1050,3113,3114],{"class":2112},"100",[1050,3116,1489],{"class":1071},[1050,3118,2314],{"class":2291},[1050,3120,1774],{"class":1483},[1050,3122,3124],{"class":1052,"line":3123},133,[1050,3125,3126],{"class":1071},"        )\n",[1050,3128,3130],{"class":1052,"line":3129},134,[1050,3131,1277],{"class":1067},[1050,3133,3135,3137],{"class":1052,"line":3134},135,[1050,3136,1283],{"class":1071},[1050,3138,1287],{"class":1286},[1050,3140,3142,3144,3147,3149,3151,3153,3155],{"class":1052,"line":3141},136,[1050,3143,1293],{"class":1249},[1050,3145,3146],{"class":1296}," clear_failed_attempts",[1050,3148,1300],{"class":1071},[1050,3150,1304],{"class":1303},[1050,3152,1089],{"class":1071},[1050,3154,1309],{"class":1303},[1050,3156,1317],{"class":1071},[1050,3158,3160,3162,3165],{"class":1052,"line":3159},137,[1050,3161,1323],{"class":1263},[1050,3163,3164],{"class":1267},"Clear failed login attempt counters",[1050,3166,1271],{"class":1263},[1050,3168,3170],{"class":1052,"line":3169},138,[1050,3171,1334],{"class":1067},[1050,3173,3175,3177,3179,3181,3183,3185,3187,3189],{"class":1052,"line":3174},139,[1050,3176,2483],{"class":1063},[1050,3178,1068],{"class":1067},[1050,3180,1072],{"class":1071},[1050,3182,2490],{"class":1067},[1050,3184,1072],{"class":1071},[1050,3186,1209],{"class":1067},[1050,3188,1083],{"class":1063},[1050,3190,2499],{"class":1067},[1050,3192,3194],{"class":1052,"line":3193},140,[1050,3195,1334],{"class":1067},[1050,3197,3199,3201,3203,3205,3207,3209,3211,3213,3215,3217,3219,3221],{"class":1052,"line":3198},141,[1050,3200,2516],{"class":1067},[1050,3202,1349],{"class":1071},[1050,3204,2521],{"class":1067},[1050,3206,1072],{"class":1071},[1050,3208,2527],{"class":2526},[1050,3210,1072],{"class":1071},[1050,3212,2532],{"class":1352},[1050,3214,1300],{"class":1071},[1050,3216,1480],{"class":1479},[1050,3218,2539],{"class":1483},[1050,3220,1480],{"class":1479},[1050,3222,1378],{"class":1071},[1050,3224,3226,3228,3230,3232,3234,3236,3238,3240],{"class":1052,"line":3225},142,[1050,3227,2549],{"class":1067},[1050,3229,1349],{"class":1071},[1050,3231,2285],{"class":1249},[1050,3233,2556],{"class":1483},[1050,3235,2292],{"class":2291},[1050,3237,2561],{"class":1067},[1050,3239,2314],{"class":2291},[1050,3241,1774],{"class":1483},[1050,3243,3245,3247,3249,3251,3253,3255,3257,3259],{"class":1052,"line":3244},143,[1050,3246,2609],{"class":1067},[1050,3248,1349],{"class":1071},[1050,3250,2285],{"class":1249},[1050,3252,2616],{"class":1483},[1050,3254,2292],{"class":2291},[1050,3256,1366],{"class":1067},[1050,3258,2314],{"class":2291},[1050,3260,1774],{"class":1483},[1050,3262,3264],{"class":1052,"line":3263},144,[1050,3265,1334],{"class":1067},[1050,3267,3269,3271,3273,3276,3278,3280],{"class":1052,"line":3268},145,[1050,3270,2968],{"class":1067},[1050,3272,1072],{"class":1071},[1050,3274,3275],{"class":1352},"delete",[1050,3277,1300],{"class":1071},[1050,3279,2585],{"class":1352},[1050,3281,1378],{"class":1071},[1050,3283,3285,3287,3289,3291,3293,3295],{"class":1052,"line":3284},146,[1050,3286,2968],{"class":1067},[1050,3288,1072],{"class":1071},[1050,3290,3275],{"class":1352},[1050,3292,1300],{"class":1071},[1050,3294,2643],{"class":1352},[1050,3296,1378],{"class":1071},[1050,3298,3300],{"class":1052,"line":3299},147,[1050,3301,1277],{"class":1067},[1050,3303,3305,3307],{"class":1052,"line":3304},148,[1050,3306,1283],{"class":1071},[1050,3308,1287],{"class":1286},[1050,3310,3312,3314,3317,3319,3321,3323,3325],{"class":1052,"line":3311},149,[1050,3313,1293],{"class":1249},[1050,3315,3316],{"class":1296}," set_enhanced_session_data",[1050,3318,1300],{"class":1071},[1050,3320,1304],{"class":1303},[1050,3322,1089],{"class":1071},[1050,3324,1420],{"class":1303},[1050,3326,1317],{"class":1071},[1050,3328,3330,3332,3335],{"class":1052,"line":3329},150,[1050,3331,1323],{"class":1263},[1050,3333,3334],{"class":1267},"Set enhanced session data for security and UX",[1050,3336,1271],{"class":1263},[1050,3338,3340],{"class":1052,"line":3339},151,[1050,3341,1334],{"class":1067},[1050,3343,3345,3348,3350,3352,3354,3357],{"class":1052,"line":3344},152,[1050,3346,3347],{"class":1067},"        request",[1050,3349,1072],{"class":1071},[1050,3351,1473],{"class":1425},[1050,3353,1072],{"class":1071},[1050,3355,3356],{"class":1352},"update",[1050,3358,3359],{"class":1071},"({\n",[1050,3361,3363,3366,3368,3370,3372,3374,3376,3378,3380,3382],{"class":1052,"line":3362},153,[1050,3364,3365],{"class":1479},"            '",[1050,3367,1484],{"class":1483},[1050,3369,1480],{"class":1479},[1050,3371,1548],{"class":1071},[1050,3373,1495],{"class":1352},[1050,3375,1072],{"class":1071},[1050,3377,1500],{"class":1352},[1050,3379,1503],{"class":1071},[1050,3381,1506],{"class":1352},[1050,3383,3384],{"class":1071},"(),\n",[1050,3386,3388,3390,3393,3395,3397,3399,3401,3403,3405,3407,3409,3411,3413,3415],{"class":1052,"line":3387},154,[1050,3389,3365],{"class":1479},[1050,3391,3392],{"class":1483},"login_ip",[1050,3394,1480],{"class":1479},[1050,3396,1548],{"class":1071},[1050,3398,2521],{"class":1352},[1050,3400,1072],{"class":1071},[1050,3402,2527],{"class":2526},[1050,3404,1072],{"class":1071},[1050,3406,2532],{"class":1352},[1050,3408,1300],{"class":1071},[1050,3410,1480],{"class":1479},[1050,3412,2539],{"class":1483},[1050,3414,1480],{"class":1479},[1050,3416,3417],{"class":1071},"),\n",[1050,3419,3421,3423,3426,3428,3430,3433,3435,3438],{"class":1052,"line":3420},155,[1050,3422,3365],{"class":1479},[1050,3424,3425],{"class":1483},"user_agent_hash",[1050,3427,1480],{"class":1479},[1050,3429,1548],{"class":1071},[1050,3431,3432],{"class":1352}," hashlib",[1050,3434,1072],{"class":1071},[1050,3436,3437],{"class":1352},"md5",[1050,3439,3068],{"class":1071},[1050,3441,3443,3445,3447,3449,3451,3453,3455,3457,3459,3461,3463,3465,3468,3471],{"class":1052,"line":3442},156,[1050,3444,1468],{"class":1352},[1050,3446,1072],{"class":1071},[1050,3448,2527],{"class":2526},[1050,3450,1072],{"class":1071},[1050,3452,2532],{"class":1352},[1050,3454,1300],{"class":1071},[1050,3456,1480],{"class":1479},[1050,3458,2838],{"class":1483},[1050,3460,1480],{"class":1479},[1050,3462,1089],{"class":1071},[1050,3464,2845],{"class":1479},[1050,3466,3467],{"class":1071},").",[1050,3469,3470],{"class":1352},"encode",[1050,3472,1509],{"class":1071},[1050,3474,3476,3479,3482],{"class":1052,"line":3475},157,[1050,3477,3478],{"class":1071},"            ).",[1050,3480,3481],{"class":1352},"hexdigest",[1050,3483,3384],{"class":1071},[1050,3485,3487,3489,3492,3494,3496,3498,3500,3503],{"class":1052,"line":3486},158,[1050,3488,3365],{"class":1479},[1050,3490,3491],{"class":1483},"user_id",[1050,3493,1480],{"class":1479},[1050,3495,1548],{"class":1071},[1050,3497,1420],{"class":1352},[1050,3499,1072],{"class":1071},[1050,3501,3502],{"class":1425},"id",[1050,3504,1615],{"class":1071},[1050,3506,3508,3510,3512,3514,3516,3518,3520,3522],{"class":1052,"line":3507},159,[1050,3509,3365],{"class":1479},[1050,3511,1366],{"class":1483},[1050,3513,1480],{"class":1479},[1050,3515,1548],{"class":1071},[1050,3517,1420],{"class":1352},[1050,3519,1072],{"class":1071},[1050,3521,1366],{"class":1425},[1050,3523,1615],{"class":1071},[1050,3525,3527,3529,3532,3534,3536,3538,3540,3542],{"class":1052,"line":3526},160,[1050,3528,3365],{"class":1479},[1050,3530,3531],{"class":1483},"is_staff",[1050,3533,1480],{"class":1479},[1050,3535,1548],{"class":1071},[1050,3537,1420],{"class":1352},[1050,3539,1072],{"class":1071},[1050,3541,3531],{"class":1425},[1050,3543,1615],{"class":1071},[1050,3545,3547,3549,3552,3554,3556,3558,3560,3562],{"class":1052,"line":3546},161,[1050,3548,3365],{"class":1479},[1050,3550,3551],{"class":1483},"is_superuser",[1050,3553,1480],{"class":1479},[1050,3555,1548],{"class":1071},[1050,3557,1420],{"class":1352},[1050,3559,1072],{"class":1071},[1050,3561,3551],{"class":1425},[1050,3563,1615],{"class":1071},[1050,3565,3567],{"class":1052,"line":3566},162,[1050,3568,3569],{"class":1071},"        })\n",[1050,3571,3573],{"class":1052,"line":3572},163,[1050,3574,1334],{"class":1067},[1050,3576,3578],{"class":1052,"line":3577},164,[1050,3579,3580],{"class":1056},"        # User preferences\n",[1050,3582,3584,3586,3588,3590,3592,3594,3596,3598,3600],{"class":1052,"line":3583},165,[1050,3585,1389],{"class":1063},[1050,3587,1589],{"class":1551},[1050,3589,1300],{"class":1071},[1050,3591,1557],{"class":1352},[1050,3593,1089],{"class":1071},[1050,3595,1567],{"class":1479},[1050,3597,1562],{"class":1483},[1050,3599,1480],{"class":1479},[1050,3601,1317],{"class":1071},[1050,3603,3605,3608,3610,3612,3614,3616,3618,3620,3622,3624],{"class":1052,"line":3604},166,[1050,3606,3607],{"class":1067},"            request",[1050,3609,1072],{"class":1071},[1050,3611,1473],{"class":1425},[1050,3613,1476],{"class":1071},[1050,3615,1480],{"class":1479},[1050,3617,1525],{"class":1483},[1050,3619,1480],{"class":1479},[1050,3621,1489],{"class":1071},[1050,3623,1492],{"class":1071},[1050,3625,1534],{"class":1071},[1050,3627,3629,3632,3634,3636,3638,3640,3642,3644,3646,3648,3650,3652,3654,3656,3658,3660,3662,3664,3666,3668,3670,3672,3674,3676,3678],{"class":1052,"line":3628},167,[1050,3630,3631],{"class":1479},"                '",[1050,3633,1543],{"class":1483},[1050,3635,1480],{"class":1479},[1050,3637,1548],{"class":1071},[1050,3639,1420],{"class":1067},[1050,3641,1072],{"class":1071},[1050,3643,1562],{"class":1425},[1050,3645,1072],{"class":1071},[1050,3647,1543],{"class":1425},[1050,3649,1586],{"class":1063},[1050,3651,1589],{"class":1551},[1050,3653,1300],{"class":1071},[1050,3655,1557],{"class":1352},[1050,3657,1072],{"class":1071},[1050,3659,1562],{"class":1425},[1050,3661,1089],{"class":1071},[1050,3663,1567],{"class":1479},[1050,3665,1543],{"class":1483},[1050,3667,1480],{"class":1479},[1050,3669,1583],{"class":1071},[1050,3671,1606],{"class":1063},[1050,3673,1567],{"class":1479},[1050,3675,1578],{"class":1483},[1050,3677,1480],{"class":1479},[1050,3679,1615],{"class":1071},[1050,3681,3683,3685,3687,3689,3691,3693,3695,3697,3699,3701,3703,3705,3707,3709,3711,3713,3715,3717,3719,3721,3723,3725,3727,3729,3731],{"class":1052,"line":3682},168,[1050,3684,3631],{"class":1479},[1050,3686,1623],{"class":1483},[1050,3688,1480],{"class":1479},[1050,3690,1548],{"class":1071},[1050,3692,1420],{"class":1067},[1050,3694,1072],{"class":1071},[1050,3696,1562],{"class":1425},[1050,3698,1072],{"class":1071},[1050,3700,1623],{"class":1425},[1050,3702,1586],{"class":1063},[1050,3704,1589],{"class":1551},[1050,3706,1300],{"class":1071},[1050,3708,1557],{"class":1352},[1050,3710,1072],{"class":1071},[1050,3712,1562],{"class":1425},[1050,3714,1089],{"class":1071},[1050,3716,1567],{"class":1479},[1050,3718,1623],{"class":1483},[1050,3720,1480],{"class":1479},[1050,3722,1583],{"class":1071},[1050,3724,1606],{"class":1063},[1050,3726,1567],{"class":1479},[1050,3728,1652],{"class":1483},[1050,3730,1480],{"class":1479},[1050,3732,1615],{"class":1071},[1050,3734,3736,3738,3741,3743,3745,3748,3750,3752,3754,3756,3758,3760,3762,3764,3766,3768,3770,3772,3774,3776,3778,3780,3782,3784,3786,3788,3791,3793],{"class":1052,"line":3735},169,[1050,3737,3631],{"class":1479},[1050,3739,3740],{"class":1483},"timezone",[1050,3742,1480],{"class":1479},[1050,3744,1548],{"class":1071},[1050,3746,3747],{"class":1286}," str",[1050,3749,1300],{"class":1071},[1050,3751,1557],{"class":1352},[1050,3753,1072],{"class":1071},[1050,3755,1562],{"class":1425},[1050,3757,1072],{"class":1071},[1050,3759,3740],{"class":1425},[1050,3761,1583],{"class":1071},[1050,3763,1586],{"class":1063},[1050,3765,1589],{"class":1551},[1050,3767,1300],{"class":1071},[1050,3769,1557],{"class":1352},[1050,3771,1072],{"class":1071},[1050,3773,1562],{"class":1425},[1050,3775,1089],{"class":1071},[1050,3777,1567],{"class":1479},[1050,3779,3740],{"class":1483},[1050,3781,1480],{"class":1479},[1050,3783,1583],{"class":1071},[1050,3785,1606],{"class":1063},[1050,3787,1567],{"class":1479},[1050,3789,3790],{"class":1483},"UTC",[1050,3792,1480],{"class":1479},[1050,3794,1615],{"class":1071},[1050,3796,3798],{"class":1052,"line":3797},170,[1050,3799,3800],{"class":1071},"            }\n",[1050,3802,3804],{"class":1052,"line":3803},171,[1050,3805,1277],{"class":1067},[1050,3807,3809,3811],{"class":1052,"line":3808},172,[1050,3810,1283],{"class":1071},[1050,3812,1287],{"class":1286},[1050,3814,3816,3818,3821,3823,3825,3827,3829,3831,3833,3835,3837,3839,3841,3843,3846],{"class":1052,"line":3815},173,[1050,3817,1293],{"class":1249},[1050,3819,3820],{"class":1296}," log_login_attempt",[1050,3822,1300],{"class":1071},[1050,3824,1304],{"class":1303},[1050,3826,1089],{"class":1071},[1050,3828,1420],{"class":1303},[1050,3830,1089],{"class":1071},[1050,3832,2230],{"class":1303},[1050,3834,1349],{"class":1395},[1050,3836,2235],{"class":1402},[1050,3838,1089],{"class":1071},[1050,3840,2354],{"class":1303},[1050,3842,1349],{"class":1395},[1050,3844,3845],{"class":1402},"None",[1050,3847,1317],{"class":1071},[1050,3849,3851,3853,3856],{"class":1052,"line":3850},174,[1050,3852,1323],{"class":1263},[1050,3854,3855],{"class":1267},"Log login attempts for audit purposes",[1050,3857,1271],{"class":1263},[1050,3859,3861],{"class":1052,"line":3860},175,[1050,3862,1334],{"class":1067},[1050,3864,3866,3868],{"class":1052,"line":3865},176,[1050,3867,2778],{"class":1063},[1050,3869,2781],{"class":1067},[1050,3871,3873],{"class":1052,"line":3872},177,[1050,3874,1334],{"class":1067},[1050,3876,3878,3880,3882,3884,3886,3888,3890,3892,3895,3897],{"class":1052,"line":3877},178,[1050,3879,3033],{"class":1067},[1050,3881,1349],{"class":1071},[1050,3883,3038],{"class":1067},[1050,3885,1072],{"class":1071},[1050,3887,3043],{"class":1352},[1050,3889,1300],{"class":1071},[1050,3891,1480],{"class":1479},[1050,3893,3894],{"class":1483},"auth_audit",[1050,3896,1480],{"class":1479},[1050,3898,1378],{"class":1071},[1050,3900,3902],{"class":1052,"line":3901},179,[1050,3903,1334],{"class":1067},[1050,3905,3907,3910,3912],{"class":1052,"line":3906},180,[1050,3908,3909],{"class":1067},"        log_data ",[1050,3911,1349],{"class":1071},[1050,3913,1534],{"class":1071},[1050,3915,3917,3919,3921,3923,3925,3927,3929,3931,3933,3935,3938,3940,3943,3945],{"class":1052,"line":3916},181,[1050,3918,3365],{"class":1479},[1050,3920,1366],{"class":1483},[1050,3922,1480],{"class":1479},[1050,3924,1548],{"class":1071},[1050,3926,1420],{"class":1067},[1050,3928,1072],{"class":1071},[1050,3930,1366],{"class":1425},[1050,3932,1586],{"class":1063},[1050,3934,1392],{"class":1067},[1050,3936,3937],{"class":1063},"else",[1050,3939,1567],{"class":1479},[1050,3941,3942],{"class":1483},"unknown",[1050,3944,1480],{"class":1479},[1050,3946,1615],{"class":1071},[1050,3948,3950,3952,3954,3956,3958,3960,3962,3964,3966,3968,3970,3972,3974,3976],{"class":1052,"line":3949},182,[1050,3951,3365],{"class":1479},[1050,3953,2561],{"class":1483},[1050,3955,1480],{"class":1479},[1050,3957,1548],{"class":1071},[1050,3959,2521],{"class":1067},[1050,3961,1072],{"class":1071},[1050,3963,2527],{"class":2526},[1050,3965,1072],{"class":1071},[1050,3967,2532],{"class":1352},[1050,3969,1300],{"class":1071},[1050,3971,1480],{"class":1479},[1050,3973,2539],{"class":1483},[1050,3975,1480],{"class":1479},[1050,3977,3417],{"class":1071},[1050,3979,3981,3983,3985,3987,3989,3991,3993,3995,3997,3999,4001,4003,4005,4007,4009,4011,4014,4017],{"class":1052,"line":3980},183,[1050,3982,3365],{"class":1479},[1050,3984,3108],{"class":1483},[1050,3986,1480],{"class":1479},[1050,3988,1548],{"class":1071},[1050,3990,2521],{"class":1067},[1050,3992,1072],{"class":1071},[1050,3994,2527],{"class":2526},[1050,3996,1072],{"class":1071},[1050,3998,2532],{"class":1352},[1050,4000,1300],{"class":1071},[1050,4002,1480],{"class":1479},[1050,4004,2838],{"class":1483},[1050,4006,1480],{"class":1479},[1050,4008,1089],{"class":1071},[1050,4010,2845],{"class":1479},[1050,4012,4013],{"class":1071},")[:",[1050,4015,4016],{"class":2112},"200",[1050,4018,4019],{"class":1071},"],\n",[1050,4021,4023,4025,4028,4030,4032,4034],{"class":1052,"line":4022},184,[1050,4024,3365],{"class":1479},[1050,4026,4027],{"class":1483},"success",[1050,4029,1480],{"class":1479},[1050,4031,1548],{"class":1071},[1050,4033,2230],{"class":1067},[1050,4035,1615],{"class":1071},[1050,4037,4039,4041,4044,4046,4048,4050,4052,4054,4056,4058],{"class":1052,"line":4038},185,[1050,4040,3365],{"class":1479},[1050,4042,4043],{"class":1483},"timestamp",[1050,4045,1480],{"class":1479},[1050,4047,1548],{"class":1071},[1050,4049,1495],{"class":1067},[1050,4051,1072],{"class":1071},[1050,4053,1500],{"class":1352},[1050,4055,1503],{"class":1071},[1050,4057,1506],{"class":1352},[1050,4059,3384],{"class":1071},[1050,4061,4063],{"class":1052,"line":4062},186,[1050,4064,4065],{"class":1071},"        }\n",[1050,4067,4069],{"class":1052,"line":4068},187,[1050,4070,1334],{"class":1067},[1050,4072,4074,4076,4078],{"class":1052,"line":4073},188,[1050,4075,1389],{"class":1063},[1050,4077,2354],{"class":1067},[1050,4079,1257],{"class":1071},[1050,4081,4083,4086,4088,4090,4093,4095,4097,4099],{"class":1052,"line":4082},189,[1050,4084,4085],{"class":1067},"            log_data",[1050,4087,1476],{"class":1071},[1050,4089,1480],{"class":1479},[1050,4091,4092],{"class":1483},"reason",[1050,4094,1480],{"class":1479},[1050,4096,1489],{"class":1071},[1050,4098,1492],{"class":1071},[1050,4100,4101],{"class":1067}," reason\n",[1050,4103,4105],{"class":1052,"line":4104},190,[1050,4106,1334],{"class":1067},[1050,4108,4110,4112,4114],{"class":1052,"line":4109},191,[1050,4111,1389],{"class":1063},[1050,4113,2230],{"class":1067},[1050,4115,1257],{"class":1071},[1050,4117,4119,4122,4124,4127,4129,4132,4135,4137,4140,4142,4144],{"class":1052,"line":4118},192,[1050,4120,4121],{"class":1067},"            logger",[1050,4123,1072],{"class":1071},[1050,4125,4126],{"class":1352},"info",[1050,4128,1300],{"class":1071},[1050,4130,4131],{"class":1249},"f",[1050,4133,4134],{"class":1483},"\"Successful login: ",[1050,4136,2292],{"class":2291},[1050,4138,4139],{"class":1352},"log_data",[1050,4141,2314],{"class":2291},[1050,4143,2359],{"class":1483},[1050,4145,1378],{"class":1071},[1050,4147,4149,4151],{"class":1052,"line":4148},193,[1050,4150,1805],{"class":1063},[1050,4152,1257],{"class":1071},[1050,4154,4156,4158,4160,4162,4164,4166,4169,4171,4173,4175,4177],{"class":1052,"line":4155},194,[1050,4157,4121],{"class":1067},[1050,4159,1072],{"class":1071},[1050,4161,3065],{"class":1352},[1050,4163,1300],{"class":1071},[1050,4165,4131],{"class":1249},[1050,4167,4168],{"class":1483},"\"Failed login: ",[1050,4170,2292],{"class":2291},[1050,4172,4139],{"class":1352},[1050,4174,2314],{"class":2291},[1050,4176,2359],{"class":1483},[1050,4178,1378],{"class":1071},[1050,4180,4182],{"class":1052,"line":4181},195,[1050,4183,1277],{"class":1067},[1050,4185,4187,4189],{"class":1052,"line":4186},196,[1050,4188,1283],{"class":1071},[1050,4190,1287],{"class":1286},[1050,4192,4194,4196,4199,4201,4203],{"class":1052,"line":4193},197,[1050,4195,1293],{"class":1249},[1050,4197,4198],{"class":1296}," is_account_locked",[1050,4200,1300],{"class":1071},[1050,4202,1557],{"class":1303},[1050,4204,1317],{"class":1071},[1050,4206,4208,4210,4213],{"class":1052,"line":4207},198,[1050,4209,1323],{"class":1263},[1050,4211,4212],{"class":1267},"Check if account is locked due to suspicious activity",[1050,4214,1271],{"class":1263},[1050,4216,4218],{"class":1052,"line":4217},199,[1050,4219,1334],{"class":1067},[1050,4221,4223],{"class":1052,"line":4222},200,[1050,4224,4225],{"class":1056},"        # This would integrate with your account security system\n",[1050,4227,4229],{"class":1052,"line":4228},201,[1050,4230,4231],{"class":1056},"        # Example implementation:\n",[1050,4233,4235],{"class":1052,"line":4234},202,[1050,4236,1334],{"class":1067},[1050,4238,4240,4242,4244,4246,4248,4250,4252,4254],{"class":1052,"line":4239},203,[1050,4241,2483],{"class":1063},[1050,4243,1068],{"class":1067},[1050,4245,1072],{"class":1071},[1050,4247,2490],{"class":1067},[1050,4249,1072],{"class":1071},[1050,4251,1209],{"class":1067},[1050,4253,1083],{"class":1063},[1050,4255,2499],{"class":1067},[1050,4257,4259],{"class":1052,"line":4258},204,[1050,4260,1334],{"class":1067},[1050,4262,4264,4267,4269,4271,4274,4276,4278,4280,4282,4284],{"class":1052,"line":4263},205,[1050,4265,4266],{"class":1067},"        lock_key ",[1050,4268,1349],{"class":1071},[1050,4270,2285],{"class":1249},[1050,4272,4273],{"class":1483},"\"account_locked_",[1050,4275,2292],{"class":2291},[1050,4277,1557],{"class":1067},[1050,4279,1072],{"class":1071},[1050,4281,1366],{"class":1425},[1050,4283,2314],{"class":2291},[1050,4285,1774],{"class":1483},[1050,4287,4289,4291,4293,4295,4297,4299,4302,4304,4306],{"class":1052,"line":4288},206,[1050,4290,2705],{"class":1063},[1050,4292,2576],{"class":1067},[1050,4294,1072],{"class":1071},[1050,4296,2532],{"class":1352},[1050,4298,1300],{"class":1071},[1050,4300,4301],{"class":1352},"lock_key",[1050,4303,1089],{"class":1071},[1050,4305,1790],{"class":1402},[1050,4307,1378],{"class":1071},[1050,4309,4311],{"class":1052,"line":4310},207,[1050,4312,1243],{"emptyLinePlaceholder":1242},[1050,4314,4316],{"class":1052,"line":4315},208,[1050,4317,4318],{"class":1056},"# Advanced login views\n",[1050,4320,4322,4324,4327,4329,4333],{"class":1052,"line":4321},209,[1050,4323,1250],{"class":1249},[1050,4325,4326],{"class":1253}," AdvancedLoginView",[1050,4328,1300],{"class":1071},[1050,4330,4332],{"class":4331},"sYn-s","LoginView",[1050,4334,1317],{"class":1071},[1050,4336,4338,4340,4343],{"class":1052,"line":4337},210,[1050,4339,1264],{"class":1263},[1050,4341,4342],{"class":1267},"Advanced login view with enhanced security",[1050,4344,1271],{"class":1263},[1050,4346,4348],{"class":1052,"line":4347},211,[1050,4349,1277],{"class":1067},[1050,4351,4353,4356,4358,4360,4363],{"class":1052,"line":4352},212,[1050,4354,4355],{"class":1067},"    template_name ",[1050,4357,1349],{"class":1071},[1050,4359,1567],{"class":1479},[1050,4361,4362],{"class":1483},"auth/advanced_login.html",[1050,4364,4365],{"class":1479},"'\n",[1050,4367,4369,4372,4374],{"class":1052,"line":4368},213,[1050,4370,4371],{"class":1067},"    form_class ",[1050,4373,1349],{"class":1071},[1050,4375,1123],{"class":1067},[1050,4377,4379,4382,4384],{"class":1052,"line":4378},214,[1050,4380,4381],{"class":1067},"    redirect_authenticated_user ",[1050,4383,1349],{"class":1071},[1050,4385,2708],{"class":1402},[1050,4387,4389],{"class":1052,"line":4388},215,[1050,4390,1277],{"class":1067},[1050,4392,4394,4396,4399,4401,4404],{"class":1052,"line":4393},216,[1050,4395,1283],{"class":1071},[1050,4397,4398],{"class":1296},"method_decorator",[1050,4400,1300],{"class":1071},[1050,4402,4403],{"class":1352},"csrf_protect",[1050,4405,1378],{"class":1071},[1050,4407,4409,4411,4413,4415,4418],{"class":1052,"line":4408},217,[1050,4410,1283],{"class":1071},[1050,4412,4398],{"class":1296},[1050,4414,1300],{"class":1071},[1050,4416,4417],{"class":1352},"never_cache",[1050,4419,1378],{"class":1071},[1050,4421,4423,4425,4428,4430,4434,4436,4438,4440,4442,4445,4447,4450,4453],{"class":1052,"line":4422},218,[1050,4424,1293],{"class":1249},[1050,4426,4427],{"class":1296}," dispatch",[1050,4429,1300],{"class":1071},[1050,4431,4433],{"class":4432},"sRjD_","self",[1050,4435,1089],{"class":1071},[1050,4437,2521],{"class":1303},[1050,4439,1089],{"class":1071},[1050,4441,2116],{"class":1395},[1050,4443,4444],{"class":1303},"args",[1050,4446,1089],{"class":1071},[1050,4448,4449],{"class":1395}," **",[1050,4451,4452],{"class":1303},"kwargs",[1050,4454,1317],{"class":1071},[1050,4456,4458,4460,4463,4465,4468,4470,4472,4474,4476,4478,4480,4482,4484],{"class":1052,"line":4457},219,[1050,4459,2705],{"class":1063},[1050,4461,4462],{"class":1286}," super",[1050,4464,1503],{"class":1071},[1050,4466,4467],{"class":1352},"dispatch",[1050,4469,1300],{"class":1071},[1050,4471,1304],{"class":1352},[1050,4473,1089],{"class":1071},[1050,4475,2116],{"class":1395},[1050,4477,4444],{"class":1352},[1050,4479,1089],{"class":1071},[1050,4481,4449],{"class":1395},[1050,4483,4452],{"class":1352},[1050,4485,1378],{"class":1071},[1050,4487,4489],{"class":1052,"line":4488},220,[1050,4490,1277],{"class":1067},[1050,4492,4494,4496,4499,4501,4503,4505,4507,4509],{"class":1052,"line":4493},221,[1050,4495,1293],{"class":1249},[1050,4497,4498],{"class":1296}," get_context_data",[1050,4500,1300],{"class":1071},[1050,4502,4433],{"class":4432},[1050,4504,1089],{"class":1071},[1050,4506,4449],{"class":1395},[1050,4508,4452],{"class":1303},[1050,4510,1317],{"class":1071},[1050,4512,4514,4516,4519],{"class":1052,"line":4513},222,[1050,4515,1323],{"class":1263},[1050,4517,4518],{"class":1267},"Add security context to login form",[1050,4520,1271],{"class":1263},[1050,4522,4524],{"class":1052,"line":4523},223,[1050,4525,1334],{"class":1067},[1050,4527,4529,4532,4534,4536,4538,4541,4543,4546,4548],{"class":1052,"line":4528},224,[1050,4530,4531],{"class":1067},"        context ",[1050,4533,1349],{"class":1071},[1050,4535,4462],{"class":1286},[1050,4537,1503],{"class":1071},[1050,4539,4540],{"class":1352},"get_context_data",[1050,4542,1300],{"class":1071},[1050,4544,4545],{"class":1395},"**",[1050,4547,4452],{"class":1352},[1050,4549,1378],{"class":1071},[1050,4551,4553],{"class":1052,"line":4552},225,[1050,4554,1334],{"class":1067},[1050,4556,4558],{"class":1052,"line":4557},226,[1050,4559,4560],{"class":1056},"        # Add security information\n",[1050,4562,4564,4567,4569,4571],{"class":1052,"line":4563},227,[1050,4565,4566],{"class":1067},"        context",[1050,4568,1072],{"class":1071},[1050,4570,3356],{"class":1352},[1050,4572,3359],{"class":1071},[1050,4574,4576,4578,4581,4583,4585],{"class":1052,"line":4575},228,[1050,4577,3365],{"class":1479},[1050,4579,4580],{"class":1483},"security_features",[1050,4582,1480],{"class":1479},[1050,4584,1548],{"class":1071},[1050,4586,4587],{"class":1071}," [\n",[1050,4589,4591,4593,4596,4598],{"class":1052,"line":4590},229,[1050,4592,3631],{"class":1479},[1050,4594,4595],{"class":1483},"Secure password hashing",[1050,4597,1480],{"class":1479},[1050,4599,1615],{"class":1071},[1050,4601,4603,4605,4608,4610],{"class":1052,"line":4602},230,[1050,4604,3631],{"class":1479},[1050,4606,4607],{"class":1483},"Rate limiting protection",[1050,4609,1480],{"class":1479},[1050,4611,1615],{"class":1071},[1050,4613,4615,4617,4620,4622],{"class":1052,"line":4614},231,[1050,4616,3631],{"class":1479},[1050,4618,4619],{"class":1483},"Session security",[1050,4621,1480],{"class":1479},[1050,4623,1615],{"class":1071},[1050,4625,4627,4629,4632],{"class":1052,"line":4626},232,[1050,4628,3631],{"class":1479},[1050,4630,4631],{"class":1483},"Login attempt monitoring",[1050,4633,4365],{"class":1479},[1050,4635,4637],{"class":1052,"line":4636},233,[1050,4638,4639],{"class":1071},"            ],\n",[1050,4641,4643,4645,4648,4650,4652],{"class":1052,"line":4642},234,[1050,4644,3365],{"class":1479},[1050,4646,4647],{"class":1483},"login_help",[1050,4649,1480],{"class":1479},[1050,4651,1548],{"class":1071},[1050,4653,1534],{"class":1071},[1050,4655,4657,4659,4662,4664,4666,4668],{"class":1052,"line":4656},235,[1050,4658,3631],{"class":1479},[1050,4660,4661],{"class":1483},"forgot_password",[1050,4663,1480],{"class":1479},[1050,4665,1548],{"class":1071},[1050,4667,1763],{"class":1402},[1050,4669,1615],{"class":1071},[1050,4671,4673,4675,4678,4680,4682,4684],{"class":1052,"line":4672},236,[1050,4674,3631],{"class":1479},[1050,4676,4677],{"class":1483},"account_locked",[1050,4679,1480],{"class":1479},[1050,4681,1548],{"class":1071},[1050,4683,1763],{"class":1402},[1050,4685,1615],{"class":1071},[1050,4687,4689,4691,4694,4696,4698,4700],{"class":1052,"line":4688},237,[1050,4690,3631],{"class":1479},[1050,4692,4693],{"class":1483},"registration",[1050,4695,1480],{"class":1479},[1050,4697,1548],{"class":1071},[1050,4699,1763],{"class":1402},[1050,4701,1615],{"class":1071},[1050,4703,4705],{"class":1052,"line":4704},238,[1050,4706,3800],{"class":1071},[1050,4708,4710],{"class":1052,"line":4709},239,[1050,4711,3569],{"class":1071},[1050,4713,4715],{"class":1052,"line":4714},240,[1050,4716,1334],{"class":1067},[1050,4718,4720,4722],{"class":1052,"line":4719},241,[1050,4721,2705],{"class":1063},[1050,4723,4724],{"class":1067}," context\n",[1050,4726,4728],{"class":1052,"line":4727},242,[1050,4729,1277],{"class":1067},[1050,4731,4733,4735,4738,4740,4742,4744,4747],{"class":1052,"line":4732},243,[1050,4734,1293],{"class":1249},[1050,4736,4737],{"class":1296}," form_valid",[1050,4739,1300],{"class":1071},[1050,4741,4433],{"class":4432},[1050,4743,1089],{"class":1071},[1050,4745,4746],{"class":1303}," form",[1050,4748,1317],{"class":1071},[1050,4750,4752,4754,4757],{"class":1052,"line":4751},244,[1050,4753,1323],{"class":1263},[1050,4755,4756],{"class":1267},"Handle successful login with enhanced features",[1050,4758,1271],{"class":1263},[1050,4760,4762],{"class":1052,"line":4761},245,[1050,4763,1334],{"class":1067},[1050,4765,4767,4769,4771,4773,4775,4778],{"class":1052,"line":4766},246,[1050,4768,1346],{"class":1067},[1050,4770,1349],{"class":1071},[1050,4772,4746],{"class":1067},[1050,4774,1072],{"class":1071},[1050,4776,4777],{"class":1352},"get_user",[1050,4779,1509],{"class":1071},[1050,4781,4783,4786,4788,4792,4794,4796,4798,4801,4803,4805,4807,4809,4812,4814,4816,4818],{"class":1052,"line":4782},247,[1050,4784,4785],{"class":1067},"        remember_me ",[1050,4787,1349],{"class":1071},[1050,4789,4791],{"class":4790},"se3Ec"," self",[1050,4793,1072],{"class":1071},[1050,4795,1304],{"class":1425},[1050,4797,1072],{"class":1071},[1050,4799,4800],{"class":2526},"POST",[1050,4802,1072],{"class":1071},[1050,4804,2532],{"class":1352},[1050,4806,1300],{"class":1071},[1050,4808,1480],{"class":1479},[1050,4810,4811],{"class":1483},"remember_me",[1050,4813,1480],{"class":1479},[1050,4815,1089],{"class":1071},[1050,4817,1790],{"class":1402},[1050,4819,1378],{"class":1071},[1050,4821,4823],{"class":1052,"line":4822},248,[1050,4824,1334],{"class":1067},[1050,4826,4828],{"class":1052,"line":4827},249,[1050,4829,4830],{"class":1056},"        # Enhanced login process\n",[1050,4832,4834,4837,4839,4842,4844,4846,4848,4851],{"class":1052,"line":4833},250,[1050,4835,4836],{"class":1067},"        success",[1050,4838,1089],{"class":1071},[1050,4840,4841],{"class":1067}," message ",[1050,4843,1349],{"class":1071},[1050,4845,1254],{"class":1067},[1050,4847,1072],{"class":1071},[1050,4849,4850],{"class":1352},"enhanced_login_process",[1050,4852,3068],{"class":1071},[1050,4854,4856,4859,4861,4863,4865,4867,4869,4871,4873,4875,4877],{"class":1052,"line":4855},251,[1050,4857,4858],{"class":4790},"            self",[1050,4860,1072],{"class":1071},[1050,4862,1304],{"class":1425},[1050,4864,1089],{"class":1071},[1050,4866,1420],{"class":1352},[1050,4868,1072],{"class":1071},[1050,4870,1366],{"class":1425},[1050,4872,1089],{"class":1071},[1050,4874,1403],{"class":1402},[1050,4876,1089],{"class":1071},[1050,4878,4879],{"class":1352}," remember_me\n",[1050,4881,4883],{"class":1052,"line":4882},252,[1050,4884,3126],{"class":1071},[1050,4886,4888],{"class":1052,"line":4887},253,[1050,4889,1334],{"class":1067},[1050,4891,4893,4895,4897],{"class":1052,"line":4892},254,[1050,4894,1389],{"class":1063},[1050,4896,2230],{"class":1067},[1050,4898,1257],{"class":1071},[1050,4900,4902,4905,4907,4909,4911,4913,4915,4917,4919,4922],{"class":1052,"line":4901},255,[1050,4903,4904],{"class":1067},"            messages",[1050,4906,1072],{"class":1071},[1050,4908,4027],{"class":1352},[1050,4910,1300],{"class":1071},[1050,4912,4433],{"class":4790},[1050,4914,1072],{"class":1071},[1050,4916,1304],{"class":1425},[1050,4918,1089],{"class":1071},[1050,4920,4921],{"class":1352}," message",[1050,4923,1378],{"class":1071},[1050,4925,4927],{"class":1052,"line":4926},256,[1050,4928,4929],{"class":1067},"            \n",[1050,4931,4933],{"class":1052,"line":4932},257,[1050,4934,4935],{"class":1056},"            # Check if password needs updating\n",[1050,4937,4939,4941,4943,4945,4948,4950,4952],{"class":1052,"line":4938},258,[1050,4940,1417],{"class":1063},[1050,4942,4791],{"class":4790},[1050,4944,1072],{"class":1071},[1050,4946,4947],{"class":1352},"password_needs_update",[1050,4949,1300],{"class":1071},[1050,4951,1557],{"class":1352},[1050,4953,1317],{"class":1071},[1050,4955,4957,4960,4962,4964],{"class":1052,"line":4956},259,[1050,4958,4959],{"class":1067},"                messages",[1050,4961,1072],{"class":1071},[1050,4963,3065],{"class":1352},[1050,4965,3068],{"class":1071},[1050,4967,4969,4972,4974,4976],{"class":1052,"line":4968},260,[1050,4970,4971],{"class":4790},"                    self",[1050,4973,1072],{"class":1071},[1050,4975,1304],{"class":1425},[1050,4977,1615],{"class":1071},[1050,4979,4981,4984,4987],{"class":1052,"line":4980},261,[1050,4982,4983],{"class":1479},"                    \"",[1050,4985,4986],{"class":1483},"Your password is old. Consider updating it for better security.",[1050,4988,1774],{"class":1479},[1050,4990,4992],{"class":1052,"line":4991},262,[1050,4993,4994],{"class":1071},"                )\n",[1050,4996,4998],{"class":1052,"line":4997},263,[1050,4999,4929],{"class":1067},[1050,5001,5003],{"class":1052,"line":5002},264,[1050,5004,5005],{"class":1056},"            # Check for security alerts\n",[1050,5007,5009,5011,5013,5016,5018,5020],{"class":1052,"line":5008},265,[1050,5010,4858],{"class":4790},[1050,5012,1072],{"class":1071},[1050,5014,5015],{"class":1352},"check_security_alerts",[1050,5017,1300],{"class":1071},[1050,5019,1557],{"class":1352},[1050,5021,1378],{"class":1071},[1050,5023,5025],{"class":1052,"line":5024},266,[1050,5026,4929],{"class":1067},[1050,5028,5030,5032,5034,5036,5039,5041,5044],{"class":1052,"line":5029},267,[1050,5031,1813],{"class":1063},[1050,5033,4462],{"class":1286},[1050,5035,1503],{"class":1071},[1050,5037,5038],{"class":1352},"form_valid",[1050,5040,1300],{"class":1071},[1050,5042,5043],{"class":1352},"form",[1050,5045,1378],{"class":1071},[1050,5047,5049,5051],{"class":1052,"line":5048},268,[1050,5050,1805],{"class":1063},[1050,5052,1257],{"class":1071},[1050,5054,5056,5058,5060,5063,5065,5067,5069,5071,5073,5075],{"class":1052,"line":5055},269,[1050,5057,4904],{"class":1067},[1050,5059,1072],{"class":1071},[1050,5061,5062],{"class":1352},"error",[1050,5064,1300],{"class":1071},[1050,5066,4433],{"class":4790},[1050,5068,1072],{"class":1071},[1050,5070,1304],{"class":1425},[1050,5072,1089],{"class":1071},[1050,5074,4921],{"class":1352},[1050,5076,1378],{"class":1071},[1050,5078,5080,5082,5084,5086,5089,5091,5093],{"class":1052,"line":5079},270,[1050,5081,1813],{"class":1063},[1050,5083,4791],{"class":4790},[1050,5085,1072],{"class":1071},[1050,5087,5088],{"class":1352},"form_invalid",[1050,5090,1300],{"class":1071},[1050,5092,5043],{"class":1352},[1050,5094,1378],{"class":1071},[1050,5096,5098],{"class":1052,"line":5097},271,[1050,5099,1277],{"class":1067},[1050,5101,5103,5105,5108,5110,5112,5114,5116],{"class":1052,"line":5102},272,[1050,5104,1293],{"class":1249},[1050,5106,5107],{"class":1296}," password_needs_update",[1050,5109,1300],{"class":1071},[1050,5111,4433],{"class":4432},[1050,5113,1089],{"class":1071},[1050,5115,1420],{"class":1303},[1050,5117,1317],{"class":1071},[1050,5119,5121,5123,5126],{"class":1052,"line":5120},273,[1050,5122,1323],{"class":1263},[1050,5124,5125],{"class":1267},"Check if user's password needs updating",[1050,5127,1271],{"class":1263},[1050,5129,5131],{"class":1052,"line":5130},274,[1050,5132,1334],{"class":1067},[1050,5134,5136,5138,5140,5142,5144,5146,5148,5150,5152,5154,5157,5159,5161,5163,5165,5167,5169,5171,5174,5176],{"class":1052,"line":5135},275,[1050,5137,1389],{"class":1063},[1050,5139,1589],{"class":1551},[1050,5141,1300],{"class":1071},[1050,5143,1557],{"class":1352},[1050,5145,1089],{"class":1071},[1050,5147,1567],{"class":1479},[1050,5149,1562],{"class":1483},[1050,5151,1480],{"class":1479},[1050,5153,1583],{"class":1071},[1050,5155,5156],{"class":1395}," and",[1050,5158,1589],{"class":1551},[1050,5160,1300],{"class":1071},[1050,5162,1557],{"class":1352},[1050,5164,1072],{"class":1071},[1050,5166,1562],{"class":1425},[1050,5168,1089],{"class":1071},[1050,5170,1567],{"class":1479},[1050,5172,5173],{"class":1483},"password_changed_at",[1050,5175,1480],{"class":1479},[1050,5177,1317],{"class":1071},[1050,5179,5181,5184,5186,5188,5190,5192,5194,5197,5199,5201,5203,5205],{"class":1052,"line":5180},276,[1050,5182,5183],{"class":1067},"            password_age ",[1050,5185,1349],{"class":1071},[1050,5187,1495],{"class":1067},[1050,5189,1072],{"class":1071},[1050,5191,1500],{"class":1352},[1050,5193,2302],{"class":1071},[1050,5195,5196],{"class":1395}," -",[1050,5198,1420],{"class":1067},[1050,5200,1072],{"class":1071},[1050,5202,1562],{"class":1425},[1050,5204,1072],{"class":1071},[1050,5206,5207],{"class":1425},"password_changed_at\n",[1050,5209,5211,5213,5216,5218,5221,5224,5227],{"class":1052,"line":5210},277,[1050,5212,1813],{"class":1063},[1050,5214,5215],{"class":1067}," password_age",[1050,5217,1072],{"class":1071},[1050,5219,5220],{"class":1425},"days",[1050,5222,5223],{"class":1395}," >",[1050,5225,5226],{"class":2112}," 90",[1050,5228,5229],{"class":1056},"  # 90 days\n",[1050,5231,5233],{"class":1052,"line":5232},278,[1050,5234,1334],{"class":1067},[1050,5236,5238,5240],{"class":1052,"line":5237},279,[1050,5239,2705],{"class":1063},[1050,5241,2694],{"class":1402},[1050,5243,5245],{"class":1052,"line":5244},280,[1050,5246,1277],{"class":1067},[1050,5248,5250,5252,5255,5257,5259,5261,5263],{"class":1052,"line":5249},281,[1050,5251,1293],{"class":1249},[1050,5253,5254],{"class":1296}," check_security_alerts",[1050,5256,1300],{"class":1071},[1050,5258,4433],{"class":4432},[1050,5260,1089],{"class":1071},[1050,5262,1420],{"class":1303},[1050,5264,1317],{"class":1071},[1050,5266,5268,5270,5273],{"class":1052,"line":5267},282,[1050,5269,1323],{"class":1263},[1050,5271,5272],{"class":1267},"Check for security alerts to show user",[1050,5274,1271],{"class":1263},[1050,5276,5278],{"class":1052,"line":5277},283,[1050,5279,1334],{"class":1067},[1050,5281,5283,5286,5288],{"class":1052,"line":5282},284,[1050,5284,5285],{"class":1067},"        alerts ",[1050,5287,1349],{"class":1071},[1050,5289,5290],{"class":1071}," []\n",[1050,5292,5294],{"class":1052,"line":5293},285,[1050,5295,1334],{"class":1067},[1050,5297,5299],{"class":1052,"line":5298},286,[1050,5300,5301],{"class":1056},"        # Check for new login from different location\n",[1050,5303,5305,5308,5310,5312,5314,5316,5318,5320,5322,5324,5326,5328,5331,5333],{"class":1052,"line":5304},287,[1050,5306,5307],{"class":1067},"        last_ip ",[1050,5309,1349],{"class":1071},[1050,5311,4791],{"class":4790},[1050,5313,1072],{"class":1071},[1050,5315,1304],{"class":1425},[1050,5317,1072],{"class":1071},[1050,5319,1473],{"class":1425},[1050,5321,1072],{"class":1071},[1050,5323,2532],{"class":1352},[1050,5325,1300],{"class":1071},[1050,5327,1480],{"class":1479},[1050,5329,5330],{"class":1483},"last_login_ip",[1050,5332,1480],{"class":1479},[1050,5334,1378],{"class":1071},[1050,5336,5338,5341,5343,5345,5347,5349,5351,5353,5355,5357,5359,5361,5363,5365],{"class":1052,"line":5337},288,[1050,5339,5340],{"class":1067},"        current_ip ",[1050,5342,1349],{"class":1071},[1050,5344,4791],{"class":4790},[1050,5346,1072],{"class":1071},[1050,5348,1304],{"class":1425},[1050,5350,1072],{"class":1071},[1050,5352,2527],{"class":2526},[1050,5354,1072],{"class":1071},[1050,5356,2532],{"class":1352},[1050,5358,1300],{"class":1071},[1050,5360,1480],{"class":1479},[1050,5362,2539],{"class":1483},[1050,5364,1480],{"class":1479},[1050,5366,1378],{"class":1071},[1050,5368,5370],{"class":1052,"line":5369},289,[1050,5371,1334],{"class":1067},[1050,5373,5375,5377,5380,5383,5385,5388,5391],{"class":1052,"line":5374},290,[1050,5376,1389],{"class":1063},[1050,5378,5379],{"class":1067}," last_ip ",[1050,5381,5382],{"class":1395},"and",[1050,5384,5379],{"class":1067},[1050,5386,5387],{"class":1395},"!=",[1050,5389,5390],{"class":1067}," current_ip",[1050,5392,1257],{"class":1071},[1050,5394,5396,5399,5401,5404,5406,5408,5411,5413],{"class":1052,"line":5395},291,[1050,5397,5398],{"class":1067},"            alerts",[1050,5400,1072],{"class":1071},[1050,5402,5403],{"class":1352},"append",[1050,5405,1300],{"class":1071},[1050,5407,2359],{"class":1479},[1050,5409,5410],{"class":1483},"New login from a different location detected.",[1050,5412,2359],{"class":1479},[1050,5414,1378],{"class":1071},[1050,5416,5418],{"class":1052,"line":5417},292,[1050,5419,1334],{"class":1067},[1050,5421,5423],{"class":1052,"line":5422},293,[1050,5424,5425],{"class":1056},"        # Check for unusual login time\n",[1050,5427,5429,5432,5434,5436,5438,5440,5442],{"class":1052,"line":5428},294,[1050,5430,5431],{"class":1067},"        current_hour ",[1050,5433,1349],{"class":1071},[1050,5435,1495],{"class":1067},[1050,5437,1072],{"class":1071},[1050,5439,1500],{"class":1352},[1050,5441,1503],{"class":1071},[1050,5443,5444],{"class":1425},"hour\n",[1050,5446,5448,5450,5453,5456,5459,5461,5463,5466,5469,5471],{"class":1052,"line":5447},295,[1050,5449,1389],{"class":1063},[1050,5451,5452],{"class":1067}," current_hour ",[1050,5454,5455],{"class":1395},"\u003C",[1050,5457,5458],{"class":2112}," 6",[1050,5460,2305],{"class":1395},[1050,5462,5452],{"class":1067},[1050,5464,5465],{"class":1395},">",[1050,5467,5468],{"class":2112}," 22",[1050,5470,1548],{"class":1071},[1050,5472,5473],{"class":1056},"  # Outside normal hours\n",[1050,5475,5477,5479,5481,5483,5485,5487,5490,5492],{"class":1052,"line":5476},296,[1050,5478,5398],{"class":1067},[1050,5480,1072],{"class":1071},[1050,5482,5403],{"class":1352},[1050,5484,1300],{"class":1071},[1050,5486,2359],{"class":1479},[1050,5488,5489],{"class":1483},"Login outside normal hours detected.",[1050,5491,2359],{"class":1479},[1050,5493,1378],{"class":1071},[1050,5495,5497],{"class":1052,"line":5496},297,[1050,5498,1334],{"class":1067},[1050,5500,5502],{"class":1052,"line":5501},298,[1050,5503,5504],{"class":1056},"        # Show alerts\n",[1050,5506,5508,5511,5514,5517,5520],{"class":1052,"line":5507},299,[1050,5509,5510],{"class":1063},"        for",[1050,5512,5513],{"class":1067}," alert ",[1050,5515,5516],{"class":1063},"in",[1050,5518,5519],{"class":1067}," alerts",[1050,5521,1257],{"class":1071},[1050,5523,5525,5527,5529,5531,5533,5535,5537,5539,5541,5543,5546,5548,5551,5553,5555],{"class":1052,"line":5524},300,[1050,5526,4904],{"class":1067},[1050,5528,1072],{"class":1071},[1050,5530,4126],{"class":1352},[1050,5532,1300],{"class":1071},[1050,5534,4433],{"class":4790},[1050,5536,1072],{"class":1071},[1050,5538,1304],{"class":1425},[1050,5540,1089],{"class":1071},[1050,5542,2285],{"class":1249},[1050,5544,5545],{"class":1483},"\"Security Notice: ",[1050,5547,2292],{"class":2291},[1050,5549,5550],{"class":1352},"alert",[1050,5552,2314],{"class":2291},[1050,5554,2359],{"class":1483},[1050,5556,1378],{"class":1071},[1050,5558,5560],{"class":1052,"line":5559},301,[1050,5561,1334],{"class":1067},[1050,5563,5565],{"class":1052,"line":5564},302,[1050,5566,5567],{"class":1056},"        # Store current IP for next login\n",[1050,5569,5571,5574,5576,5578,5580,5582,5584,5586,5588,5590,5592,5594],{"class":1052,"line":5570},303,[1050,5572,5573],{"class":4790},"        self",[1050,5575,1072],{"class":1071},[1050,5577,1304],{"class":1425},[1050,5579,1072],{"class":1071},[1050,5581,1473],{"class":1425},[1050,5583,1476],{"class":1071},[1050,5585,1480],{"class":1479},[1050,5587,5330],{"class":1483},[1050,5589,1480],{"class":1479},[1050,5591,1489],{"class":1071},[1050,5593,1492],{"class":1071},[1050,5595,5596],{"class":1067}," current_ip\n",[1050,5598,5600],{"class":1052,"line":5599},304,[1050,5601,1243],{"emptyLinePlaceholder":1242},[1050,5603,5605],{"class":1052,"line":5604},305,[1050,5606,5607],{"class":1056},"# Multi-step login with 2FA\n",[1050,5609,5611,5613,5616,5618,5620],{"class":1052,"line":5610},306,[1050,5612,1250],{"class":1249},[1050,5614,5615],{"class":1253}," TwoFactorLoginView",[1050,5617,1300],{"class":1071},[1050,5619,4332],{"class":4331},[1050,5621,1317],{"class":1071},[1050,5623,5625,5627,5630],{"class":1052,"line":5624},307,[1050,5626,1264],{"class":1263},[1050,5628,5629],{"class":1267},"Login view with two-factor authentication",[1050,5631,1271],{"class":1263},[1050,5633,5635],{"class":1052,"line":5634},308,[1050,5636,1277],{"class":1067},[1050,5638,5640,5642,5644,5646,5649],{"class":1052,"line":5639},309,[1050,5641,4355],{"class":1067},[1050,5643,1349],{"class":1071},[1050,5645,1567],{"class":1479},[1050,5647,5648],{"class":1483},"auth/2fa_login.html",[1050,5650,4365],{"class":1479},[1050,5652,5654],{"class":1052,"line":5653},310,[1050,5655,1277],{"class":1067},[1050,5657,5659,5661,5663,5665,5667,5669,5671],{"class":1052,"line":5658},311,[1050,5660,1293],{"class":1249},[1050,5662,4737],{"class":1296},[1050,5664,1300],{"class":1071},[1050,5666,4433],{"class":4432},[1050,5668,1089],{"class":1071},[1050,5670,4746],{"class":1303},[1050,5672,1317],{"class":1071},[1050,5674,5676,5678,5681],{"class":1052,"line":5675},312,[1050,5677,1323],{"class":1263},[1050,5679,5680],{"class":1267},"Handle first step of 2FA login",[1050,5682,1271],{"class":1263},[1050,5684,5686],{"class":1052,"line":5685},313,[1050,5687,1334],{"class":1067},[1050,5689,5691,5693,5695,5697,5699,5701],{"class":1052,"line":5690},314,[1050,5692,1346],{"class":1067},[1050,5694,1349],{"class":1071},[1050,5696,4746],{"class":1067},[1050,5698,1072],{"class":1071},[1050,5700,4777],{"class":1352},[1050,5702,1509],{"class":1071},[1050,5704,5706],{"class":1052,"line":5705},315,[1050,5707,1334],{"class":1067},[1050,5709,5711],{"class":1052,"line":5710},316,[1050,5712,5713],{"class":1056},"        # Check if user has 2FA enabled\n",[1050,5715,5717,5719,5721,5723,5726,5728,5730],{"class":1052,"line":5716},317,[1050,5718,1389],{"class":1063},[1050,5720,4791],{"class":4790},[1050,5722,1072],{"class":1071},[1050,5724,5725],{"class":1352},"user_has_2fa_enabled",[1050,5727,1300],{"class":1071},[1050,5729,1557],{"class":1352},[1050,5731,1317],{"class":1071},[1050,5733,5735],{"class":1052,"line":5734},318,[1050,5736,5737],{"class":1056},"            # Store user temporarily in session\n",[1050,5739,5741,5743,5745,5747,5749,5751,5753,5755,5758,5760,5762,5764,5766,5768],{"class":1052,"line":5740},319,[1050,5742,4858],{"class":4790},[1050,5744,1072],{"class":1071},[1050,5746,1304],{"class":1425},[1050,5748,1072],{"class":1071},[1050,5750,1473],{"class":1425},[1050,5752,1476],{"class":1071},[1050,5754,1480],{"class":1479},[1050,5756,5757],{"class":1483},"2fa_user_id",[1050,5759,1480],{"class":1479},[1050,5761,1489],{"class":1071},[1050,5763,1492],{"class":1071},[1050,5765,1420],{"class":1067},[1050,5767,1072],{"class":1071},[1050,5769,5770],{"class":1425},"id\n",[1050,5772,5774,5776,5778,5780,5782,5784,5786,5788,5791,5793,5795,5797,5799,5801,5803,5805,5807],{"class":1052,"line":5773},320,[1050,5775,4858],{"class":4790},[1050,5777,1072],{"class":1071},[1050,5779,1304],{"class":1425},[1050,5781,1072],{"class":1071},[1050,5783,1473],{"class":1425},[1050,5785,1476],{"class":1071},[1050,5787,1480],{"class":1479},[1050,5789,5790],{"class":1483},"2fa_timestamp",[1050,5792,1480],{"class":1479},[1050,5794,1489],{"class":1071},[1050,5796,1492],{"class":1071},[1050,5798,1495],{"class":1067},[1050,5800,1072],{"class":1071},[1050,5802,1500],{"class":1352},[1050,5804,1503],{"class":1071},[1050,5806,1506],{"class":1352},[1050,5808,1509],{"class":1071},[1050,5810,5812],{"class":1052,"line":5811},321,[1050,5813,4929],{"class":1067},[1050,5815,5817],{"class":1052,"line":5816},322,[1050,5818,5819],{"class":1056},"            # Don't log in yet, redirect to 2FA verification\n",[1050,5821,5823,5825,5828,5830,5832,5835,5837],{"class":1052,"line":5822},323,[1050,5824,1813],{"class":1063},[1050,5826,5827],{"class":1352}," redirect",[1050,5829,1300],{"class":1071},[1050,5831,1480],{"class":1479},[1050,5833,5834],{"class":1483},"2fa_verify",[1050,5836,1480],{"class":1479},[1050,5838,1378],{"class":1071},[1050,5840,5842],{"class":1052,"line":5841},324,[1050,5843,1334],{"class":1067},[1050,5845,5847],{"class":1052,"line":5846},325,[1050,5848,5849],{"class":1056},"        # Normal login for users without 2FA\n",[1050,5851,5853,5855,5857,5859,5861,5863,5865],{"class":1052,"line":5852},326,[1050,5854,2705],{"class":1063},[1050,5856,4462],{"class":1286},[1050,5858,1503],{"class":1071},[1050,5860,5038],{"class":1352},[1050,5862,1300],{"class":1071},[1050,5864,5043],{"class":1352},[1050,5866,1378],{"class":1071},[1050,5868,5870],{"class":1052,"line":5869},327,[1050,5871,1277],{"class":1067},[1050,5873,5875,5877,5880,5882,5884,5886,5888],{"class":1052,"line":5874},328,[1050,5876,1293],{"class":1249},[1050,5878,5879],{"class":1296}," user_has_2fa_enabled",[1050,5881,1300],{"class":1071},[1050,5883,4433],{"class":4432},[1050,5885,1089],{"class":1071},[1050,5887,1420],{"class":1303},[1050,5889,1317],{"class":1071},[1050,5891,5893,5895,5898],{"class":1052,"line":5892},329,[1050,5894,1323],{"class":1263},[1050,5896,5897],{"class":1267},"Check if user has 2FA enabled",[1050,5899,1271],{"class":1263},[1050,5901,5903],{"class":1052,"line":5902},330,[1050,5904,1334],{"class":1067},[1050,5906,5908,5910,5913,5916,5918,5920,5922,5924,5926,5928,5930,5932],{"class":1052,"line":5907},331,[1050,5909,2705],{"class":1063},[1050,5911,5912],{"class":1071}," (",[1050,5914,5915],{"class":1551},"hasattr",[1050,5917,1300],{"class":1071},[1050,5919,1557],{"class":1352},[1050,5921,1089],{"class":1071},[1050,5923,1567],{"class":1479},[1050,5925,1562],{"class":1483},[1050,5927,1480],{"class":1479},[1050,5929,1583],{"class":1071},[1050,5931,5156],{"class":1395},[1050,5933,5934],{"class":1067}," \n",[1050,5936,5938,5941,5943,5945,5947,5949,5951,5953,5956,5958,5960,5962],{"class":1052,"line":5937},332,[1050,5939,5940],{"class":1551},"                getattr",[1050,5942,1300],{"class":1071},[1050,5944,1557],{"class":1352},[1050,5946,1072],{"class":1071},[1050,5948,1562],{"class":1425},[1050,5950,1089],{"class":1071},[1050,5952,1567],{"class":1479},[1050,5954,5955],{"class":1483},"two_factor_enabled",[1050,5957,1480],{"class":1479},[1050,5959,1089],{"class":1071},[1050,5961,1790],{"class":1402},[1050,5963,5964],{"class":1071},"))\n",[1050,5966,5968],{"class":1052,"line":5967},333,[1050,5969,1243],{"emptyLinePlaceholder":1242},[1050,5971,5973,5976,5979,5981,5983],{"class":1052,"line":5972},334,[1050,5974,5975],{"class":1249},"def",[1050,5977,5978],{"class":1296}," two_factor_verify_view",[1050,5980,1300],{"class":1071},[1050,5982,1304],{"class":1303},[1050,5984,1317],{"class":1071},[1050,5986,5988,5990,5993],{"class":1052,"line":5987},335,[1050,5989,1264],{"class":1263},[1050,5991,5992],{"class":1267},"Verify two-factor authentication code",[1050,5994,1271],{"class":1263},[1050,5996,5998],{"class":1052,"line":5997},336,[1050,5999,1277],{"class":1067},[1050,6001,6003],{"class":1052,"line":6002},337,[1050,6004,6005],{"class":1056},"    # Check if user is in 2FA flow\n",[1050,6007,6009,6012,6014,6016,6018,6020,6022,6024,6026,6028,6030,6032],{"class":1052,"line":6008},338,[1050,6010,6011],{"class":1067},"    user_id ",[1050,6013,1349],{"class":1071},[1050,6015,2521],{"class":1067},[1050,6017,1072],{"class":1071},[1050,6019,1473],{"class":1425},[1050,6021,1072],{"class":1071},[1050,6023,2532],{"class":1352},[1050,6025,1300],{"class":1071},[1050,6027,1480],{"class":1479},[1050,6029,5757],{"class":1483},[1050,6031,1480],{"class":1479},[1050,6033,1378],{"class":1071},[1050,6035,6037,6040,6042,6045],{"class":1052,"line":6036},339,[1050,6038,6039],{"class":1063},"    if",[1050,6041,1399],{"class":1395},[1050,6043,6044],{"class":1067}," user_id",[1050,6046,1257],{"class":1071},[1050,6048,6050,6053,6055,6057,6059,6061,6063,6065,6068,6070],{"class":1052,"line":6049},340,[1050,6051,6052],{"class":1067},"        messages",[1050,6054,1072],{"class":1071},[1050,6056,5062],{"class":1352},[1050,6058,1300],{"class":1071},[1050,6060,1304],{"class":1352},[1050,6062,1089],{"class":1071},[1050,6064,1567],{"class":1479},[1050,6066,6067],{"class":1483},"Invalid 2FA session. Please log in again.",[1050,6069,1480],{"class":1479},[1050,6071,1378],{"class":1071},[1050,6073,6075,6077,6079,6081,6083,6086,6088],{"class":1052,"line":6074},341,[1050,6076,2705],{"class":1063},[1050,6078,5827],{"class":1352},[1050,6080,1300],{"class":1071},[1050,6082,1480],{"class":1479},[1050,6084,6085],{"class":1483},"login",[1050,6087,1480],{"class":1479},[1050,6089,1378],{"class":1071},[1050,6091,6093],{"class":1052,"line":6092},342,[1050,6094,1277],{"class":1067},[1050,6096,6098],{"class":1052,"line":6097},343,[1050,6099,6100],{"class":1056},"    # Check session timeout (5 minutes)\n",[1050,6102,6104,6107,6109,6111,6113,6115,6117,6119,6121,6123,6125,6127],{"class":1052,"line":6103},344,[1050,6105,6106],{"class":1067},"    timestamp_str ",[1050,6108,1349],{"class":1071},[1050,6110,2521],{"class":1067},[1050,6112,1072],{"class":1071},[1050,6114,1473],{"class":1425},[1050,6116,1072],{"class":1071},[1050,6118,2532],{"class":1352},[1050,6120,1300],{"class":1071},[1050,6122,1480],{"class":1479},[1050,6124,5790],{"class":1483},[1050,6126,1480],{"class":1479},[1050,6128,1378],{"class":1071},[1050,6130,6132,6134,6137],{"class":1052,"line":6131},345,[1050,6133,6039],{"class":1063},[1050,6135,6136],{"class":1067}," timestamp_str",[1050,6138,1257],{"class":1071},[1050,6140,6142,6145,6147,6150,6152,6155,6157,6160,6162,6165,6167,6169,6172,6174,6176,6178,6181,6183],{"class":1052,"line":6141},346,[1050,6143,6144],{"class":1067},"        timestamp ",[1050,6146,1349],{"class":1071},[1050,6148,6149],{"class":1067}," datetime",[1050,6151,1072],{"class":1071},[1050,6153,6154],{"class":1352},"fromisoformat",[1050,6156,1300],{"class":1071},[1050,6158,6159],{"class":1352},"timestamp_str",[1050,6161,1072],{"class":1071},[1050,6163,6164],{"class":1352},"replace",[1050,6166,1300],{"class":1071},[1050,6168,1480],{"class":1479},[1050,6170,6171],{"class":1483},"Z",[1050,6173,1480],{"class":1479},[1050,6175,1089],{"class":1071},[1050,6177,1567],{"class":1479},[1050,6179,6180],{"class":1483},"+00:00",[1050,6182,1480],{"class":1479},[1050,6184,5964],{"class":1071},[1050,6186,6188,6190,6192,6194,6196,6198,6200,6203,6205,6208,6210,6213,6215,6218],{"class":1052,"line":6187},347,[1050,6189,1389],{"class":1063},[1050,6191,1495],{"class":1067},[1050,6193,1072],{"class":1071},[1050,6195,1500],{"class":1352},[1050,6197,2302],{"class":1071},[1050,6199,5196],{"class":1395},[1050,6201,6202],{"class":1067}," timestamp ",[1050,6204,5465],{"class":1395},[1050,6206,6207],{"class":1352}," timedelta",[1050,6209,1300],{"class":1071},[1050,6211,6212],{"class":1361},"minutes",[1050,6214,1349],{"class":1071},[1050,6216,6217],{"class":2112},"5",[1050,6219,1317],{"class":1071},[1050,6221,6223,6226,6228,6230,6232,6234,6236,6238,6240],{"class":1052,"line":6222},348,[1050,6224,6225],{"class":1063},"            del",[1050,6227,2521],{"class":1067},[1050,6229,1072],{"class":1071},[1050,6231,1473],{"class":1425},[1050,6233,1476],{"class":1071},[1050,6235,1480],{"class":1479},[1050,6237,5757],{"class":1483},[1050,6239,1480],{"class":1479},[1050,6241,6242],{"class":1071},"]\n",[1050,6244,6246,6248,6250,6252,6254,6256,6258,6260,6262],{"class":1052,"line":6245},349,[1050,6247,6225],{"class":1063},[1050,6249,2521],{"class":1067},[1050,6251,1072],{"class":1071},[1050,6253,1473],{"class":1425},[1050,6255,1476],{"class":1071},[1050,6257,1480],{"class":1479},[1050,6259,5790],{"class":1483},[1050,6261,1480],{"class":1479},[1050,6263,6242],{"class":1071},[1050,6265,6267,6269,6271,6273,6275,6277,6279,6281,6284,6286],{"class":1052,"line":6266},350,[1050,6268,4904],{"class":1067},[1050,6270,1072],{"class":1071},[1050,6272,5062],{"class":1352},[1050,6274,1300],{"class":1071},[1050,6276,1304],{"class":1352},[1050,6278,1089],{"class":1071},[1050,6280,1567],{"class":1479},[1050,6282,6283],{"class":1483},"2FA session expired. Please log in again.",[1050,6285,1480],{"class":1479},[1050,6287,1378],{"class":1071},[1050,6289,6291,6293,6295,6297,6299,6301,6303],{"class":1052,"line":6290},351,[1050,6292,1813],{"class":1063},[1050,6294,5827],{"class":1352},[1050,6296,1300],{"class":1071},[1050,6298,1480],{"class":1479},[1050,6300,6085],{"class":1483},[1050,6302,1480],{"class":1479},[1050,6304,1378],{"class":1071},[1050,6306,6308],{"class":1052,"line":6307},352,[1050,6309,1277],{"class":1067},[1050,6311,6313,6316],{"class":1052,"line":6312},353,[1050,6314,6315],{"class":1063},"    try",[1050,6317,1257],{"class":1071},[1050,6319,6321,6323,6325,6328,6330,6333,6335,6337,6339,6341,6343,6345],{"class":1052,"line":6320},354,[1050,6322,1346],{"class":1067},[1050,6324,1349],{"class":1071},[1050,6326,6327],{"class":1067}," User",[1050,6329,1072],{"class":1071},[1050,6331,6332],{"class":1425},"objects",[1050,6334,1072],{"class":1071},[1050,6336,2532],{"class":1352},[1050,6338,1300],{"class":1071},[1050,6340,3502],{"class":1361},[1050,6342,1349],{"class":1071},[1050,6344,3491],{"class":1352},[1050,6346,1378],{"class":1071},[1050,6348,6350,6353,6355,6357,6360],{"class":1052,"line":6349},355,[1050,6351,6352],{"class":1063},"    except",[1050,6354,6327],{"class":1067},[1050,6356,1072],{"class":1071},[1050,6358,6359],{"class":1425},"DoesNotExist",[1050,6361,1257],{"class":1071},[1050,6363,6365,6367,6369,6371,6373,6375,6377,6379,6382,6384],{"class":1052,"line":6364},356,[1050,6366,6052],{"class":1067},[1050,6368,1072],{"class":1071},[1050,6370,5062],{"class":1352},[1050,6372,1300],{"class":1071},[1050,6374,1304],{"class":1352},[1050,6376,1089],{"class":1071},[1050,6378,1567],{"class":1479},[1050,6380,6381],{"class":1483},"Invalid user. Please log in again.",[1050,6383,1480],{"class":1479},[1050,6385,1378],{"class":1071},[1050,6387,6389,6391,6393,6395,6397,6399,6401],{"class":1052,"line":6388},357,[1050,6390,2705],{"class":1063},[1050,6392,5827],{"class":1352},[1050,6394,1300],{"class":1071},[1050,6396,1480],{"class":1479},[1050,6398,6085],{"class":1483},[1050,6400,1480],{"class":1479},[1050,6402,1378],{"class":1071},[1050,6404,6406],{"class":1052,"line":6405},358,[1050,6407,1277],{"class":1067},[1050,6409,6411,6413,6415,6417,6420,6423,6425,6427,6429],{"class":1052,"line":6410},359,[1050,6412,6039],{"class":1063},[1050,6414,2521],{"class":1067},[1050,6416,1072],{"class":1071},[1050,6418,6419],{"class":1425},"method",[1050,6421,6422],{"class":1395}," ==",[1050,6424,1567],{"class":1479},[1050,6426,4800],{"class":1483},[1050,6428,1480],{"class":1479},[1050,6430,1257],{"class":1071},[1050,6432,6434,6437,6439,6441,6443,6445,6447,6449,6451,6453,6456,6458,6460,6462,6464,6467],{"class":1052,"line":6433},360,[1050,6435,6436],{"class":1067},"        token ",[1050,6438,1349],{"class":1071},[1050,6440,2521],{"class":1067},[1050,6442,1072],{"class":1071},[1050,6444,4800],{"class":2526},[1050,6446,1072],{"class":1071},[1050,6448,2532],{"class":1352},[1050,6450,1300],{"class":1071},[1050,6452,1480],{"class":1479},[1050,6454,6455],{"class":1483},"token",[1050,6457,1480],{"class":1479},[1050,6459,1089],{"class":1071},[1050,6461,2845],{"class":1479},[1050,6463,3467],{"class":1071},[1050,6465,6466],{"class":1352},"strip",[1050,6468,1509],{"class":1071},[1050,6470,6472],{"class":1052,"line":6471},361,[1050,6473,1334],{"class":1067},[1050,6475,6477,6479,6482,6484,6486,6488,6490,6492,6494,6497,6499,6502],{"class":1052,"line":6476},362,[1050,6478,1389],{"class":1063},[1050,6480,6481],{"class":1551}," len",[1050,6483,1300],{"class":1071},[1050,6485,6455],{"class":1352},[1050,6487,1583],{"class":1071},[1050,6489,6422],{"class":1395},[1050,6491,5458],{"class":2112},[1050,6493,5156],{"class":1395},[1050,6495,6496],{"class":1067}," token",[1050,6498,1072],{"class":1071},[1050,6500,6501],{"class":1352},"isdigit",[1050,6503,6504],{"class":1071},"():\n",[1050,6506,6508],{"class":1052,"line":6507},363,[1050,6509,6510],{"class":1056},"            # Verify TOTP token\n",[1050,6512,6514,6516,6519,6521,6523,6525,6527],{"class":1052,"line":6513},364,[1050,6515,1417],{"class":1063},[1050,6517,6518],{"class":1352}," verify_totp_token",[1050,6520,1300],{"class":1071},[1050,6522,1557],{"class":1352},[1050,6524,1089],{"class":1071},[1050,6526,6496],{"class":1352},[1050,6528,1317],{"class":1071},[1050,6530,6532],{"class":1052,"line":6531},365,[1050,6533,6534],{"class":1056},"                # Complete login\n",[1050,6536,6538,6540,6542,6544,6546,6548],{"class":1052,"line":6537},366,[1050,6539,1440],{"class":1352},[1050,6541,1300],{"class":1071},[1050,6543,1304],{"class":1352},[1050,6545,1089],{"class":1071},[1050,6547,1420],{"class":1352},[1050,6549,1378],{"class":1071},[1050,6551,6553],{"class":1052,"line":6552},367,[1050,6554,1456],{"class":1067},[1050,6556,6558],{"class":1052,"line":6557},368,[1050,6559,6560],{"class":1056},"                # Clean up 2FA session data\n",[1050,6562,6564,6567,6569,6571,6573,6575,6577,6579,6581],{"class":1052,"line":6563},369,[1050,6565,6566],{"class":1063},"                del",[1050,6568,2521],{"class":1067},[1050,6570,1072],{"class":1071},[1050,6572,1473],{"class":1425},[1050,6574,1476],{"class":1071},[1050,6576,1480],{"class":1479},[1050,6578,5757],{"class":1483},[1050,6580,1480],{"class":1479},[1050,6582,6242],{"class":1071},[1050,6584,6586,6588,6590,6592,6594,6596,6598,6600,6602],{"class":1052,"line":6585},370,[1050,6587,6566],{"class":1063},[1050,6589,2521],{"class":1067},[1050,6591,1072],{"class":1071},[1050,6593,1473],{"class":1425},[1050,6595,1476],{"class":1071},[1050,6597,1480],{"class":1479},[1050,6599,5790],{"class":1483},[1050,6601,1480],{"class":1479},[1050,6603,6242],{"class":1071},[1050,6605,6607],{"class":1052,"line":6606},371,[1050,6608,1456],{"class":1067},[1050,6610,6612],{"class":1052,"line":6611},372,[1050,6613,6614],{"class":1056},"                # Set enhanced session data\n",[1050,6616,6618,6620,6622,6624,6626,6628,6630,6632],{"class":1052,"line":6617},373,[1050,6619,2181],{"class":1067},[1050,6621,1072],{"class":1071},[1050,6623,2186],{"class":1352},[1050,6625,1300],{"class":1071},[1050,6627,1304],{"class":1352},[1050,6629,1089],{"class":1071},[1050,6631,1420],{"class":1352},[1050,6633,1378],{"class":1071},[1050,6635,6637],{"class":1052,"line":6636},374,[1050,6638,1456],{"class":1067},[1050,6640,6642,6644,6646,6648,6650,6652,6654,6656,6659,6661],{"class":1052,"line":6641},375,[1050,6643,4959],{"class":1067},[1050,6645,1072],{"class":1071},[1050,6647,4027],{"class":1352},[1050,6649,1300],{"class":1071},[1050,6651,1304],{"class":1352},[1050,6653,1089],{"class":1071},[1050,6655,1567],{"class":1479},[1050,6657,6658],{"class":1483},"Login successful!",[1050,6660,1480],{"class":1479},[1050,6662,1378],{"class":1071},[1050,6664,6666,6668,6670,6672,6674,6677,6679],{"class":1052,"line":6665},376,[1050,6667,1760],{"class":1063},[1050,6669,5827],{"class":1352},[1050,6671,1300],{"class":1071},[1050,6673,1480],{"class":1479},[1050,6675,6676],{"class":1483},"dashboard",[1050,6678,1480],{"class":1479},[1050,6680,1378],{"class":1071},[1050,6682,6684,6686],{"class":1052,"line":6683},377,[1050,6685,1780],{"class":1063},[1050,6687,1257],{"class":1071},[1050,6689,6691,6693,6695,6697,6699,6701,6703,6705,6708,6710],{"class":1052,"line":6690},378,[1050,6692,4959],{"class":1067},[1050,6694,1072],{"class":1071},[1050,6696,5062],{"class":1352},[1050,6698,1300],{"class":1071},[1050,6700,1304],{"class":1352},[1050,6702,1089],{"class":1071},[1050,6704,1567],{"class":1479},[1050,6706,6707],{"class":1483},"Invalid verification code. Please try again.",[1050,6709,1480],{"class":1479},[1050,6711,1378],{"class":1071},[1050,6713,6715,6717],{"class":1052,"line":6714},379,[1050,6716,1805],{"class":1063},[1050,6718,1257],{"class":1071},[1050,6720,6722,6724,6726,6728,6730,6732,6734,6736,6739,6741],{"class":1052,"line":6721},380,[1050,6723,4904],{"class":1067},[1050,6725,1072],{"class":1071},[1050,6727,5062],{"class":1352},[1050,6729,1300],{"class":1071},[1050,6731,1304],{"class":1352},[1050,6733,1089],{"class":1071},[1050,6735,1567],{"class":1479},[1050,6737,6738],{"class":1483},"Please enter a valid 6-digit code.",[1050,6740,1480],{"class":1479},[1050,6742,1378],{"class":1071},[1050,6744,6746],{"class":1052,"line":6745},381,[1050,6747,1277],{"class":1067},[1050,6749,6751,6754,6756,6758,6760,6762,6764,6767,6769,6771,6774,6776,6778,6780,6782,6784],{"class":1052,"line":6750},382,[1050,6752,6753],{"class":1063},"    return",[1050,6755,1140],{"class":1352},[1050,6757,1300],{"class":1071},[1050,6759,1304],{"class":1352},[1050,6761,1089],{"class":1071},[1050,6763,1567],{"class":1479},[1050,6765,6766],{"class":1483},"auth/2fa_verify.html",[1050,6768,1480],{"class":1479},[1050,6770,1089],{"class":1071},[1050,6772,6773],{"class":1071}," {",[1050,6775,1480],{"class":1479},[1050,6777,1557],{"class":1483},[1050,6779,1480],{"class":1479},[1050,6781,1548],{"class":1071},[1050,6783,1420],{"class":1352},[1050,6785,6786],{"class":1071},"})\n",[1050,6788,6790],{"class":1052,"line":6789},383,[1050,6791,1243],{"emptyLinePlaceholder":1242},[1050,6793,6795,6797,6799,6801,6803,6805,6807],{"class":1052,"line":6794},384,[1050,6796,5975],{"class":1249},[1050,6798,6518],{"class":1296},[1050,6800,1300],{"class":1071},[1050,6802,1557],{"class":1303},[1050,6804,1089],{"class":1071},[1050,6806,6496],{"class":1303},[1050,6808,1317],{"class":1071},[1050,6810,6812,6814,6817],{"class":1052,"line":6811},385,[1050,6813,1264],{"class":1263},[1050,6815,6816],{"class":1267},"Verify TOTP token for user",[1050,6818,1271],{"class":1263},[1050,6820,6822],{"class":1052,"line":6821},386,[1050,6823,1277],{"class":1067},[1050,6825,6827,6829,6831,6833,6835,6837,6839,6841,6843,6845,6847,6849,6851,6853,6855,6857,6859,6862],{"class":1052,"line":6826},387,[1050,6828,6039],{"class":1063},[1050,6830,1399],{"class":1395},[1050,6832,1589],{"class":1551},[1050,6834,1300],{"class":1071},[1050,6836,1557],{"class":1352},[1050,6838,1089],{"class":1071},[1050,6840,1567],{"class":1479},[1050,6842,1562],{"class":1483},[1050,6844,1480],{"class":1479},[1050,6846,1583],{"class":1071},[1050,6848,2305],{"class":1395},[1050,6850,1399],{"class":1395},[1050,6852,1420],{"class":1067},[1050,6854,1072],{"class":1071},[1050,6856,1562],{"class":1425},[1050,6858,1072],{"class":1071},[1050,6860,6861],{"class":1425},"totp_secret",[1050,6863,1257],{"class":1071},[1050,6865,6867,6869],{"class":1052,"line":6866},388,[1050,6868,2705],{"class":1063},[1050,6870,2694],{"class":1402},[1050,6872,6874],{"class":1052,"line":6873},389,[1050,6875,1277],{"class":1067},[1050,6877,6879,6881],{"class":1052,"line":6878},390,[1050,6880,6315],{"class":1063},[1050,6882,1257],{"class":1071},[1050,6884,6886,6888],{"class":1052,"line":6885},391,[1050,6887,2778],{"class":1063},[1050,6889,6890],{"class":1067}," pyotp\n",[1050,6892,6894,6897,6899,6902,6904,6907,6909,6911,6913,6915,6917,6919],{"class":1052,"line":6893},392,[1050,6895,6896],{"class":1067},"        totp ",[1050,6898,1349],{"class":1071},[1050,6900,6901],{"class":1067}," pyotp",[1050,6903,1072],{"class":1071},[1050,6905,6906],{"class":1352},"TOTP",[1050,6908,1300],{"class":1071},[1050,6910,1557],{"class":1352},[1050,6912,1072],{"class":1071},[1050,6914,1562],{"class":1425},[1050,6916,1072],{"class":1071},[1050,6918,6861],{"class":1425},[1050,6920,1378],{"class":1071},[1050,6922,6924,6926,6929,6931,6934,6936,6938,6940,6943,6945,6948],{"class":1052,"line":6923},393,[1050,6925,2705],{"class":1063},[1050,6927,6928],{"class":1067}," totp",[1050,6930,1072],{"class":1071},[1050,6932,6933],{"class":1352},"verify",[1050,6935,1300],{"class":1071},[1050,6937,6455],{"class":1352},[1050,6939,1089],{"class":1071},[1050,6941,6942],{"class":1361}," valid_window",[1050,6944,1349],{"class":1071},[1050,6946,6947],{"class":2112},"1",[1050,6949,1378],{"class":1071},[1050,6951,6953,6955,6958],{"class":1052,"line":6952},394,[1050,6954,6352],{"class":1063},[1050,6956,6957],{"class":1286}," ImportError",[1050,6959,1257],{"class":1071},[1050,6961,6963,6965],{"class":1052,"line":6962},395,[1050,6964,2705],{"class":1063},[1050,6966,2694],{"class":1402},[1030,6968,6970],{"id":6969},"logout-implementation","Logout Implementation",[1035,6972,6974],{"id":6973},"secure-logout-process","Secure Logout Process",[1040,6976,6978],{"className":1042,"code":6977,"language":1044,"meta":1045,"style":1045},"# Comprehensive logout implementation\nclass LogoutManager:\n    \"\"\"Manage the complete logout process\"\"\"\n    \n    @staticmethod\n    def basic_logout_process(request):\n        \"\"\"Basic logout process\"\"\"\n        \n        if request.user.is_authenticated:\n            username = request.user.username\n            \n            # Log the logout\n            import logging\n            logger = logging.getLogger('auth')\n            logger.info(f\"User {username} logged out\")\n            \n            # Perform logout\n            logout(request)\n            \n            return True, f\"Goodbye, {username}!\"\n        \n        return False, \"No user was logged in.\"\n    \n    @staticmethod\n    def enhanced_logout_process(request):\n        \"\"\"Enhanced logout with security cleanup\"\"\"\n        \n        if not request.user.is_authenticated:\n            return False, \"No user was logged in.\"\n        \n        user = request.user\n        username = user.username\n        \n        # Log logout with details\n        LogoutManager.log_logout_attempt(request, user)\n        \n        # Clear sensitive session data\n        LogoutManager.clear_sensitive_session_data(request)\n        \n        # Invalidate remember me tokens if any\n        LogoutManager.invalidate_remember_tokens(user)\n        \n        # Perform logout\n        logout(request)\n        \n        # Clear any cached user data\n        LogoutManager.clear_user_cache(user)\n        \n        return True, f\"You have been securely logged out, {username}.\"\n    \n    @staticmethod\n    def log_logout_attempt(request, user):\n        \"\"\"Log logout attempt for audit purposes\"\"\"\n        \n        import logging\n        \n        logger = logging.getLogger('auth_audit')\n        \n        log_data = {\n            'username': user.username,\n            'user_id': user.id,\n            'ip_address': request.META.get('REMOTE_ADDR'),\n            'user_agent': request.META.get('HTTP_USER_AGENT', '')[:200],\n            'session_key': request.session.session_key,\n            'timestamp': timezone.now().isoformat(),\n        }\n        \n        logger.info(f\"User logout: {log_data}\")\n    \n    @staticmethod\n    def clear_sensitive_session_data(request):\n        \"\"\"Clear sensitive data from session\"\"\"\n        \n        # List of sensitive session keys to clear\n        sensitive_keys = [\n            'user_preferences',\n            'shopping_cart',\n            'temp_data',\n            'form_data',\n            'search_history',\n            'last_viewed_items',\n        ]\n        \n        for key in sensitive_keys:\n            request.session.pop(key, None)\n        \n        # Clear any keys that might contain sensitive data\n        keys_to_remove = []\n        for key in request.session.keys():\n            if any(sensitive in key.lower() for sensitive in ['password', 'token', 'secret']):\n                keys_to_remove.append(key)\n        \n        for key in keys_to_remove:\n            del request.session[key]\n    \n    @staticmethod\n    def invalidate_remember_tokens(user):\n        \"\"\"Invalidate any remember me tokens\"\"\"\n        \n        # This would depend on your remember me implementation\n        # Example with a custom token model:\n        \n        try:\n            from myapp.models import RememberToken\n            RememberToken.objects.filter(user=user).delete()\n        except ImportError:\n            pass\n    \n    @staticmethod\n    def clear_user_cache(user):\n        \"\"\"Clear cached user data\"\"\"\n        \n        from django.core.cache import cache\n        \n        # Clear permission cache\n        cache.delete(f'user_permissions_{user.id}')\n        \n        # Clear profile cache\n        cache.delete(f'user_profile_{user.id}')\n        \n        # Clear any other user-specific cache\n        cache_keys = [\n            f'user_settings_{user.id}',\n            f'user_notifications_{user.id}',\n            f'user_dashboard_{user.id}',\n        ]\n        \n        cache.delete_many(cache_keys)\n\nclass EnhancedLogoutView(LogoutView):\n    \"\"\"Enhanced logout view with security features\"\"\"\n    \n    template_name = 'auth/logout.html'\n    \n    def dispatch(self, request, *args, **kwargs):\n        \"\"\"Handle logout with enhanced security\"\"\"\n        \n        if request.user.is_authenticated:\n            # Enhanced logout process\n            success, message = LogoutManager.enhanced_logout_process(request)\n            \n            if success:\n                messages.success(request, message)\n            else:\n                messages.info(request, message)\n        \n        return super().dispatch(request, *args, **kwargs)\n    \n    def get_context_data(self, **kwargs):\n        \"\"\"Add logout context\"\"\"\n        \n        context = super().get_context_data(**kwargs)\n        \n        context.update({\n            'logout_message': 'You have been securely logged out.',\n            'security_tips': [\n                'Close your browser if using a shared computer',\n                'Clear your browser cache if on a public computer',\n                'Consider changing your password if you suspect unauthorized access'\n            ],\n            'next_steps': [\n                ('Login again', 'login'),\n                ('Go to homepage', 'home'),\n                ('Contact support', 'support'),\n            ]\n        })\n        \n        return context\n\n# AJAX logout support\nclass AjaxLogoutView(View):\n    \"\"\"AJAX-enabled logout view\"\"\"\n    \n    def post(self, request, *args, **kwargs):\n        \"\"\"Handle AJAX logout request\"\"\"\n        \n        if request.headers.get('X-Requested-With') == 'XMLHttpRequest':\n            if request.user.is_authenticated:\n                username = request.user.username\n                \n                # Enhanced logout\n                success, message = LogoutManager.enhanced_logout_process(request)\n                \n                return JsonResponse({\n                    'success': success,\n                    'message': message,\n                    'redirect_url': reverse('home')\n                })\n            else:\n                return JsonResponse({\n                    'success': False,\n                    'message': 'No user was logged in.'\n                })\n        \n        # Fallback to regular logout\n        return redirect('logout')\n\n# Global logout (terminate all sessions)\nclass GlobalLogoutView(LoginRequiredMixin, View):\n    \"\"\"Logout from all devices/sessions\"\"\"\n    \n    def post(self, request, *args, **kwargs):\n        \"\"\"Terminate all user sessions\"\"\"\n        \n        user = request.user\n        current_session_key = request.session.session_key\n        \n        # Get all user sessions\n        from django.contrib.sessions.models import Session\n        \n        terminated_sessions = 0\n        \n        for session in Session.objects.filter(expire_date__gt=timezone.now()):\n            try:\n                session_data = session.get_decoded()\n                session_user_id = session_data.get('_auth_user_id')\n                \n                if session_user_id and int(session_user_id) == user.id:\n                    # Don't terminate current session yet\n                    if session.session_key != current_session_key:\n                        session.delete()\n                        terminated_sessions += 1\n            except:\n                continue\n        \n        # Log global logout\n        import logging\n        logger = logging.getLogger('security')\n        logger.info(\n            f\"Global logout performed by user {user.username}. \"\n            f\"Terminated {terminated_sessions} sessions.\"\n        )\n        \n        # Now logout current session\n        LogoutManager.enhanced_logout_process(request)\n        \n        messages.success(\n            request,\n            f'You have been logged out from all devices. '\n            f'{terminated_sessions} other sessions were terminated.'\n        )\n        \n        return redirect('home')\n",[1047,6979,6980,6985,6994,7003,7007,7013,7026,7035,7039,7056,7074,7078,7083,7090,7113,7139,7143,7148,7159,7163,7184,7188,7203,7207,7213,7226,7235,7239,7257,7271,7275,7288,7301,7305,7310,7330,7334,7339,7354,7358,7363,7378,7382,7387,7398,7402,7407,7422,7426,7448,7452,7458,7475,7484,7488,7494,7498,7520,7524,7532,7550,7568,7598,7636,7659,7681,7685,7689,7714,7718,7724,7737,7746,7750,7755,7764,7774,7785,7796,7807,7818,7829,7834,7838,7852,7876,7880,7885,7894,7915,7976,7991,7995,8008,8024,8028,8034,8047,8056,8060,8065,8070,8074,8081,8099,8127,8136,8141,8145,8151,8164,8173,8177,8195,8199,8204,8233,8237,8242,8271,8275,8280,8289,8310,8331,8352,8356,8360,8376,8380,8394,8403,8407,8420,8424,8452,8461,8465,8481,8486,8510,8514,8522,8540,8546,8564,8568,8596,8600,8618,8627,8631,8651,8655,8665,8685,8698,8709,8720,8729,8733,8746,8768,8790,8812,8817,8821,8825,8831,8835,8840,8854,8863,8867,8896,8905,8909,8946,8962,8979,8983,8988,9011,9015,9024,9038,9053,9077,9082,9088,9096,9110,9126,9130,9134,9139,9156,9160,9165,9184,9193,9197,9225,9234,9238,9250,9268,9272,9277,9301,9305,9315,9319,9355,9362,9379,9404,9408,9437,9442,9461,9472,9482,9489,9494,9498,9503,9509,9531,9541,9561,9578,9582,9586,9591,9605,9609,9619,9625,9632,9647,9651,9655],{"__ignoreMap":1045},[1050,6981,6982],{"class":1052,"line":1053},[1050,6983,6984],{"class":1056},"# Comprehensive logout implementation\n",[1050,6986,6987,6989,6992],{"class":1052,"line":1060},[1050,6988,1250],{"class":1249},[1050,6990,6991],{"class":1253}," LogoutManager",[1050,6993,1257],{"class":1071},[1050,6995,6996,6998,7001],{"class":1052,"line":1100},[1050,6997,1264],{"class":1263},[1050,6999,7000],{"class":1267},"Manage the complete logout process",[1050,7002,1271],{"class":1263},[1050,7004,7005],{"class":1052,"line":1126},[1050,7006,1277],{"class":1067},[1050,7008,7009,7011],{"class":1052,"line":1148},[1050,7010,1283],{"class":1071},[1050,7012,1287],{"class":1286},[1050,7014,7015,7017,7020,7022,7024],{"class":1052,"line":1165},[1050,7016,1293],{"class":1249},[1050,7018,7019],{"class":1296}," basic_logout_process",[1050,7021,1300],{"class":1071},[1050,7023,1304],{"class":1303},[1050,7025,1317],{"class":1071},[1050,7027,7028,7030,7033],{"class":1052,"line":1192},[1050,7029,1323],{"class":1263},[1050,7031,7032],{"class":1267},"Basic logout process",[1050,7034,1271],{"class":1263},[1050,7036,7037],{"class":1052,"line":1217},[1050,7038,1334],{"class":1067},[1050,7040,7041,7043,7045,7047,7049,7051,7054],{"class":1052,"line":1239},[1050,7042,1389],{"class":1063},[1050,7044,2521],{"class":1067},[1050,7046,1072],{"class":1071},[1050,7048,1557],{"class":1425},[1050,7050,1072],{"class":1071},[1050,7052,7053],{"class":1425},"is_authenticated",[1050,7055,1257],{"class":1071},[1050,7057,7058,7061,7063,7065,7067,7069,7071],{"class":1052,"line":1246},[1050,7059,7060],{"class":1067},"            username ",[1050,7062,1349],{"class":1071},[1050,7064,2521],{"class":1067},[1050,7066,1072],{"class":1071},[1050,7068,1557],{"class":1425},[1050,7070,1072],{"class":1071},[1050,7072,7073],{"class":1425},"username\n",[1050,7075,7076],{"class":1052,"line":1260},[1050,7077,4929],{"class":1067},[1050,7079,7080],{"class":1052,"line":1274},[1050,7081,7082],{"class":1056},"            # Log the logout\n",[1050,7084,7085,7088],{"class":1052,"line":1280},[1050,7086,7087],{"class":1063},"            import",[1050,7089,2781],{"class":1067},[1050,7091,7092,7095,7097,7099,7101,7103,7105,7107,7109,7111],{"class":1052,"line":1290},[1050,7093,7094],{"class":1067},"            logger ",[1050,7096,1349],{"class":1071},[1050,7098,3038],{"class":1067},[1050,7100,1072],{"class":1071},[1050,7102,3043],{"class":1352},[1050,7104,1300],{"class":1071},[1050,7106,1480],{"class":1479},[1050,7108,1113],{"class":1483},[1050,7110,1480],{"class":1479},[1050,7112,1378],{"class":1071},[1050,7114,7115,7117,7119,7121,7123,7125,7128,7130,7132,7134,7137],{"class":1052,"line":1320},[1050,7116,4121],{"class":1067},[1050,7118,1072],{"class":1071},[1050,7120,4126],{"class":1352},[1050,7122,1300],{"class":1071},[1050,7124,4131],{"class":1249},[1050,7126,7127],{"class":1483},"\"User ",[1050,7129,2292],{"class":2291},[1050,7131,1366],{"class":1352},[1050,7133,2314],{"class":2291},[1050,7135,7136],{"class":1483}," logged out\"",[1050,7138,1378],{"class":1071},[1050,7140,7141],{"class":1052,"line":1331},[1050,7142,4929],{"class":1067},[1050,7144,7145],{"class":1052,"line":1337},[1050,7146,7147],{"class":1056},"            # Perform logout\n",[1050,7149,7150,7153,7155,7157],{"class":1052,"line":1343},[1050,7151,7152],{"class":1352},"            logout",[1050,7154,1300],{"class":1071},[1050,7156,1304],{"class":1352},[1050,7158,1378],{"class":1071},[1050,7160,7161],{"class":1052,"line":1381},[1050,7162,4929],{"class":1067},[1050,7164,7165,7167,7169,7171,7173,7176,7178,7180,7182],{"class":1052,"line":1386},[1050,7166,1813],{"class":1063},[1050,7168,1763],{"class":1402},[1050,7170,1089],{"class":1071},[1050,7172,2285],{"class":1249},[1050,7174,7175],{"class":1483},"\"Goodbye, ",[1050,7177,2292],{"class":2291},[1050,7179,1366],{"class":1067},[1050,7181,2314],{"class":2291},[1050,7183,2317],{"class":1483},[1050,7185,7186],{"class":1052,"line":1408},[1050,7187,1334],{"class":1067},[1050,7189,7190,7192,7194,7196,7198,7201],{"class":1052,"line":1414},[1050,7191,2705],{"class":1063},[1050,7193,1790],{"class":1402},[1050,7195,1089],{"class":1071},[1050,7197,1768],{"class":1479},[1050,7199,7200],{"class":1483},"No user was logged in.",[1050,7202,1774],{"class":1479},[1050,7204,7205],{"class":1052,"line":1431},[1050,7206,1277],{"class":1067},[1050,7208,7209,7211],{"class":1052,"line":1437},[1050,7210,1283],{"class":1071},[1050,7212,1287],{"class":1286},[1050,7214,7215,7217,7220,7222,7224],{"class":1052,"line":1453},[1050,7216,1293],{"class":1249},[1050,7218,7219],{"class":1296}," enhanced_logout_process",[1050,7221,1300],{"class":1071},[1050,7223,1304],{"class":1303},[1050,7225,1317],{"class":1071},[1050,7227,7228,7230,7233],{"class":1052,"line":1459},[1050,7229,1323],{"class":1263},[1050,7231,7232],{"class":1267},"Enhanced logout with security cleanup",[1050,7234,1271],{"class":1263},[1050,7236,7237],{"class":1052,"line":1465},[1050,7238,1334],{"class":1067},[1050,7240,7241,7243,7245,7247,7249,7251,7253,7255],{"class":1052,"line":1512},[1050,7242,1389],{"class":1063},[1050,7244,1399],{"class":1395},[1050,7246,2521],{"class":1067},[1050,7248,1072],{"class":1071},[1050,7250,1557],{"class":1425},[1050,7252,1072],{"class":1071},[1050,7254,7053],{"class":1425},[1050,7256,1257],{"class":1071},[1050,7258,7259,7261,7263,7265,7267,7269],{"class":1052,"line":1537},[1050,7260,1813],{"class":1063},[1050,7262,1790],{"class":1402},[1050,7264,1089],{"class":1071},[1050,7266,1768],{"class":1479},[1050,7268,7200],{"class":1483},[1050,7270,1774],{"class":1479},[1050,7272,7273],{"class":1052,"line":1618},[1050,7274,1334],{"class":1067},[1050,7276,7277,7279,7281,7283,7285],{"class":1052,"line":1687},[1050,7278,1346],{"class":1067},[1050,7280,1349],{"class":1071},[1050,7282,2521],{"class":1067},[1050,7284,1072],{"class":1071},[1050,7286,7287],{"class":1425},"user\n",[1050,7289,7290,7293,7295,7297,7299],{"class":1052,"line":1693},[1050,7291,7292],{"class":1067},"        username ",[1050,7294,1349],{"class":1071},[1050,7296,1420],{"class":1067},[1050,7298,1072],{"class":1071},[1050,7300,7073],{"class":1425},[1050,7302,7303],{"class":1052,"line":1698},[1050,7304,1334],{"class":1067},[1050,7306,7307],{"class":1052,"line":1704},[1050,7308,7309],{"class":1056},"        # Log logout with details\n",[1050,7311,7312,7315,7317,7320,7322,7324,7326,7328],{"class":1052,"line":1725},[1050,7313,7314],{"class":1067},"        LogoutManager",[1050,7316,1072],{"class":1071},[1050,7318,7319],{"class":1352},"log_logout_attempt",[1050,7321,1300],{"class":1071},[1050,7323,1304],{"class":1352},[1050,7325,1089],{"class":1071},[1050,7327,1420],{"class":1352},[1050,7329,1378],{"class":1071},[1050,7331,7332],{"class":1052,"line":1752},[1050,7333,1334],{"class":1067},[1050,7335,7336],{"class":1052,"line":1757},[1050,7337,7338],{"class":1056},"        # Clear sensitive session data\n",[1050,7340,7341,7343,7345,7348,7350,7352],{"class":1052,"line":1777},[1050,7342,7314],{"class":1067},[1050,7344,1072],{"class":1071},[1050,7346,7347],{"class":1352},"clear_sensitive_session_data",[1050,7349,1300],{"class":1071},[1050,7351,1304],{"class":1352},[1050,7353,1378],{"class":1071},[1050,7355,7356],{"class":1052,"line":1785},[1050,7357,1334],{"class":1067},[1050,7359,7360],{"class":1052,"line":1802},[1050,7361,7362],{"class":1056},"        # Invalidate remember me tokens if any\n",[1050,7364,7365,7367,7369,7372,7374,7376],{"class":1052,"line":1810},[1050,7366,7314],{"class":1067},[1050,7368,1072],{"class":1071},[1050,7370,7371],{"class":1352},"invalidate_remember_tokens",[1050,7373,1300],{"class":1071},[1050,7375,1557],{"class":1352},[1050,7377,1378],{"class":1071},[1050,7379,7380],{"class":1052,"line":1827},[1050,7381,1334],{"class":1067},[1050,7383,7384],{"class":1052,"line":1832},[1050,7385,7386],{"class":1056},"        # Perform logout\n",[1050,7388,7389,7392,7394,7396],{"class":1052,"line":1839},[1050,7390,7391],{"class":1352},"        logout",[1050,7393,1300],{"class":1071},[1050,7395,1304],{"class":1352},[1050,7397,1378],{"class":1071},[1050,7399,7400],{"class":1052,"line":1871},[1050,7401,1334],{"class":1067},[1050,7403,7404],{"class":1052,"line":1881},[1050,7405,7406],{"class":1056},"        # Clear any cached user data\n",[1050,7408,7409,7411,7413,7416,7418,7420],{"class":1052,"line":1886},[1050,7410,7314],{"class":1067},[1050,7412,1072],{"class":1071},[1050,7414,7415],{"class":1352},"clear_user_cache",[1050,7417,1300],{"class":1071},[1050,7419,1557],{"class":1352},[1050,7421,1378],{"class":1071},[1050,7423,7424],{"class":1052,"line":1892},[1050,7425,1334],{"class":1067},[1050,7427,7428,7430,7432,7434,7436,7439,7441,7443,7445],{"class":1052,"line":1916},[1050,7429,2705],{"class":1063},[1050,7431,1763],{"class":1402},[1050,7433,1089],{"class":1071},[1050,7435,2285],{"class":1249},[1050,7437,7438],{"class":1483},"\"You have been securely logged out, ",[1050,7440,2292],{"class":2291},[1050,7442,1366],{"class":1067},[1050,7444,2314],{"class":2291},[1050,7446,7447],{"class":1483},".\"\n",[1050,7449,7450],{"class":1052,"line":1932},[1050,7451,1277],{"class":1067},[1050,7453,7454,7456],{"class":1052,"line":1937},[1050,7455,1283],{"class":1071},[1050,7457,1287],{"class":1286},[1050,7459,7460,7462,7465,7467,7469,7471,7473],{"class":1052,"line":1943},[1050,7461,1293],{"class":1249},[1050,7463,7464],{"class":1296}," log_logout_attempt",[1050,7466,1300],{"class":1071},[1050,7468,1304],{"class":1303},[1050,7470,1089],{"class":1071},[1050,7472,1420],{"class":1303},[1050,7474,1317],{"class":1071},[1050,7476,7477,7479,7482],{"class":1052,"line":1974},[1050,7478,1323],{"class":1263},[1050,7480,7481],{"class":1267},"Log logout attempt for audit purposes",[1050,7483,1271],{"class":1263},[1050,7485,7486],{"class":1052,"line":1979},[1050,7487,1334],{"class":1067},[1050,7489,7490,7492],{"class":1052,"line":1994},[1050,7491,2778],{"class":1063},[1050,7493,2781],{"class":1067},[1050,7495,7496],{"class":1052,"line":2007},[1050,7497,1334],{"class":1067},[1050,7499,7500,7502,7504,7506,7508,7510,7512,7514,7516,7518],{"class":1052,"line":2013},[1050,7501,3033],{"class":1067},[1050,7503,1349],{"class":1071},[1050,7505,3038],{"class":1067},[1050,7507,1072],{"class":1071},[1050,7509,3043],{"class":1352},[1050,7511,1300],{"class":1071},[1050,7513,1480],{"class":1479},[1050,7515,3894],{"class":1483},[1050,7517,1480],{"class":1479},[1050,7519,1378],{"class":1071},[1050,7521,7522],{"class":1052,"line":2032},[1050,7523,1334],{"class":1067},[1050,7525,7526,7528,7530],{"class":1052,"line":2049},[1050,7527,3909],{"class":1067},[1050,7529,1349],{"class":1071},[1050,7531,1534],{"class":1071},[1050,7533,7534,7536,7538,7540,7542,7544,7546,7548],{"class":1052,"line":2054},[1050,7535,3365],{"class":1479},[1050,7537,1366],{"class":1483},[1050,7539,1480],{"class":1479},[1050,7541,1548],{"class":1071},[1050,7543,1420],{"class":1067},[1050,7545,1072],{"class":1071},[1050,7547,1366],{"class":1425},[1050,7549,1615],{"class":1071},[1050,7551,7552,7554,7556,7558,7560,7562,7564,7566],{"class":1052,"line":2060},[1050,7553,3365],{"class":1479},[1050,7555,3491],{"class":1483},[1050,7557,1480],{"class":1479},[1050,7559,1548],{"class":1071},[1050,7561,1420],{"class":1067},[1050,7563,1072],{"class":1071},[1050,7565,3502],{"class":1425},[1050,7567,1615],{"class":1071},[1050,7569,7570,7572,7574,7576,7578,7580,7582,7584,7586,7588,7590,7592,7594,7596],{"class":1052,"line":2075},[1050,7571,3365],{"class":1479},[1050,7573,2561],{"class":1483},[1050,7575,1480],{"class":1479},[1050,7577,1548],{"class":1071},[1050,7579,2521],{"class":1067},[1050,7581,1072],{"class":1071},[1050,7583,2527],{"class":2526},[1050,7585,1072],{"class":1071},[1050,7587,2532],{"class":1352},[1050,7589,1300],{"class":1071},[1050,7591,1480],{"class":1479},[1050,7593,2539],{"class":1483},[1050,7595,1480],{"class":1479},[1050,7597,3417],{"class":1071},[1050,7599,7600,7602,7604,7606,7608,7610,7612,7614,7616,7618,7620,7622,7624,7626,7628,7630,7632,7634],{"class":1052,"line":2080},[1050,7601,3365],{"class":1479},[1050,7603,3108],{"class":1483},[1050,7605,1480],{"class":1479},[1050,7607,1548],{"class":1071},[1050,7609,2521],{"class":1067},[1050,7611,1072],{"class":1071},[1050,7613,2527],{"class":2526},[1050,7615,1072],{"class":1071},[1050,7617,2532],{"class":1352},[1050,7619,1300],{"class":1071},[1050,7621,1480],{"class":1479},[1050,7623,2838],{"class":1483},[1050,7625,1480],{"class":1479},[1050,7627,1089],{"class":1071},[1050,7629,2845],{"class":1479},[1050,7631,4013],{"class":1071},[1050,7633,4016],{"class":2112},[1050,7635,4019],{"class":1071},[1050,7637,7638,7640,7643,7645,7647,7649,7651,7653,7655,7657],{"class":1052,"line":2086},[1050,7639,3365],{"class":1479},[1050,7641,7642],{"class":1483},"session_key",[1050,7644,1480],{"class":1479},[1050,7646,1548],{"class":1071},[1050,7648,2521],{"class":1067},[1050,7650,1072],{"class":1071},[1050,7652,1473],{"class":1425},[1050,7654,1072],{"class":1071},[1050,7656,7642],{"class":1425},[1050,7658,1615],{"class":1071},[1050,7660,7661,7663,7665,7667,7669,7671,7673,7675,7677,7679],{"class":1052,"line":2095},[1050,7662,3365],{"class":1479},[1050,7664,4043],{"class":1483},[1050,7666,1480],{"class":1479},[1050,7668,1548],{"class":1071},[1050,7670,1495],{"class":1067},[1050,7672,1072],{"class":1071},[1050,7674,1500],{"class":1352},[1050,7676,1503],{"class":1071},[1050,7678,1506],{"class":1352},[1050,7680,3384],{"class":1071},[1050,7682,7683],{"class":1052,"line":2136},[1050,7684,4065],{"class":1071},[1050,7686,7687],{"class":1052,"line":2144},[1050,7688,1334],{"class":1067},[1050,7690,7691,7693,7695,7697,7699,7701,7704,7706,7708,7710,7712],{"class":1052,"line":2167},[1050,7692,3060],{"class":1067},[1050,7694,1072],{"class":1071},[1050,7696,4126],{"class":1352},[1050,7698,1300],{"class":1071},[1050,7700,4131],{"class":1249},[1050,7702,7703],{"class":1483},"\"User logout: ",[1050,7705,2292],{"class":2291},[1050,7707,4139],{"class":1352},[1050,7709,2314],{"class":2291},[1050,7711,2359],{"class":1483},[1050,7713,1378],{"class":1071},[1050,7715,7716],{"class":1052,"line":2172},[1050,7717,1277],{"class":1067},[1050,7719,7720,7722],{"class":1052,"line":2178},[1050,7721,1283],{"class":1071},[1050,7723,1287],{"class":1286},[1050,7725,7726,7728,7731,7733,7735],{"class":1052,"line":2199},[1050,7727,1293],{"class":1249},[1050,7729,7730],{"class":1296}," clear_sensitive_session_data",[1050,7732,1300],{"class":1071},[1050,7734,1304],{"class":1303},[1050,7736,1317],{"class":1071},[1050,7738,7739,7741,7744],{"class":1052,"line":2204},[1050,7740,1323],{"class":1263},[1050,7742,7743],{"class":1267},"Clear sensitive data from session",[1050,7745,1271],{"class":1263},[1050,7747,7748],{"class":1052,"line":2210},[1050,7749,1334],{"class":1067},[1050,7751,7752],{"class":1052,"line":2240},[1050,7753,7754],{"class":1056},"        # List of sensitive session keys to clear\n",[1050,7756,7757,7760,7762],{"class":1052,"line":2245},[1050,7758,7759],{"class":1067},"        sensitive_keys ",[1050,7761,1349],{"class":1071},[1050,7763,4587],{"class":1071},[1050,7765,7766,7768,7770,7772],{"class":1052,"line":2251},[1050,7767,3365],{"class":1479},[1050,7769,1525],{"class":1483},[1050,7771,1480],{"class":1479},[1050,7773,1615],{"class":1071},[1050,7775,7776,7778,7781,7783],{"class":1052,"line":2271},[1050,7777,3365],{"class":1479},[1050,7779,7780],{"class":1483},"shopping_cart",[1050,7782,1480],{"class":1479},[1050,7784,1615],{"class":1071},[1050,7786,7787,7789,7792,7794],{"class":1052,"line":2276},[1050,7788,3365],{"class":1479},[1050,7790,7791],{"class":1483},"temp_data",[1050,7793,1480],{"class":1479},[1050,7795,1615],{"class":1071},[1050,7797,7798,7800,7803,7805],{"class":1052,"line":2320},[1050,7799,3365],{"class":1479},[1050,7801,7802],{"class":1483},"form_data",[1050,7804,1480],{"class":1479},[1050,7806,1615],{"class":1071},[1050,7808,7809,7811,7814,7816],{"class":1052,"line":2327},[1050,7810,3365],{"class":1479},[1050,7812,7813],{"class":1483},"search_history",[1050,7815,1480],{"class":1479},[1050,7817,1615],{"class":1071},[1050,7819,7820,7822,7825,7827],{"class":1052,"line":2369},[1050,7821,3365],{"class":1479},[1050,7823,7824],{"class":1483},"last_viewed_items",[1050,7826,1480],{"class":1479},[1050,7828,1615],{"class":1071},[1050,7830,7831],{"class":1052,"line":2385},[1050,7832,7833],{"class":1071},"        ]\n",[1050,7835,7836],{"class":1052,"line":2392},[1050,7837,1334],{"class":1067},[1050,7839,7840,7842,7845,7847,7850],{"class":1052,"line":2398},[1050,7841,5510],{"class":1063},[1050,7843,7844],{"class":1067}," key ",[1050,7846,5516],{"class":1063},[1050,7848,7849],{"class":1067}," sensitive_keys",[1050,7851,1257],{"class":1071},[1050,7853,7854,7856,7858,7860,7862,7865,7867,7870,7872,7874],{"class":1052,"line":2419},[1050,7855,3607],{"class":1067},[1050,7857,1072],{"class":1071},[1050,7859,1473],{"class":1425},[1050,7861,1072],{"class":1071},[1050,7863,7864],{"class":1352},"pop",[1050,7866,1300],{"class":1071},[1050,7868,7869],{"class":1352},"key",[1050,7871,1089],{"class":1071},[1050,7873,1403],{"class":1402},[1050,7875,1378],{"class":1071},[1050,7877,7878],{"class":1052,"line":2435},[1050,7879,1334],{"class":1067},[1050,7881,7882],{"class":1052,"line":2440},[1050,7883,7884],{"class":1056},"        # Clear any keys that might contain sensitive data\n",[1050,7886,7887,7890,7892],{"class":1052,"line":2447},[1050,7888,7889],{"class":1067},"        keys_to_remove ",[1050,7891,1349],{"class":1071},[1050,7893,5290],{"class":1071},[1050,7895,7896,7898,7900,7902,7904,7906,7908,7910,7913],{"class":1052,"line":2465},[1050,7897,5510],{"class":1063},[1050,7899,7844],{"class":1067},[1050,7901,5516],{"class":1063},[1050,7903,2521],{"class":1067},[1050,7905,1072],{"class":1071},[1050,7907,1473],{"class":1425},[1050,7909,1072],{"class":1071},[1050,7911,7912],{"class":1352},"keys",[1050,7914,6504],{"class":1071},[1050,7916,7917,7919,7922,7924,7927,7929,7932,7934,7937,7939,7942,7945,7947,7950,7952,7954,7956,7958,7960,7962,7964,7966,7968,7971,7973],{"class":1052,"line":2475},[1050,7918,1417],{"class":1063},[1050,7920,7921],{"class":1551}," any",[1050,7923,1300],{"class":1071},[1050,7925,7926],{"class":1352},"sensitive ",[1050,7928,5516],{"class":1063},[1050,7930,7931],{"class":1352}," key",[1050,7933,1072],{"class":1071},[1050,7935,7936],{"class":1352},"lower",[1050,7938,2302],{"class":1071},[1050,7940,7941],{"class":1063}," for",[1050,7943,7944],{"class":1352}," sensitive ",[1050,7946,5516],{"class":1063},[1050,7948,7949],{"class":1071}," [",[1050,7951,1480],{"class":1479},[1050,7953,1375],{"class":1483},[1050,7955,1480],{"class":1479},[1050,7957,1089],{"class":1071},[1050,7959,1567],{"class":1479},[1050,7961,6455],{"class":1483},[1050,7963,1480],{"class":1479},[1050,7965,1089],{"class":1071},[1050,7967,1567],{"class":1479},[1050,7969,7970],{"class":1483},"secret",[1050,7972,1480],{"class":1479},[1050,7974,7975],{"class":1071},"]):\n",[1050,7977,7978,7981,7983,7985,7987,7989],{"class":1052,"line":2480},[1050,7979,7980],{"class":1067},"                keys_to_remove",[1050,7982,1072],{"class":1071},[1050,7984,5403],{"class":1352},[1050,7986,1300],{"class":1071},[1050,7988,7869],{"class":1352},[1050,7990,1378],{"class":1071},[1050,7992,7993],{"class":1052,"line":2502},[1050,7994,1334],{"class":1067},[1050,7996,7997,7999,8001,8003,8006],{"class":1052,"line":2507},[1050,7998,5510],{"class":1063},[1050,8000,7844],{"class":1067},[1050,8002,5516],{"class":1063},[1050,8004,8005],{"class":1067}," keys_to_remove",[1050,8007,1257],{"class":1071},[1050,8009,8010,8012,8014,8016,8018,8020,8022],{"class":1052,"line":2513},[1050,8011,6225],{"class":1063},[1050,8013,2521],{"class":1067},[1050,8015,1072],{"class":1071},[1050,8017,1473],{"class":1425},[1050,8019,1476],{"class":1071},[1050,8021,7869],{"class":1425},[1050,8023,6242],{"class":1071},[1050,8025,8026],{"class":1052,"line":2546},[1050,8027,1277],{"class":1067},[1050,8029,8030,8032],{"class":1052,"line":2568},[1050,8031,1283],{"class":1071},[1050,8033,1287],{"class":1286},[1050,8035,8036,8038,8041,8043,8045],{"class":1052,"line":2595},[1050,8037,1293],{"class":1249},[1050,8039,8040],{"class":1296}," invalidate_remember_tokens",[1050,8042,1300],{"class":1071},[1050,8044,1557],{"class":1303},[1050,8046,1317],{"class":1071},[1050,8048,8049,8051,8054],{"class":1052,"line":2600},[1050,8050,1323],{"class":1263},[1050,8052,8053],{"class":1267},"Invalidate any remember me tokens",[1050,8055,1271],{"class":1263},[1050,8057,8058],{"class":1052,"line":2606},[1050,8059,1334],{"class":1067},[1050,8061,8062],{"class":1052,"line":2627},[1050,8063,8064],{"class":1056},"        # This would depend on your remember me implementation\n",[1050,8066,8067],{"class":1052,"line":2652},[1050,8068,8069],{"class":1056},"        # Example with a custom token model:\n",[1050,8071,8072],{"class":1052,"line":2657},[1050,8073,1334],{"class":1067},[1050,8075,8076,8079],{"class":1052,"line":2663},[1050,8077,8078],{"class":1063},"        try",[1050,8080,1257],{"class":1071},[1050,8082,8083,8086,8089,8091,8094,8096],{"class":1052,"line":2689},[1050,8084,8085],{"class":1063},"            from",[1050,8087,8088],{"class":1067}," myapp",[1050,8090,1072],{"class":1071},[1050,8092,8093],{"class":1067},"models ",[1050,8095,1083],{"class":1063},[1050,8097,8098],{"class":1067}," RememberToken\n",[1050,8100,8101,8104,8106,8108,8110,8113,8115,8117,8119,8121,8123,8125],{"class":1052,"line":2697},[1050,8102,8103],{"class":1067},"            RememberToken",[1050,8105,1072],{"class":1071},[1050,8107,6332],{"class":1425},[1050,8109,1072],{"class":1071},[1050,8111,8112],{"class":1352},"filter",[1050,8114,1300],{"class":1071},[1050,8116,1557],{"class":1361},[1050,8118,1349],{"class":1071},[1050,8120,1557],{"class":1352},[1050,8122,3467],{"class":1071},[1050,8124,3275],{"class":1352},[1050,8126,1509],{"class":1071},[1050,8128,8129,8132,8134],{"class":1052,"line":2702},[1050,8130,8131],{"class":1063},"        except",[1050,8133,6957],{"class":1286},[1050,8135,1257],{"class":1071},[1050,8137,8138],{"class":1052,"line":2711},[1050,8139,8140],{"class":1063},"            pass\n",[1050,8142,8143],{"class":1052,"line":2716},[1050,8144,1277],{"class":1067},[1050,8146,8147,8149],{"class":1052,"line":2723},[1050,8148,1283],{"class":1071},[1050,8150,1287],{"class":1286},[1050,8152,8153,8155,8158,8160,8162],{"class":1052,"line":2741},[1050,8154,1293],{"class":1249},[1050,8156,8157],{"class":1296}," clear_user_cache",[1050,8159,1300],{"class":1071},[1050,8161,1557],{"class":1303},[1050,8163,1317],{"class":1071},[1050,8165,8166,8168,8171],{"class":1052,"line":2751},[1050,8167,1323],{"class":1263},[1050,8169,8170],{"class":1267},"Clear cached user data",[1050,8172,1271],{"class":1263},[1050,8174,8175],{"class":1052,"line":2756},[1050,8176,1334],{"class":1067},[1050,8178,8179,8181,8183,8185,8187,8189,8191,8193],{"class":1052,"line":2775},[1050,8180,2483],{"class":1063},[1050,8182,1068],{"class":1067},[1050,8184,1072],{"class":1071},[1050,8186,2490],{"class":1067},[1050,8188,1072],{"class":1071},[1050,8190,1209],{"class":1067},[1050,8192,1083],{"class":1063},[1050,8194,2499],{"class":1067},[1050,8196,8197],{"class":1052,"line":2784},[1050,8198,1334],{"class":1067},[1050,8200,8201],{"class":1052,"line":2789},[1050,8202,8203],{"class":1056},"        # Clear permission cache\n",[1050,8205,8206,8208,8210,8212,8214,8216,8219,8221,8223,8225,8227,8229,8231],{"class":1052,"line":2816},[1050,8207,2968],{"class":1067},[1050,8209,1072],{"class":1071},[1050,8211,3275],{"class":1352},[1050,8213,1300],{"class":1071},[1050,8215,4131],{"class":1249},[1050,8217,8218],{"class":1483},"'user_permissions_",[1050,8220,2292],{"class":2291},[1050,8222,1557],{"class":1352},[1050,8224,1072],{"class":1071},[1050,8226,3502],{"class":1425},[1050,8228,2314],{"class":2291},[1050,8230,1480],{"class":1483},[1050,8232,1378],{"class":1071},[1050,8234,8235],{"class":1052,"line":2850},[1050,8236,1334],{"class":1067},[1050,8238,8239],{"class":1052,"line":2855},[1050,8240,8241],{"class":1056},"        # Clear profile cache\n",[1050,8243,8244,8246,8248,8250,8252,8254,8257,8259,8261,8263,8265,8267,8269],{"class":1052,"line":2861},[1050,8245,2968],{"class":1067},[1050,8247,1072],{"class":1071},[1050,8249,3275],{"class":1352},[1050,8251,1300],{"class":1071},[1050,8253,4131],{"class":1249},[1050,8255,8256],{"class":1483},"'user_profile_",[1050,8258,2292],{"class":2291},[1050,8260,1557],{"class":1352},[1050,8262,1072],{"class":1071},[1050,8264,3502],{"class":1425},[1050,8266,2314],{"class":2291},[1050,8268,1480],{"class":1483},[1050,8270,1378],{"class":1071},[1050,8272,8273],{"class":1052,"line":2880},[1050,8274,1334],{"class":1067},[1050,8276,8277],{"class":1052,"line":2899},[1050,8278,8279],{"class":1056},"        # Clear any other user-specific cache\n",[1050,8281,8282,8285,8287],{"class":1052,"line":2904},[1050,8283,8284],{"class":1067},"        cache_keys ",[1050,8286,1349],{"class":1071},[1050,8288,4587],{"class":1071},[1050,8290,8291,8293,8296,8298,8300,8302,8304,8306,8308],{"class":1052,"line":2933},[1050,8292,3074],{"class":1249},[1050,8294,8295],{"class":1483},"'user_settings_",[1050,8297,2292],{"class":2291},[1050,8299,1557],{"class":1067},[1050,8301,1072],{"class":1071},[1050,8303,3502],{"class":1425},[1050,8305,2314],{"class":2291},[1050,8307,1480],{"class":1483},[1050,8309,1615],{"class":1071},[1050,8311,8312,8314,8317,8319,8321,8323,8325,8327,8329],{"class":1052,"line":2960},[1050,8313,3074],{"class":1249},[1050,8315,8316],{"class":1483},"'user_notifications_",[1050,8318,2292],{"class":2291},[1050,8320,1557],{"class":1067},[1050,8322,1072],{"class":1071},[1050,8324,3502],{"class":1425},[1050,8326,2314],{"class":2291},[1050,8328,1480],{"class":1483},[1050,8330,1615],{"class":1071},[1050,8332,8333,8335,8338,8340,8342,8344,8346,8348,8350],{"class":1052,"line":2965},[1050,8334,3074],{"class":1249},[1050,8336,8337],{"class":1483},"'user_dashboard_",[1050,8339,2292],{"class":2291},[1050,8341,1557],{"class":1067},[1050,8343,1072],{"class":1071},[1050,8345,3502],{"class":1425},[1050,8347,2314],{"class":2291},[1050,8349,1480],{"class":1483},[1050,8351,1615],{"class":1071},[1050,8353,8354],{"class":1052,"line":2995},[1050,8355,7833],{"class":1071},[1050,8357,8358],{"class":1052,"line":3019},[1050,8359,1334],{"class":1067},[1050,8361,8362,8364,8366,8369,8371,8374],{"class":1052,"line":3024},[1050,8363,2968],{"class":1067},[1050,8365,1072],{"class":1071},[1050,8367,8368],{"class":1352},"delete_many",[1050,8370,1300],{"class":1071},[1050,8372,8373],{"class":1352},"cache_keys",[1050,8375,1378],{"class":1071},[1050,8377,8378],{"class":1052,"line":3030},[1050,8379,1243],{"emptyLinePlaceholder":1242},[1050,8381,8382,8384,8387,8389,8392],{"class":1052,"line":3057},[1050,8383,1250],{"class":1249},[1050,8385,8386],{"class":1253}," EnhancedLogoutView",[1050,8388,1300],{"class":1071},[1050,8390,8391],{"class":4331},"LogoutView",[1050,8393,1317],{"class":1071},[1050,8395,8396,8398,8401],{"class":1052,"line":3071},[1050,8397,1264],{"class":1263},[1050,8399,8400],{"class":1267},"Enhanced logout view with security features",[1050,8402,1271],{"class":1263},[1050,8404,8405],{"class":1052,"line":3089},[1050,8406,1277],{"class":1067},[1050,8408,8409,8411,8413,8415,8418],{"class":1052,"line":3123},[1050,8410,4355],{"class":1067},[1050,8412,1349],{"class":1071},[1050,8414,1567],{"class":1479},[1050,8416,8417],{"class":1483},"auth/logout.html",[1050,8419,4365],{"class":1479},[1050,8421,8422],{"class":1052,"line":3129},[1050,8423,1277],{"class":1067},[1050,8425,8426,8428,8430,8432,8434,8436,8438,8440,8442,8444,8446,8448,8450],{"class":1052,"line":3134},[1050,8427,1293],{"class":1249},[1050,8429,4427],{"class":1296},[1050,8431,1300],{"class":1071},[1050,8433,4433],{"class":4432},[1050,8435,1089],{"class":1071},[1050,8437,2521],{"class":1303},[1050,8439,1089],{"class":1071},[1050,8441,2116],{"class":1395},[1050,8443,4444],{"class":1303},[1050,8445,1089],{"class":1071},[1050,8447,4449],{"class":1395},[1050,8449,4452],{"class":1303},[1050,8451,1317],{"class":1071},[1050,8453,8454,8456,8459],{"class":1052,"line":3141},[1050,8455,1323],{"class":1263},[1050,8457,8458],{"class":1267},"Handle logout with enhanced security",[1050,8460,1271],{"class":1263},[1050,8462,8463],{"class":1052,"line":3159},[1050,8464,1334],{"class":1067},[1050,8466,8467,8469,8471,8473,8475,8477,8479],{"class":1052,"line":3169},[1050,8468,1389],{"class":1063},[1050,8470,2521],{"class":1067},[1050,8472,1072],{"class":1071},[1050,8474,1557],{"class":1425},[1050,8476,1072],{"class":1071},[1050,8478,7053],{"class":1425},[1050,8480,1257],{"class":1071},[1050,8482,8483],{"class":1052,"line":3174},[1050,8484,8485],{"class":1056},"            # Enhanced logout process\n",[1050,8487,8488,8491,8493,8495,8497,8499,8501,8504,8506,8508],{"class":1052,"line":3193},[1050,8489,8490],{"class":1067},"            success",[1050,8492,1089],{"class":1071},[1050,8494,4841],{"class":1067},[1050,8496,1349],{"class":1071},[1050,8498,6991],{"class":1067},[1050,8500,1072],{"class":1071},[1050,8502,8503],{"class":1352},"enhanced_logout_process",[1050,8505,1300],{"class":1071},[1050,8507,1304],{"class":1352},[1050,8509,1378],{"class":1071},[1050,8511,8512],{"class":1052,"line":3198},[1050,8513,4929],{"class":1067},[1050,8515,8516,8518,8520],{"class":1052,"line":3225},[1050,8517,1417],{"class":1063},[1050,8519,2230],{"class":1067},[1050,8521,1257],{"class":1071},[1050,8523,8524,8526,8528,8530,8532,8534,8536,8538],{"class":1052,"line":3244},[1050,8525,4959],{"class":1067},[1050,8527,1072],{"class":1071},[1050,8529,4027],{"class":1352},[1050,8531,1300],{"class":1071},[1050,8533,1304],{"class":1352},[1050,8535,1089],{"class":1071},[1050,8537,4921],{"class":1352},[1050,8539,1378],{"class":1071},[1050,8541,8542,8544],{"class":1052,"line":3263},[1050,8543,1780],{"class":1063},[1050,8545,1257],{"class":1071},[1050,8547,8548,8550,8552,8554,8556,8558,8560,8562],{"class":1052,"line":3268},[1050,8549,4959],{"class":1067},[1050,8551,1072],{"class":1071},[1050,8553,4126],{"class":1352},[1050,8555,1300],{"class":1071},[1050,8557,1304],{"class":1352},[1050,8559,1089],{"class":1071},[1050,8561,4921],{"class":1352},[1050,8563,1378],{"class":1071},[1050,8565,8566],{"class":1052,"line":3284},[1050,8567,1334],{"class":1067},[1050,8569,8570,8572,8574,8576,8578,8580,8582,8584,8586,8588,8590,8592,8594],{"class":1052,"line":3299},[1050,8571,2705],{"class":1063},[1050,8573,4462],{"class":1286},[1050,8575,1503],{"class":1071},[1050,8577,4467],{"class":1352},[1050,8579,1300],{"class":1071},[1050,8581,1304],{"class":1352},[1050,8583,1089],{"class":1071},[1050,8585,2116],{"class":1395},[1050,8587,4444],{"class":1352},[1050,8589,1089],{"class":1071},[1050,8591,4449],{"class":1395},[1050,8593,4452],{"class":1352},[1050,8595,1378],{"class":1071},[1050,8597,8598],{"class":1052,"line":3304},[1050,8599,1277],{"class":1067},[1050,8601,8602,8604,8606,8608,8610,8612,8614,8616],{"class":1052,"line":3311},[1050,8603,1293],{"class":1249},[1050,8605,4498],{"class":1296},[1050,8607,1300],{"class":1071},[1050,8609,4433],{"class":4432},[1050,8611,1089],{"class":1071},[1050,8613,4449],{"class":1395},[1050,8615,4452],{"class":1303},[1050,8617,1317],{"class":1071},[1050,8619,8620,8622,8625],{"class":1052,"line":3329},[1050,8621,1323],{"class":1263},[1050,8623,8624],{"class":1267},"Add logout context",[1050,8626,1271],{"class":1263},[1050,8628,8629],{"class":1052,"line":3339},[1050,8630,1334],{"class":1067},[1050,8632,8633,8635,8637,8639,8641,8643,8645,8647,8649],{"class":1052,"line":3344},[1050,8634,4531],{"class":1067},[1050,8636,1349],{"class":1071},[1050,8638,4462],{"class":1286},[1050,8640,1503],{"class":1071},[1050,8642,4540],{"class":1352},[1050,8644,1300],{"class":1071},[1050,8646,4545],{"class":1395},[1050,8648,4452],{"class":1352},[1050,8650,1378],{"class":1071},[1050,8652,8653],{"class":1052,"line":3362},[1050,8654,1334],{"class":1067},[1050,8656,8657,8659,8661,8663],{"class":1052,"line":3387},[1050,8658,4566],{"class":1067},[1050,8660,1072],{"class":1071},[1050,8662,3356],{"class":1352},[1050,8664,3359],{"class":1071},[1050,8666,8667,8669,8672,8674,8676,8678,8681,8683],{"class":1052,"line":3420},[1050,8668,3365],{"class":1479},[1050,8670,8671],{"class":1483},"logout_message",[1050,8673,1480],{"class":1479},[1050,8675,1548],{"class":1071},[1050,8677,1567],{"class":1479},[1050,8679,8680],{"class":1483},"You have been securely logged out.",[1050,8682,1480],{"class":1479},[1050,8684,1615],{"class":1071},[1050,8686,8687,8689,8692,8694,8696],{"class":1052,"line":3442},[1050,8688,3365],{"class":1479},[1050,8690,8691],{"class":1483},"security_tips",[1050,8693,1480],{"class":1479},[1050,8695,1548],{"class":1071},[1050,8697,4587],{"class":1071},[1050,8699,8700,8702,8705,8707],{"class":1052,"line":3475},[1050,8701,3631],{"class":1479},[1050,8703,8704],{"class":1483},"Close your browser if using a shared computer",[1050,8706,1480],{"class":1479},[1050,8708,1615],{"class":1071},[1050,8710,8711,8713,8716,8718],{"class":1052,"line":3486},[1050,8712,3631],{"class":1479},[1050,8714,8715],{"class":1483},"Clear your browser cache if on a public computer",[1050,8717,1480],{"class":1479},[1050,8719,1615],{"class":1071},[1050,8721,8722,8724,8727],{"class":1052,"line":3507},[1050,8723,3631],{"class":1479},[1050,8725,8726],{"class":1483},"Consider changing your password if you suspect unauthorized access",[1050,8728,4365],{"class":1479},[1050,8730,8731],{"class":1052,"line":3526},[1050,8732,4639],{"class":1071},[1050,8734,8735,8737,8740,8742,8744],{"class":1052,"line":3546},[1050,8736,3365],{"class":1479},[1050,8738,8739],{"class":1483},"next_steps",[1050,8741,1480],{"class":1479},[1050,8743,1548],{"class":1071},[1050,8745,4587],{"class":1071},[1050,8747,8748,8751,8753,8756,8758,8760,8762,8764,8766],{"class":1052,"line":3566},[1050,8749,8750],{"class":1071},"                (",[1050,8752,1480],{"class":1479},[1050,8754,8755],{"class":1483},"Login again",[1050,8757,1480],{"class":1479},[1050,8759,1089],{"class":1071},[1050,8761,1567],{"class":1479},[1050,8763,6085],{"class":1483},[1050,8765,1480],{"class":1479},[1050,8767,3417],{"class":1071},[1050,8769,8770,8772,8774,8777,8779,8781,8783,8786,8788],{"class":1052,"line":3572},[1050,8771,8750],{"class":1071},[1050,8773,1480],{"class":1479},[1050,8775,8776],{"class":1483},"Go to homepage",[1050,8778,1480],{"class":1479},[1050,8780,1089],{"class":1071},[1050,8782,1567],{"class":1479},[1050,8784,8785],{"class":1483},"home",[1050,8787,1480],{"class":1479},[1050,8789,3417],{"class":1071},[1050,8791,8792,8794,8796,8799,8801,8803,8805,8808,8810],{"class":1052,"line":3577},[1050,8793,8750],{"class":1071},[1050,8795,1480],{"class":1479},[1050,8797,8798],{"class":1483},"Contact support",[1050,8800,1480],{"class":1479},[1050,8802,1089],{"class":1071},[1050,8804,1567],{"class":1479},[1050,8806,8807],{"class":1483},"support",[1050,8809,1480],{"class":1479},[1050,8811,3417],{"class":1071},[1050,8813,8814],{"class":1052,"line":3583},[1050,8815,8816],{"class":1071},"            ]\n",[1050,8818,8819],{"class":1052,"line":3604},[1050,8820,3569],{"class":1071},[1050,8822,8823],{"class":1052,"line":3628},[1050,8824,1334],{"class":1067},[1050,8826,8827,8829],{"class":1052,"line":3682},[1050,8828,2705],{"class":1063},[1050,8830,4724],{"class":1067},[1050,8832,8833],{"class":1052,"line":3735},[1050,8834,1243],{"emptyLinePlaceholder":1242},[1050,8836,8837],{"class":1052,"line":3797},[1050,8838,8839],{"class":1056},"# AJAX logout support\n",[1050,8841,8842,8844,8847,8849,8852],{"class":1052,"line":3803},[1050,8843,1250],{"class":1249},[1050,8845,8846],{"class":1253}," AjaxLogoutView",[1050,8848,1300],{"class":1071},[1050,8850,8851],{"class":4331},"View",[1050,8853,1317],{"class":1071},[1050,8855,8856,8858,8861],{"class":1052,"line":3808},[1050,8857,1264],{"class":1263},[1050,8859,8860],{"class":1267},"AJAX-enabled logout view",[1050,8862,1271],{"class":1263},[1050,8864,8865],{"class":1052,"line":3815},[1050,8866,1277],{"class":1067},[1050,8868,8869,8871,8874,8876,8878,8880,8882,8884,8886,8888,8890,8892,8894],{"class":1052,"line":3850},[1050,8870,1293],{"class":1249},[1050,8872,8873],{"class":1296}," post",[1050,8875,1300],{"class":1071},[1050,8877,4433],{"class":4432},[1050,8879,1089],{"class":1071},[1050,8881,2521],{"class":1303},[1050,8883,1089],{"class":1071},[1050,8885,2116],{"class":1395},[1050,8887,4444],{"class":1303},[1050,8889,1089],{"class":1071},[1050,8891,4449],{"class":1395},[1050,8893,4452],{"class":1303},[1050,8895,1317],{"class":1071},[1050,8897,8898,8900,8903],{"class":1052,"line":3860},[1050,8899,1323],{"class":1263},[1050,8901,8902],{"class":1267},"Handle AJAX logout request",[1050,8904,1271],{"class":1263},[1050,8906,8907],{"class":1052,"line":3865},[1050,8908,1334],{"class":1067},[1050,8910,8911,8913,8915,8917,8920,8922,8924,8926,8928,8931,8933,8935,8937,8939,8942,8944],{"class":1052,"line":3872},[1050,8912,1389],{"class":1063},[1050,8914,2521],{"class":1067},[1050,8916,1072],{"class":1071},[1050,8918,8919],{"class":1425},"headers",[1050,8921,1072],{"class":1071},[1050,8923,2532],{"class":1352},[1050,8925,1300],{"class":1071},[1050,8927,1480],{"class":1479},[1050,8929,8930],{"class":1483},"X-Requested-With",[1050,8932,1480],{"class":1479},[1050,8934,1583],{"class":1071},[1050,8936,6422],{"class":1395},[1050,8938,1567],{"class":1479},[1050,8940,8941],{"class":1483},"XMLHttpRequest",[1050,8943,1480],{"class":1479},[1050,8945,1257],{"class":1071},[1050,8947,8948,8950,8952,8954,8956,8958,8960],{"class":1052,"line":3877},[1050,8949,1417],{"class":1063},[1050,8951,2521],{"class":1067},[1050,8953,1072],{"class":1071},[1050,8955,1557],{"class":1425},[1050,8957,1072],{"class":1071},[1050,8959,7053],{"class":1425},[1050,8961,1257],{"class":1071},[1050,8963,8964,8967,8969,8971,8973,8975,8977],{"class":1052,"line":3901},[1050,8965,8966],{"class":1067},"                username ",[1050,8968,1349],{"class":1071},[1050,8970,2521],{"class":1067},[1050,8972,1072],{"class":1071},[1050,8974,1557],{"class":1425},[1050,8976,1072],{"class":1071},[1050,8978,7073],{"class":1425},[1050,8980,8981],{"class":1052,"line":3906},[1050,8982,1456],{"class":1067},[1050,8984,8985],{"class":1052,"line":3916},[1050,8986,8987],{"class":1056},"                # Enhanced logout\n",[1050,8989,8990,8993,8995,8997,8999,9001,9003,9005,9007,9009],{"class":1052,"line":3949},[1050,8991,8992],{"class":1067},"                success",[1050,8994,1089],{"class":1071},[1050,8996,4841],{"class":1067},[1050,8998,1349],{"class":1071},[1050,9000,6991],{"class":1067},[1050,9002,1072],{"class":1071},[1050,9004,8503],{"class":1352},[1050,9006,1300],{"class":1071},[1050,9008,1304],{"class":1352},[1050,9010,1378],{"class":1071},[1050,9012,9013],{"class":1052,"line":3980},[1050,9014,1456],{"class":1067},[1050,9016,9017,9019,9022],{"class":1052,"line":4022},[1050,9018,1760],{"class":1063},[1050,9020,9021],{"class":1352}," JsonResponse",[1050,9023,3359],{"class":1071},[1050,9025,9026,9028,9030,9032,9034,9036],{"class":1052,"line":4038},[1050,9027,1540],{"class":1479},[1050,9029,4027],{"class":1483},[1050,9031,1480],{"class":1479},[1050,9033,1548],{"class":1071},[1050,9035,2230],{"class":1352},[1050,9037,1615],{"class":1071},[1050,9039,9040,9042,9045,9047,9049,9051],{"class":1052,"line":4062},[1050,9041,1540],{"class":1479},[1050,9043,9044],{"class":1483},"message",[1050,9046,1480],{"class":1479},[1050,9048,1548],{"class":1071},[1050,9050,4921],{"class":1352},[1050,9052,1615],{"class":1071},[1050,9054,9055,9057,9060,9062,9064,9067,9069,9071,9073,9075],{"class":1052,"line":4068},[1050,9056,1540],{"class":1479},[1050,9058,9059],{"class":1483},"redirect_url",[1050,9061,1480],{"class":1479},[1050,9063,1548],{"class":1071},[1050,9065,9066],{"class":1352}," reverse",[1050,9068,1300],{"class":1071},[1050,9070,1480],{"class":1479},[1050,9072,8785],{"class":1483},[1050,9074,1480],{"class":1479},[1050,9076,1378],{"class":1071},[1050,9078,9079],{"class":1052,"line":4073},[1050,9080,9081],{"class":1071},"                })\n",[1050,9083,9084,9086],{"class":1052,"line":4082},[1050,9085,1780],{"class":1063},[1050,9087,1257],{"class":1071},[1050,9089,9090,9092,9094],{"class":1052,"line":4104},[1050,9091,1760],{"class":1063},[1050,9093,9021],{"class":1352},[1050,9095,3359],{"class":1071},[1050,9097,9098,9100,9102,9104,9106,9108],{"class":1052,"line":4109},[1050,9099,1540],{"class":1479},[1050,9101,4027],{"class":1483},[1050,9103,1480],{"class":1479},[1050,9105,1548],{"class":1071},[1050,9107,1790],{"class":1402},[1050,9109,1615],{"class":1071},[1050,9111,9112,9114,9116,9118,9120,9122,9124],{"class":1052,"line":4118},[1050,9113,1540],{"class":1479},[1050,9115,9044],{"class":1483},[1050,9117,1480],{"class":1479},[1050,9119,1548],{"class":1071},[1050,9121,1567],{"class":1479},[1050,9123,7200],{"class":1483},[1050,9125,4365],{"class":1479},[1050,9127,9128],{"class":1052,"line":4148},[1050,9129,9081],{"class":1071},[1050,9131,9132],{"class":1052,"line":4155},[1050,9133,1334],{"class":1067},[1050,9135,9136],{"class":1052,"line":4181},[1050,9137,9138],{"class":1056},"        # Fallback to regular logout\n",[1050,9140,9141,9143,9145,9147,9149,9152,9154],{"class":1052,"line":4186},[1050,9142,2705],{"class":1063},[1050,9144,5827],{"class":1352},[1050,9146,1300],{"class":1071},[1050,9148,1480],{"class":1479},[1050,9150,9151],{"class":1483},"logout",[1050,9153,1480],{"class":1479},[1050,9155,1378],{"class":1071},[1050,9157,9158],{"class":1052,"line":4193},[1050,9159,1243],{"emptyLinePlaceholder":1242},[1050,9161,9162],{"class":1052,"line":4207},[1050,9163,9164],{"class":1056},"# Global logout (terminate all sessions)\n",[1050,9166,9167,9169,9172,9174,9177,9179,9182],{"class":1052,"line":4217},[1050,9168,1250],{"class":1249},[1050,9170,9171],{"class":1253}," GlobalLogoutView",[1050,9173,1300],{"class":1071},[1050,9175,9176],{"class":4331},"LoginRequiredMixin",[1050,9178,1089],{"class":1071},[1050,9180,9181],{"class":4331}," View",[1050,9183,1317],{"class":1071},[1050,9185,9186,9188,9191],{"class":1052,"line":4222},[1050,9187,1264],{"class":1263},[1050,9189,9190],{"class":1267},"Logout from all devices/sessions",[1050,9192,1271],{"class":1263},[1050,9194,9195],{"class":1052,"line":4228},[1050,9196,1277],{"class":1067},[1050,9198,9199,9201,9203,9205,9207,9209,9211,9213,9215,9217,9219,9221,9223],{"class":1052,"line":4234},[1050,9200,1293],{"class":1249},[1050,9202,8873],{"class":1296},[1050,9204,1300],{"class":1071},[1050,9206,4433],{"class":4432},[1050,9208,1089],{"class":1071},[1050,9210,2521],{"class":1303},[1050,9212,1089],{"class":1071},[1050,9214,2116],{"class":1395},[1050,9216,4444],{"class":1303},[1050,9218,1089],{"class":1071},[1050,9220,4449],{"class":1395},[1050,9222,4452],{"class":1303},[1050,9224,1317],{"class":1071},[1050,9226,9227,9229,9232],{"class":1052,"line":4239},[1050,9228,1323],{"class":1263},[1050,9230,9231],{"class":1267},"Terminate all user sessions",[1050,9233,1271],{"class":1263},[1050,9235,9236],{"class":1052,"line":4258},[1050,9237,1334],{"class":1067},[1050,9239,9240,9242,9244,9246,9248],{"class":1052,"line":4263},[1050,9241,1346],{"class":1067},[1050,9243,1349],{"class":1071},[1050,9245,2521],{"class":1067},[1050,9247,1072],{"class":1071},[1050,9249,7287],{"class":1425},[1050,9251,9252,9255,9257,9259,9261,9263,9265],{"class":1052,"line":4288},[1050,9253,9254],{"class":1067},"        current_session_key ",[1050,9256,1349],{"class":1071},[1050,9258,2521],{"class":1067},[1050,9260,1072],{"class":1071},[1050,9262,1473],{"class":1425},[1050,9264,1072],{"class":1071},[1050,9266,9267],{"class":1425},"session_key\n",[1050,9269,9270],{"class":1052,"line":4310},[1050,9271,1334],{"class":1067},[1050,9273,9274],{"class":1052,"line":4315},[1050,9275,9276],{"class":1056},"        # Get all user sessions\n",[1050,9278,9279,9281,9283,9285,9287,9289,9292,9294,9296,9298],{"class":1052,"line":4321},[1050,9280,2483],{"class":1063},[1050,9282,1068],{"class":1067},[1050,9284,1072],{"class":1071},[1050,9286,1075],{"class":1067},[1050,9288,1072],{"class":1071},[1050,9290,9291],{"class":1067},"sessions",[1050,9293,1072],{"class":1071},[1050,9295,8093],{"class":1067},[1050,9297,1083],{"class":1063},[1050,9299,9300],{"class":1067}," Session\n",[1050,9302,9303],{"class":1052,"line":4337},[1050,9304,1334],{"class":1067},[1050,9306,9307,9310,9312],{"class":1052,"line":4347},[1050,9308,9309],{"class":1067},"        terminated_sessions ",[1050,9311,1349],{"class":1071},[1050,9313,9314],{"class":2112}," 0\n",[1050,9316,9317],{"class":1052,"line":4352},[1050,9318,1334],{"class":1067},[1050,9320,9321,9323,9326,9328,9331,9333,9335,9337,9339,9341,9344,9346,9348,9350,9352],{"class":1052,"line":4368},[1050,9322,5510],{"class":1063},[1050,9324,9325],{"class":1067}," session ",[1050,9327,5516],{"class":1063},[1050,9329,9330],{"class":1067}," Session",[1050,9332,1072],{"class":1071},[1050,9334,6332],{"class":1425},[1050,9336,1072],{"class":1071},[1050,9338,8112],{"class":1352},[1050,9340,1300],{"class":1071},[1050,9342,9343],{"class":1361},"expire_date__gt",[1050,9345,1349],{"class":1071},[1050,9347,3740],{"class":1352},[1050,9349,1072],{"class":1071},[1050,9351,1500],{"class":1352},[1050,9353,9354],{"class":1071},"()):\n",[1050,9356,9357,9360],{"class":1052,"line":4378},[1050,9358,9359],{"class":1063},"            try",[1050,9361,1257],{"class":1071},[1050,9363,9364,9367,9369,9372,9374,9377],{"class":1052,"line":4388},[1050,9365,9366],{"class":1067},"                session_data ",[1050,9368,1349],{"class":1071},[1050,9370,9371],{"class":1067}," session",[1050,9373,1072],{"class":1071},[1050,9375,9376],{"class":1352},"get_decoded",[1050,9378,1509],{"class":1071},[1050,9380,9381,9384,9386,9389,9391,9393,9395,9397,9400,9402],{"class":1052,"line":4393},[1050,9382,9383],{"class":1067},"                session_user_id ",[1050,9385,1349],{"class":1071},[1050,9387,9388],{"class":1067}," session_data",[1050,9390,1072],{"class":1071},[1050,9392,2532],{"class":1352},[1050,9394,1300],{"class":1071},[1050,9396,1480],{"class":1479},[1050,9398,9399],{"class":1483},"_auth_user_id",[1050,9401,1480],{"class":1479},[1050,9403,1378],{"class":1071},[1050,9405,9406],{"class":1052,"line":4408},[1050,9407,1456],{"class":1067},[1050,9409,9410,9412,9415,9417,9420,9422,9425,9427,9429,9431,9433,9435],{"class":1052,"line":4422},[1050,9411,2016],{"class":1063},[1050,9413,9414],{"class":1067}," session_user_id ",[1050,9416,5382],{"class":1395},[1050,9418,9419],{"class":1286}," int",[1050,9421,1300],{"class":1071},[1050,9423,9424],{"class":1352},"session_user_id",[1050,9426,1583],{"class":1071},[1050,9428,6422],{"class":1395},[1050,9430,1420],{"class":1067},[1050,9432,1072],{"class":1071},[1050,9434,3502],{"class":1425},[1050,9436,1257],{"class":1071},[1050,9438,9439],{"class":1052,"line":4457},[1050,9440,9441],{"class":1056},"                    # Don't terminate current session yet\n",[1050,9443,9444,9447,9449,9451,9453,9456,9459],{"class":1052,"line":4488},[1050,9445,9446],{"class":1063},"                    if",[1050,9448,9371],{"class":1067},[1050,9450,1072],{"class":1071},[1050,9452,7642],{"class":1425},[1050,9454,9455],{"class":1395}," !=",[1050,9457,9458],{"class":1067}," current_session_key",[1050,9460,1257],{"class":1071},[1050,9462,9463,9466,9468,9470],{"class":1052,"line":4493},[1050,9464,9465],{"class":1067},"                        session",[1050,9467,1072],{"class":1071},[1050,9469,3275],{"class":1352},[1050,9471,1509],{"class":1071},[1050,9473,9474,9477,9480],{"class":1052,"line":4513},[1050,9475,9476],{"class":1067},"                        terminated_sessions ",[1050,9478,9479],{"class":1071},"+=",[1050,9481,2930],{"class":2112},[1050,9483,9484,9487],{"class":1052,"line":4523},[1050,9485,9486],{"class":1063},"            except",[1050,9488,1257],{"class":1071},[1050,9490,9491],{"class":1052,"line":4528},[1050,9492,9493],{"class":1063},"                continue\n",[1050,9495,9496],{"class":1052,"line":4552},[1050,9497,1334],{"class":1067},[1050,9499,9500],{"class":1052,"line":4557},[1050,9501,9502],{"class":1056},"        # Log global logout\n",[1050,9504,9505,9507],{"class":1052,"line":4563},[1050,9506,2778],{"class":1063},[1050,9508,2781],{"class":1067},[1050,9510,9511,9513,9515,9517,9519,9521,9523,9525,9527,9529],{"class":1052,"line":4575},[1050,9512,3033],{"class":1067},[1050,9514,1349],{"class":1071},[1050,9516,3038],{"class":1067},[1050,9518,1072],{"class":1071},[1050,9520,3043],{"class":1352},[1050,9522,1300],{"class":1071},[1050,9524,1480],{"class":1479},[1050,9526,3050],{"class":1483},[1050,9528,1480],{"class":1479},[1050,9530,1378],{"class":1071},[1050,9532,9533,9535,9537,9539],{"class":1052,"line":4590},[1050,9534,3060],{"class":1067},[1050,9536,1072],{"class":1071},[1050,9538,4126],{"class":1352},[1050,9540,3068],{"class":1071},[1050,9542,9543,9545,9548,9550,9552,9554,9556,9558],{"class":1052,"line":4602},[1050,9544,3074],{"class":1249},[1050,9546,9547],{"class":1483},"\"Global logout performed by user ",[1050,9549,2292],{"class":2291},[1050,9551,1557],{"class":1352},[1050,9553,1072],{"class":1071},[1050,9555,1366],{"class":1425},[1050,9557,2314],{"class":2291},[1050,9559,9560],{"class":1483},". \"\n",[1050,9562,9563,9565,9568,9570,9573,9575],{"class":1052,"line":4614},[1050,9564,3074],{"class":1249},[1050,9566,9567],{"class":1483},"\"Terminated ",[1050,9569,2292],{"class":2291},[1050,9571,9572],{"class":1352},"terminated_sessions",[1050,9574,2314],{"class":2291},[1050,9576,9577],{"class":1483}," sessions.\"\n",[1050,9579,9580],{"class":1052,"line":4626},[1050,9581,3126],{"class":1071},[1050,9583,9584],{"class":1052,"line":4636},[1050,9585,1334],{"class":1067},[1050,9587,9588],{"class":1052,"line":4642},[1050,9589,9590],{"class":1056},"        # Now logout current session\n",[1050,9592,9593,9595,9597,9599,9601,9603],{"class":1052,"line":4656},[1050,9594,7314],{"class":1067},[1050,9596,1072],{"class":1071},[1050,9598,8503],{"class":1352},[1050,9600,1300],{"class":1071},[1050,9602,1304],{"class":1352},[1050,9604,1378],{"class":1071},[1050,9606,9607],{"class":1052,"line":4672},[1050,9608,1334],{"class":1067},[1050,9610,9611,9613,9615,9617],{"class":1052,"line":4688},[1050,9612,6052],{"class":1067},[1050,9614,1072],{"class":1071},[1050,9616,4027],{"class":1352},[1050,9618,3068],{"class":1071},[1050,9620,9621,9623],{"class":1052,"line":4704},[1050,9622,3607],{"class":1352},[1050,9624,1615],{"class":1071},[1050,9626,9627,9629],{"class":1052,"line":4709},[1050,9628,3074],{"class":1249},[1050,9630,9631],{"class":1483},"'You have been logged out from all devices. '\n",[1050,9633,9634,9636,9638,9640,9642,9644],{"class":1052,"line":4714},[1050,9635,3074],{"class":1249},[1050,9637,1480],{"class":1483},[1050,9639,2292],{"class":2291},[1050,9641,9572],{"class":1352},[1050,9643,2314],{"class":2291},[1050,9645,9646],{"class":1483}," other sessions were terminated.'\n",[1050,9648,9649],{"class":1052,"line":4719},[1050,9650,3126],{"class":1071},[1050,9652,9653],{"class":1052,"line":4727},[1050,9654,1334],{"class":1067},[1050,9656,9657,9659,9661,9663,9665,9667,9669],{"class":1052,"line":4732},[1050,9658,2705],{"class":1063},[1050,9660,5827],{"class":1352},[1050,9662,1300],{"class":1071},[1050,9664,1480],{"class":1479},[1050,9666,8785],{"class":1483},[1050,9668,1480],{"class":1479},[1050,9670,1378],{"class":1071},[1030,9672,9674],{"id":9673},"session-management","Session Management",[1035,9676,9678],{"id":9677},"advanced-session-handling","Advanced Session Handling",[1040,9680,9682],{"className":1042,"code":9681,"language":1044,"meta":1045,"style":1045},"# Advanced session management for login/logout\nclass SessionManager:\n    \"\"\"Advanced session management utilities\"\"\"\n    \n    @staticmethod\n    def create_secure_session(request, user):\n        \"\"\"Create a secure session for user\"\"\"\n        \n        # Regenerate session key for security\n        request.session.cycle_key()\n        \n        # Set session data\n        request.session.update({\n            '_auth_user_id': str(user.pk),\n            '_auth_user_backend': 'django.contrib.auth.backends.ModelBackend',\n            'login_timestamp': timezone.now().isoformat(),\n            'session_security': {\n                'ip_address': request.META.get('REMOTE_ADDR'),\n                'user_agent_hash': hashlib.md5(\n                    request.META.get('HTTP_USER_AGENT', '').encode()\n                ).hexdigest(),\n                'created_at': timezone.now().isoformat(),\n            }\n        })\n        \n        # Set session expiry based on user preferences\n        SessionManager.set_session_expiry(request, user)\n    \n    @staticmethod\n    def set_session_expiry(request, user):\n        \"\"\"Set appropriate session expiry\"\"\"\n        \n        # Check user preferences\n        if hasattr(user, 'profile'):\n            session_timeout = getattr(user.profile, 'session_timeout', None)\n            \n            if session_timeout:\n                request.session.set_expiry(session_timeout)\n                return\n        \n        # Default: 8 hours for regular users, 1 hour for staff\n        if user.is_staff:\n            request.session.set_expiry(3600)  # 1 hour\n        else:\n            request.session.set_expiry(28800)  # 8 hours\n    \n    @staticmethod\n    def validate_session_security(request):\n        \"\"\"Validate session security\"\"\"\n        \n        if not request.user.is_authenticated:\n            return True\n        \n        session_security = request.session.get('session_security', {})\n        \n        # Check IP address consistency\n        stored_ip = session_security.get('ip_address')\n        current_ip = request.META.get('REMOTE_ADDR')\n        \n        if stored_ip and stored_ip != current_ip:\n            # IP changed - potential session hijacking\n            return False\n        \n        # Check user agent consistency\n        stored_ua_hash = session_security.get('user_agent_hash')\n        current_ua_hash = hashlib.md5(\n            request.META.get('HTTP_USER_AGENT', '').encode()\n        ).hexdigest()\n        \n        if stored_ua_hash and stored_ua_hash != current_ua_hash:\n            # User agent changed - potential session hijacking\n            return False\n        \n        return True\n    \n    @staticmethod\n    def get_session_info(request):\n        \"\"\"Get comprehensive session information\"\"\"\n        \n        if not request.user.is_authenticated:\n            return None\n        \n        session_security = request.session.get('session_security', {})\n        \n        return {\n            'session_key': request.session.session_key,\n            'user_id': request.user.id,\n            'username': request.user.username,\n            'login_timestamp': request.session.get('login_timestamp'),\n            'ip_address': session_security.get('ip_address'),\n            'user_agent': request.META.get('HTTP_USER_AGENT', '')[:100],\n            'expires_at': request.session.get_expiry_date(),\n            'is_secure': request.is_secure(),\n        }\n    \n    @staticmethod\n    def cleanup_expired_sessions():\n        \"\"\"Clean up expired sessions (run as management command)\"\"\"\n        \n        from django.contrib.sessions.models import Session\n        from django.core.management.base import BaseCommand\n        \n        class Command(BaseCommand):\n            help = 'Clean up expired sessions'\n            \n            def handle(self, *args, **options):\n                expired_sessions = Session.objects.filter(\n                    expire_date__lt=timezone.now()\n                )\n                \n                count = expired_sessions.count()\n                expired_sessions.delete()\n                \n                self.stdout.write(\n                    self.style.SUCCESS(\n                        f'Successfully cleaned up {count} expired sessions'\n                    )\n                )\n        \n        return Command\n\n# Session security middleware\nclass SessionSecurityMiddleware:\n    \"\"\"Middleware to enforce session security\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n    \n    def __call__(self, request):\n        # Validate session security before processing request\n        if hasattr(request, 'user') and request.user.is_authenticated:\n            if not SessionManager.validate_session_security(request):\n                # Session security compromised\n                logout(request)\n                \n                messages.warning(\n                    request,\n                    'Your session was terminated for security reasons. Please log in again.'\n                )\n                \n                return redirect('login')\n        \n        response = self.get_response(request)\n        \n        # Update session security info after successful request\n        if (hasattr(request, 'user') and request.user.is_authenticated and \n            request.method == 'POST'):\n            \n            session_security = request.session.get('session_security', {})\n            session_security['last_activity'] = timezone.now().isoformat()\n            request.session['session_security'] = session_security\n        \n        return response\n\n# Remember me functionality\nclass RememberMeManager:\n    \"\"\"Manage remember me functionality\"\"\"\n    \n    @staticmethod\n    def create_remember_token(user):\n        \"\"\"Create a remember me token\"\"\"\n        \n        import secrets\n        \n        # Generate secure token\n        token = secrets.token_urlsafe(32)\n        \n        # Store token (you'd need a RememberToken model)\n        try:\n            from myapp.models import RememberToken\n            \n            RememberToken.objects.create(\n                user=user,\n                token=token,\n                expires_at=timezone.now() + timedelta(days=30)\n            )\n            \n            return token\n        except ImportError:\n            return None\n    \n    @staticmethod\n    def validate_remember_token(token):\n        \"\"\"Validate and use remember me token\"\"\"\n        \n        try:\n            from myapp.models import RememberToken\n            \n            remember_token = RememberToken.objects.get(\n                token=token,\n                expires_at__gt=timezone.now()\n            )\n            \n            user = remember_token.user\n            \n            # Token is valid, but delete it (one-time use)\n            remember_token.delete()\n            \n            return user\n        except (ImportError, RememberToken.DoesNotExist):\n            return None\n    \n    @staticmethod\n    def cleanup_expired_tokens():\n        \"\"\"Clean up expired remember me tokens\"\"\"\n        \n        try:\n            from myapp.models import RememberToken\n            \n            expired_count = RememberToken.objects.filter(\n                expires_at__lt=timezone.now()\n            ).delete()[0]\n            \n            return expired_count\n        except ImportError:\n            return 0\n",[1047,9683,9684,9689,9698,9707,9711,9717,9734,9743,9747,9752,9767,9771,9776,9790,9813,9833,9855,9868,9898,9916,9946,9955,9978,9982,9986,9990,9995,10015,10019,10025,10042,10051,10055,10060,10080,10112,10116,10125,10143,10148,10152,10157,10169,10191,10197,10219,10223,10229,10242,10251,10255,10273,10279,10283,10313,10317,10322,10346,10372,10376,10393,10398,10404,10408,10413,10436,10451,10481,10490,10494,10512,10517,10523,10527,10533,10537,10543,10556,10565,10569,10587,10594,10598,10626,10630,10636,10658,10680,10702,10732,10758,10796,10820,10839,10843,10847,10853,10862,10871,10875,10897,10922,10926,10941,10955,10959,10986,11005,11020,11024,11028,11045,11056,11060,11077,11093,11110,11115,11119,11123,11130,11134,11139,11148,11157,11161,11179,11193,11197,11214,11219,11253,11272,11277,11288,11292,11302,11308,11317,11321,11325,11341,11345,11364,11368,11373,11411,11429,11433,11462,11492,11515,11519,11526,11530,11535,11544,11553,11557,11563,11576,11585,11589,11596,11600,11605,11626,11630,11635,11641,11655,11659,11674,11684,11695,11724,11729,11733,11740,11748,11754,11758,11764,11777,11786,11790,11796,11810,11814,11834,11844,11859,11863,11867,11881,11885,11890,11901,11905,11912,11931,11937,11941,11947,11956,11965,11969,11975,11989,11993,12012,12027,12040,12044,12051,12059],{"__ignoreMap":1045},[1050,9685,9686],{"class":1052,"line":1053},[1050,9687,9688],{"class":1056},"# Advanced session management for login/logout\n",[1050,9690,9691,9693,9696],{"class":1052,"line":1060},[1050,9692,1250],{"class":1249},[1050,9694,9695],{"class":1253}," SessionManager",[1050,9697,1257],{"class":1071},[1050,9699,9700,9702,9705],{"class":1052,"line":1100},[1050,9701,1264],{"class":1263},[1050,9703,9704],{"class":1267},"Advanced session management utilities",[1050,9706,1271],{"class":1263},[1050,9708,9709],{"class":1052,"line":1126},[1050,9710,1277],{"class":1067},[1050,9712,9713,9715],{"class":1052,"line":1148},[1050,9714,1283],{"class":1071},[1050,9716,1287],{"class":1286},[1050,9718,9719,9721,9724,9726,9728,9730,9732],{"class":1052,"line":1165},[1050,9720,1293],{"class":1249},[1050,9722,9723],{"class":1296}," create_secure_session",[1050,9725,1300],{"class":1071},[1050,9727,1304],{"class":1303},[1050,9729,1089],{"class":1071},[1050,9731,1420],{"class":1303},[1050,9733,1317],{"class":1071},[1050,9735,9736,9738,9741],{"class":1052,"line":1192},[1050,9737,1323],{"class":1263},[1050,9739,9740],{"class":1267},"Create a secure session for user",[1050,9742,1271],{"class":1263},[1050,9744,9745],{"class":1052,"line":1217},[1050,9746,1334],{"class":1067},[1050,9748,9749],{"class":1052,"line":1239},[1050,9750,9751],{"class":1056},"        # Regenerate session key for security\n",[1050,9753,9754,9756,9758,9760,9762,9765],{"class":1052,"line":1246},[1050,9755,3347],{"class":1067},[1050,9757,1072],{"class":1071},[1050,9759,1473],{"class":1425},[1050,9761,1072],{"class":1071},[1050,9763,9764],{"class":1352},"cycle_key",[1050,9766,1509],{"class":1071},[1050,9768,9769],{"class":1052,"line":1260},[1050,9770,1334],{"class":1067},[1050,9772,9773],{"class":1052,"line":1274},[1050,9774,9775],{"class":1056},"        # Set session data\n",[1050,9777,9778,9780,9782,9784,9786,9788],{"class":1052,"line":1280},[1050,9779,3347],{"class":1067},[1050,9781,1072],{"class":1071},[1050,9783,1473],{"class":1425},[1050,9785,1072],{"class":1071},[1050,9787,3356],{"class":1352},[1050,9789,3359],{"class":1071},[1050,9791,9792,9794,9796,9798,9800,9802,9804,9806,9808,9811],{"class":1052,"line":1290},[1050,9793,3365],{"class":1479},[1050,9795,9399],{"class":1483},[1050,9797,1480],{"class":1479},[1050,9799,1548],{"class":1071},[1050,9801,3747],{"class":1286},[1050,9803,1300],{"class":1071},[1050,9805,1557],{"class":1352},[1050,9807,1072],{"class":1071},[1050,9809,9810],{"class":1425},"pk",[1050,9812,3417],{"class":1071},[1050,9814,9815,9817,9820,9822,9824,9826,9829,9831],{"class":1052,"line":1320},[1050,9816,3365],{"class":1479},[1050,9818,9819],{"class":1483},"_auth_user_backend",[1050,9821,1480],{"class":1479},[1050,9823,1548],{"class":1071},[1050,9825,1567],{"class":1479},[1050,9827,9828],{"class":1483},"django.contrib.auth.backends.ModelBackend",[1050,9830,1480],{"class":1479},[1050,9832,1615],{"class":1071},[1050,9834,9835,9837,9839,9841,9843,9845,9847,9849,9851,9853],{"class":1052,"line":1331},[1050,9836,3365],{"class":1479},[1050,9838,1484],{"class":1483},[1050,9840,1480],{"class":1479},[1050,9842,1548],{"class":1071},[1050,9844,1495],{"class":1352},[1050,9846,1072],{"class":1071},[1050,9848,1500],{"class":1352},[1050,9850,1503],{"class":1071},[1050,9852,1506],{"class":1352},[1050,9854,3384],{"class":1071},[1050,9856,9857,9859,9862,9864,9866],{"class":1052,"line":1337},[1050,9858,3365],{"class":1479},[1050,9860,9861],{"class":1483},"session_security",[1050,9863,1480],{"class":1479},[1050,9865,1548],{"class":1071},[1050,9867,1534],{"class":1071},[1050,9869,9870,9872,9874,9876,9878,9880,9882,9884,9886,9888,9890,9892,9894,9896],{"class":1052,"line":1343},[1050,9871,3631],{"class":1479},[1050,9873,2561],{"class":1483},[1050,9875,1480],{"class":1479},[1050,9877,1548],{"class":1071},[1050,9879,2521],{"class":1352},[1050,9881,1072],{"class":1071},[1050,9883,2527],{"class":2526},[1050,9885,1072],{"class":1071},[1050,9887,2532],{"class":1352},[1050,9889,1300],{"class":1071},[1050,9891,1480],{"class":1479},[1050,9893,2539],{"class":1483},[1050,9895,1480],{"class":1479},[1050,9897,3417],{"class":1071},[1050,9899,9900,9902,9904,9906,9908,9910,9912,9914],{"class":1052,"line":1381},[1050,9901,3631],{"class":1479},[1050,9903,3425],{"class":1483},[1050,9905,1480],{"class":1479},[1050,9907,1548],{"class":1071},[1050,9909,3432],{"class":1352},[1050,9911,1072],{"class":1071},[1050,9913,3437],{"class":1352},[1050,9915,3068],{"class":1071},[1050,9917,9918,9920,9922,9924,9926,9928,9930,9932,9934,9936,9938,9940,9942,9944],{"class":1052,"line":1386},[1050,9919,2098],{"class":1352},[1050,9921,1072],{"class":1071},[1050,9923,2527],{"class":2526},[1050,9925,1072],{"class":1071},[1050,9927,2532],{"class":1352},[1050,9929,1300],{"class":1071},[1050,9931,1480],{"class":1479},[1050,9933,2838],{"class":1483},[1050,9935,1480],{"class":1479},[1050,9937,1089],{"class":1071},[1050,9939,2845],{"class":1479},[1050,9941,3467],{"class":1071},[1050,9943,3470],{"class":1352},[1050,9945,1509],{"class":1071},[1050,9947,9948,9951,9953],{"class":1052,"line":1408},[1050,9949,9950],{"class":1071},"                ).",[1050,9952,3481],{"class":1352},[1050,9954,3384],{"class":1071},[1050,9956,9957,9959,9962,9964,9966,9968,9970,9972,9974,9976],{"class":1052,"line":1414},[1050,9958,3631],{"class":1479},[1050,9960,9961],{"class":1483},"created_at",[1050,9963,1480],{"class":1479},[1050,9965,1548],{"class":1071},[1050,9967,1495],{"class":1352},[1050,9969,1072],{"class":1071},[1050,9971,1500],{"class":1352},[1050,9973,1503],{"class":1071},[1050,9975,1506],{"class":1352},[1050,9977,3384],{"class":1071},[1050,9979,9980],{"class":1052,"line":1431},[1050,9981,3800],{"class":1071},[1050,9983,9984],{"class":1052,"line":1437},[1050,9985,3569],{"class":1071},[1050,9987,9988],{"class":1052,"line":1453},[1050,9989,1334],{"class":1067},[1050,9991,9992],{"class":1052,"line":1459},[1050,9993,9994],{"class":1056},"        # Set session expiry based on user preferences\n",[1050,9996,9997,10000,10002,10005,10007,10009,10011,10013],{"class":1052,"line":1465},[1050,9998,9999],{"class":1067},"        SessionManager",[1050,10001,1072],{"class":1071},[1050,10003,10004],{"class":1352},"set_session_expiry",[1050,10006,1300],{"class":1071},[1050,10008,1304],{"class":1352},[1050,10010,1089],{"class":1071},[1050,10012,1420],{"class":1352},[1050,10014,1378],{"class":1071},[1050,10016,10017],{"class":1052,"line":1512},[1050,10018,1277],{"class":1067},[1050,10020,10021,10023],{"class":1052,"line":1537},[1050,10022,1283],{"class":1071},[1050,10024,1287],{"class":1286},[1050,10026,10027,10029,10032,10034,10036,10038,10040],{"class":1052,"line":1618},[1050,10028,1293],{"class":1249},[1050,10030,10031],{"class":1296}," set_session_expiry",[1050,10033,1300],{"class":1071},[1050,10035,1304],{"class":1303},[1050,10037,1089],{"class":1071},[1050,10039,1420],{"class":1303},[1050,10041,1317],{"class":1071},[1050,10043,10044,10046,10049],{"class":1052,"line":1687},[1050,10045,1323],{"class":1263},[1050,10047,10048],{"class":1267},"Set appropriate session expiry",[1050,10050,1271],{"class":1263},[1050,10052,10053],{"class":1052,"line":1693},[1050,10054,1334],{"class":1067},[1050,10056,10057],{"class":1052,"line":1698},[1050,10058,10059],{"class":1056},"        # Check user preferences\n",[1050,10061,10062,10064,10066,10068,10070,10072,10074,10076,10078],{"class":1052,"line":1704},[1050,10063,1389],{"class":1063},[1050,10065,1589],{"class":1551},[1050,10067,1300],{"class":1071},[1050,10069,1557],{"class":1352},[1050,10071,1089],{"class":1071},[1050,10073,1567],{"class":1479},[1050,10075,1562],{"class":1483},[1050,10077,1480],{"class":1479},[1050,10079,1317],{"class":1071},[1050,10081,10082,10085,10087,10089,10091,10093,10095,10097,10099,10101,10104,10106,10108,10110],{"class":1052,"line":1725},[1050,10083,10084],{"class":1067},"            session_timeout ",[1050,10086,1349],{"class":1071},[1050,10088,1552],{"class":1551},[1050,10090,1300],{"class":1071},[1050,10092,1557],{"class":1352},[1050,10094,1072],{"class":1071},[1050,10096,1562],{"class":1425},[1050,10098,1089],{"class":1071},[1050,10100,1567],{"class":1479},[1050,10102,10103],{"class":1483},"session_timeout",[1050,10105,1480],{"class":1479},[1050,10107,1089],{"class":1071},[1050,10109,1403],{"class":1402},[1050,10111,1378],{"class":1071},[1050,10113,10114],{"class":1052,"line":1752},[1050,10115,4929],{"class":1067},[1050,10117,10118,10120,10123],{"class":1052,"line":1757},[1050,10119,1417],{"class":1063},[1050,10121,10122],{"class":1067}," session_timeout",[1050,10124,1257],{"class":1071},[1050,10126,10127,10129,10131,10133,10135,10137,10139,10141],{"class":1052,"line":1777},[1050,10128,1468],{"class":1067},[1050,10130,1072],{"class":1071},[1050,10132,1473],{"class":1425},[1050,10134,1072],{"class":1071},[1050,10136,2107],{"class":1352},[1050,10138,1300],{"class":1071},[1050,10140,10103],{"class":1352},[1050,10142,1378],{"class":1071},[1050,10144,10145],{"class":1052,"line":1785},[1050,10146,10147],{"class":1063},"                return\n",[1050,10149,10150],{"class":1052,"line":1802},[1050,10151,1334],{"class":1067},[1050,10153,10154],{"class":1052,"line":1810},[1050,10155,10156],{"class":1056},"        # Default: 8 hours for regular users, 1 hour for staff\n",[1050,10158,10159,10161,10163,10165,10167],{"class":1052,"line":1827},[1050,10160,1389],{"class":1063},[1050,10162,1420],{"class":1067},[1050,10164,1072],{"class":1071},[1050,10166,3531],{"class":1425},[1050,10168,1257],{"class":1071},[1050,10170,10171,10173,10175,10177,10179,10181,10183,10186,10188],{"class":1052,"line":1832},[1050,10172,3607],{"class":1067},[1050,10174,1072],{"class":1071},[1050,10176,1473],{"class":1425},[1050,10178,1072],{"class":1071},[1050,10180,2107],{"class":1352},[1050,10182,1300],{"class":1071},[1050,10184,10185],{"class":2112},"3600",[1050,10187,1583],{"class":1071},[1050,10189,10190],{"class":1056},"  # 1 hour\n",[1050,10192,10193,10195],{"class":1052,"line":1839},[1050,10194,1805],{"class":1063},[1050,10196,1257],{"class":1071},[1050,10198,10199,10201,10203,10205,10207,10209,10211,10214,10216],{"class":1052,"line":1871},[1050,10200,3607],{"class":1067},[1050,10202,1072],{"class":1071},[1050,10204,1473],{"class":1425},[1050,10206,1072],{"class":1071},[1050,10208,2107],{"class":1352},[1050,10210,1300],{"class":1071},[1050,10212,10213],{"class":2112},"28800",[1050,10215,1583],{"class":1071},[1050,10217,10218],{"class":1056},"  # 8 hours\n",[1050,10220,10221],{"class":1052,"line":1881},[1050,10222,1277],{"class":1067},[1050,10224,10225,10227],{"class":1052,"line":1886},[1050,10226,1283],{"class":1071},[1050,10228,1287],{"class":1286},[1050,10230,10231,10233,10236,10238,10240],{"class":1052,"line":1892},[1050,10232,1293],{"class":1249},[1050,10234,10235],{"class":1296}," validate_session_security",[1050,10237,1300],{"class":1071},[1050,10239,1304],{"class":1303},[1050,10241,1317],{"class":1071},[1050,10243,10244,10246,10249],{"class":1052,"line":1916},[1050,10245,1323],{"class":1263},[1050,10247,10248],{"class":1267},"Validate session security",[1050,10250,1271],{"class":1263},[1050,10252,10253],{"class":1052,"line":1932},[1050,10254,1334],{"class":1067},[1050,10256,10257,10259,10261,10263,10265,10267,10269,10271],{"class":1052,"line":1937},[1050,10258,1389],{"class":1063},[1050,10260,1399],{"class":1395},[1050,10262,2521],{"class":1067},[1050,10264,1072],{"class":1071},[1050,10266,1557],{"class":1425},[1050,10268,1072],{"class":1071},[1050,10270,7053],{"class":1425},[1050,10272,1257],{"class":1071},[1050,10274,10275,10277],{"class":1052,"line":1943},[1050,10276,1813],{"class":1063},[1050,10278,2708],{"class":1402},[1050,10280,10281],{"class":1052,"line":1974},[1050,10282,1334],{"class":1067},[1050,10284,10285,10288,10290,10292,10294,10296,10298,10300,10302,10304,10306,10308,10310],{"class":1052,"line":1979},[1050,10286,10287],{"class":1067},"        session_security ",[1050,10289,1349],{"class":1071},[1050,10291,2521],{"class":1067},[1050,10293,1072],{"class":1071},[1050,10295,1473],{"class":1425},[1050,10297,1072],{"class":1071},[1050,10299,2532],{"class":1352},[1050,10301,1300],{"class":1071},[1050,10303,1480],{"class":1479},[1050,10305,9861],{"class":1483},[1050,10307,1480],{"class":1479},[1050,10309,1089],{"class":1071},[1050,10311,10312],{"class":1071}," {})\n",[1050,10314,10315],{"class":1052,"line":1994},[1050,10316,1334],{"class":1067},[1050,10318,10319],{"class":1052,"line":2007},[1050,10320,10321],{"class":1056},"        # Check IP address consistency\n",[1050,10323,10324,10327,10329,10332,10334,10336,10338,10340,10342,10344],{"class":1052,"line":2013},[1050,10325,10326],{"class":1067},"        stored_ip ",[1050,10328,1349],{"class":1071},[1050,10330,10331],{"class":1067}," session_security",[1050,10333,1072],{"class":1071},[1050,10335,2532],{"class":1352},[1050,10337,1300],{"class":1071},[1050,10339,1480],{"class":1479},[1050,10341,2561],{"class":1483},[1050,10343,1480],{"class":1479},[1050,10345,1378],{"class":1071},[1050,10347,10348,10350,10352,10354,10356,10358,10360,10362,10364,10366,10368,10370],{"class":1052,"line":2032},[1050,10349,5340],{"class":1067},[1050,10351,1349],{"class":1071},[1050,10353,2521],{"class":1067},[1050,10355,1072],{"class":1071},[1050,10357,2527],{"class":2526},[1050,10359,1072],{"class":1071},[1050,10361,2532],{"class":1352},[1050,10363,1300],{"class":1071},[1050,10365,1480],{"class":1479},[1050,10367,2539],{"class":1483},[1050,10369,1480],{"class":1479},[1050,10371,1378],{"class":1071},[1050,10373,10374],{"class":1052,"line":2049},[1050,10375,1334],{"class":1067},[1050,10377,10378,10380,10383,10385,10387,10389,10391],{"class":1052,"line":2054},[1050,10379,1389],{"class":1063},[1050,10381,10382],{"class":1067}," stored_ip ",[1050,10384,5382],{"class":1395},[1050,10386,10382],{"class":1067},[1050,10388,5387],{"class":1395},[1050,10390,5390],{"class":1067},[1050,10392,1257],{"class":1071},[1050,10394,10395],{"class":1052,"line":2060},[1050,10396,10397],{"class":1056},"            # IP changed - potential session hijacking\n",[1050,10399,10400,10402],{"class":1052,"line":2075},[1050,10401,1813],{"class":1063},[1050,10403,2694],{"class":1402},[1050,10405,10406],{"class":1052,"line":2080},[1050,10407,1334],{"class":1067},[1050,10409,10410],{"class":1052,"line":2086},[1050,10411,10412],{"class":1056},"        # Check user agent consistency\n",[1050,10414,10415,10418,10420,10422,10424,10426,10428,10430,10432,10434],{"class":1052,"line":2095},[1050,10416,10417],{"class":1067},"        stored_ua_hash ",[1050,10419,1349],{"class":1071},[1050,10421,10331],{"class":1067},[1050,10423,1072],{"class":1071},[1050,10425,2532],{"class":1352},[1050,10427,1300],{"class":1071},[1050,10429,1480],{"class":1479},[1050,10431,3425],{"class":1483},[1050,10433,1480],{"class":1479},[1050,10435,1378],{"class":1071},[1050,10437,10438,10441,10443,10445,10447,10449],{"class":1052,"line":2136},[1050,10439,10440],{"class":1067},"        current_ua_hash ",[1050,10442,1349],{"class":1071},[1050,10444,3432],{"class":1067},[1050,10446,1072],{"class":1071},[1050,10448,3437],{"class":1352},[1050,10450,3068],{"class":1071},[1050,10452,10453,10455,10457,10459,10461,10463,10465,10467,10469,10471,10473,10475,10477,10479],{"class":1052,"line":2144},[1050,10454,3607],{"class":1352},[1050,10456,1072],{"class":1071},[1050,10458,2527],{"class":2526},[1050,10460,1072],{"class":1071},[1050,10462,2532],{"class":1352},[1050,10464,1300],{"class":1071},[1050,10466,1480],{"class":1479},[1050,10468,2838],{"class":1483},[1050,10470,1480],{"class":1479},[1050,10472,1089],{"class":1071},[1050,10474,2845],{"class":1479},[1050,10476,3467],{"class":1071},[1050,10478,3470],{"class":1352},[1050,10480,1509],{"class":1071},[1050,10482,10483,10486,10488],{"class":1052,"line":2167},[1050,10484,10485],{"class":1071},"        ).",[1050,10487,3481],{"class":1352},[1050,10489,1509],{"class":1071},[1050,10491,10492],{"class":1052,"line":2172},[1050,10493,1334],{"class":1067},[1050,10495,10496,10498,10501,10503,10505,10507,10510],{"class":1052,"line":2178},[1050,10497,1389],{"class":1063},[1050,10499,10500],{"class":1067}," stored_ua_hash ",[1050,10502,5382],{"class":1395},[1050,10504,10500],{"class":1067},[1050,10506,5387],{"class":1395},[1050,10508,10509],{"class":1067}," current_ua_hash",[1050,10511,1257],{"class":1071},[1050,10513,10514],{"class":1052,"line":2199},[1050,10515,10516],{"class":1056},"            # User agent changed - potential session hijacking\n",[1050,10518,10519,10521],{"class":1052,"line":2204},[1050,10520,1813],{"class":1063},[1050,10522,2694],{"class":1402},[1050,10524,10525],{"class":1052,"line":2210},[1050,10526,1334],{"class":1067},[1050,10528,10529,10531],{"class":1052,"line":2240},[1050,10530,2705],{"class":1063},[1050,10532,2708],{"class":1402},[1050,10534,10535],{"class":1052,"line":2245},[1050,10536,1277],{"class":1067},[1050,10538,10539,10541],{"class":1052,"line":2251},[1050,10540,1283],{"class":1071},[1050,10542,1287],{"class":1286},[1050,10544,10545,10547,10550,10552,10554],{"class":1052,"line":2271},[1050,10546,1293],{"class":1249},[1050,10548,10549],{"class":1296}," get_session_info",[1050,10551,1300],{"class":1071},[1050,10553,1304],{"class":1303},[1050,10555,1317],{"class":1071},[1050,10557,10558,10560,10563],{"class":1052,"line":2276},[1050,10559,1323],{"class":1263},[1050,10561,10562],{"class":1267},"Get comprehensive session information",[1050,10564,1271],{"class":1263},[1050,10566,10567],{"class":1052,"line":2320},[1050,10568,1334],{"class":1067},[1050,10570,10571,10573,10575,10577,10579,10581,10583,10585],{"class":1052,"line":2327},[1050,10572,1389],{"class":1063},[1050,10574,1399],{"class":1395},[1050,10576,2521],{"class":1067},[1050,10578,1072],{"class":1071},[1050,10580,1557],{"class":1425},[1050,10582,1072],{"class":1071},[1050,10584,7053],{"class":1425},[1050,10586,1257],{"class":1071},[1050,10588,10589,10591],{"class":1052,"line":2369},[1050,10590,1813],{"class":1063},[1050,10592,10593],{"class":1402}," None\n",[1050,10595,10596],{"class":1052,"line":2385},[1050,10597,1334],{"class":1067},[1050,10599,10600,10602,10604,10606,10608,10610,10612,10614,10616,10618,10620,10622,10624],{"class":1052,"line":2392},[1050,10601,10287],{"class":1067},[1050,10603,1349],{"class":1071},[1050,10605,2521],{"class":1067},[1050,10607,1072],{"class":1071},[1050,10609,1473],{"class":1425},[1050,10611,1072],{"class":1071},[1050,10613,2532],{"class":1352},[1050,10615,1300],{"class":1071},[1050,10617,1480],{"class":1479},[1050,10619,9861],{"class":1483},[1050,10621,1480],{"class":1479},[1050,10623,1089],{"class":1071},[1050,10625,10312],{"class":1071},[1050,10627,10628],{"class":1052,"line":2398},[1050,10629,1334],{"class":1067},[1050,10631,10632,10634],{"class":1052,"line":2419},[1050,10633,2705],{"class":1063},[1050,10635,1534],{"class":1071},[1050,10637,10638,10640,10642,10644,10646,10648,10650,10652,10654,10656],{"class":1052,"line":2435},[1050,10639,3365],{"class":1479},[1050,10641,7642],{"class":1483},[1050,10643,1480],{"class":1479},[1050,10645,1548],{"class":1071},[1050,10647,2521],{"class":1067},[1050,10649,1072],{"class":1071},[1050,10651,1473],{"class":1425},[1050,10653,1072],{"class":1071},[1050,10655,7642],{"class":1425},[1050,10657,1615],{"class":1071},[1050,10659,10660,10662,10664,10666,10668,10670,10672,10674,10676,10678],{"class":1052,"line":2440},[1050,10661,3365],{"class":1479},[1050,10663,3491],{"class":1483},[1050,10665,1480],{"class":1479},[1050,10667,1548],{"class":1071},[1050,10669,2521],{"class":1067},[1050,10671,1072],{"class":1071},[1050,10673,1557],{"class":1425},[1050,10675,1072],{"class":1071},[1050,10677,3502],{"class":1425},[1050,10679,1615],{"class":1071},[1050,10681,10682,10684,10686,10688,10690,10692,10694,10696,10698,10700],{"class":1052,"line":2447},[1050,10683,3365],{"class":1479},[1050,10685,1366],{"class":1483},[1050,10687,1480],{"class":1479},[1050,10689,1548],{"class":1071},[1050,10691,2521],{"class":1067},[1050,10693,1072],{"class":1071},[1050,10695,1557],{"class":1425},[1050,10697,1072],{"class":1071},[1050,10699,1366],{"class":1425},[1050,10701,1615],{"class":1071},[1050,10703,10704,10706,10708,10710,10712,10714,10716,10718,10720,10722,10724,10726,10728,10730],{"class":1052,"line":2465},[1050,10705,3365],{"class":1479},[1050,10707,1484],{"class":1483},[1050,10709,1480],{"class":1479},[1050,10711,1548],{"class":1071},[1050,10713,2521],{"class":1067},[1050,10715,1072],{"class":1071},[1050,10717,1473],{"class":1425},[1050,10719,1072],{"class":1071},[1050,10721,2532],{"class":1352},[1050,10723,1300],{"class":1071},[1050,10725,1480],{"class":1479},[1050,10727,1484],{"class":1483},[1050,10729,1480],{"class":1479},[1050,10731,3417],{"class":1071},[1050,10733,10734,10736,10738,10740,10742,10744,10746,10748,10750,10752,10754,10756],{"class":1052,"line":2475},[1050,10735,3365],{"class":1479},[1050,10737,2561],{"class":1483},[1050,10739,1480],{"class":1479},[1050,10741,1548],{"class":1071},[1050,10743,10331],{"class":1067},[1050,10745,1072],{"class":1071},[1050,10747,2532],{"class":1352},[1050,10749,1300],{"class":1071},[1050,10751,1480],{"class":1479},[1050,10753,2561],{"class":1483},[1050,10755,1480],{"class":1479},[1050,10757,3417],{"class":1071},[1050,10759,10760,10762,10764,10766,10768,10770,10772,10774,10776,10778,10780,10782,10784,10786,10788,10790,10792,10794],{"class":1052,"line":2480},[1050,10761,3365],{"class":1479},[1050,10763,3108],{"class":1483},[1050,10765,1480],{"class":1479},[1050,10767,1548],{"class":1071},[1050,10769,2521],{"class":1067},[1050,10771,1072],{"class":1071},[1050,10773,2527],{"class":2526},[1050,10775,1072],{"class":1071},[1050,10777,2532],{"class":1352},[1050,10779,1300],{"class":1071},[1050,10781,1480],{"class":1479},[1050,10783,2838],{"class":1483},[1050,10785,1480],{"class":1479},[1050,10787,1089],{"class":1071},[1050,10789,2845],{"class":1479},[1050,10791,4013],{"class":1071},[1050,10793,3114],{"class":2112},[1050,10795,4019],{"class":1071},[1050,10797,10798,10800,10803,10805,10807,10809,10811,10813,10815,10818],{"class":1052,"line":2502},[1050,10799,3365],{"class":1479},[1050,10801,10802],{"class":1483},"expires_at",[1050,10804,1480],{"class":1479},[1050,10806,1548],{"class":1071},[1050,10808,2521],{"class":1067},[1050,10810,1072],{"class":1071},[1050,10812,1473],{"class":1425},[1050,10814,1072],{"class":1071},[1050,10816,10817],{"class":1352},"get_expiry_date",[1050,10819,3384],{"class":1071},[1050,10821,10822,10824,10827,10829,10831,10833,10835,10837],{"class":1052,"line":2507},[1050,10823,3365],{"class":1479},[1050,10825,10826],{"class":1483},"is_secure",[1050,10828,1480],{"class":1479},[1050,10830,1548],{"class":1071},[1050,10832,2521],{"class":1067},[1050,10834,1072],{"class":1071},[1050,10836,10826],{"class":1352},[1050,10838,3384],{"class":1071},[1050,10840,10841],{"class":1052,"line":2513},[1050,10842,4065],{"class":1071},[1050,10844,10845],{"class":1052,"line":2546},[1050,10846,1277],{"class":1067},[1050,10848,10849,10851],{"class":1052,"line":2568},[1050,10850,1283],{"class":1071},[1050,10852,1287],{"class":1286},[1050,10854,10855,10857,10860],{"class":1052,"line":2595},[1050,10856,1293],{"class":1249},[1050,10858,10859],{"class":1296}," cleanup_expired_sessions",[1050,10861,6504],{"class":1071},[1050,10863,10864,10866,10869],{"class":1052,"line":2600},[1050,10865,1323],{"class":1263},[1050,10867,10868],{"class":1267},"Clean up expired sessions (run as management command)",[1050,10870,1271],{"class":1263},[1050,10872,10873],{"class":1052,"line":2606},[1050,10874,1334],{"class":1067},[1050,10876,10877,10879,10881,10883,10885,10887,10889,10891,10893,10895],{"class":1052,"line":2627},[1050,10878,2483],{"class":1063},[1050,10880,1068],{"class":1067},[1050,10882,1072],{"class":1071},[1050,10884,1075],{"class":1067},[1050,10886,1072],{"class":1071},[1050,10888,9291],{"class":1067},[1050,10890,1072],{"class":1071},[1050,10892,8093],{"class":1067},[1050,10894,1083],{"class":1063},[1050,10896,9300],{"class":1067},[1050,10898,10899,10901,10903,10905,10907,10909,10912,10914,10917,10919],{"class":1052,"line":2652},[1050,10900,2483],{"class":1063},[1050,10902,1068],{"class":1067},[1050,10904,1072],{"class":1071},[1050,10906,2490],{"class":1067},[1050,10908,1072],{"class":1071},[1050,10910,10911],{"class":1067},"management",[1050,10913,1072],{"class":1071},[1050,10915,10916],{"class":1067},"base ",[1050,10918,1083],{"class":1063},[1050,10920,10921],{"class":1067}," BaseCommand\n",[1050,10923,10924],{"class":1052,"line":2657},[1050,10925,1334],{"class":1067},[1050,10927,10928,10931,10934,10936,10939],{"class":1052,"line":2663},[1050,10929,10930],{"class":1249},"        class",[1050,10932,10933],{"class":1253}," Command",[1050,10935,1300],{"class":1071},[1050,10937,10938],{"class":4331},"BaseCommand",[1050,10940,1317],{"class":1071},[1050,10942,10943,10946,10948,10950,10953],{"class":1052,"line":2689},[1050,10944,10945],{"class":1551},"            help",[1050,10947,1492],{"class":1071},[1050,10949,1567],{"class":1479},[1050,10951,10952],{"class":1483},"Clean up expired sessions",[1050,10954,4365],{"class":1479},[1050,10956,10957],{"class":1052,"line":2697},[1050,10958,4929],{"class":1067},[1050,10960,10961,10964,10967,10969,10971,10973,10975,10977,10979,10981,10984],{"class":1052,"line":2702},[1050,10962,10963],{"class":1249},"            def",[1050,10965,10966],{"class":1296}," handle",[1050,10968,1300],{"class":1071},[1050,10970,4433],{"class":4432},[1050,10972,1089],{"class":1071},[1050,10974,2116],{"class":1395},[1050,10976,4444],{"class":1303},[1050,10978,1089],{"class":1071},[1050,10980,4449],{"class":1395},[1050,10982,10983],{"class":1303},"options",[1050,10985,1317],{"class":1071},[1050,10987,10988,10991,10993,10995,10997,10999,11001,11003],{"class":1052,"line":2711},[1050,10989,10990],{"class":1067},"                expired_sessions ",[1050,10992,1349],{"class":1071},[1050,10994,9330],{"class":1067},[1050,10996,1072],{"class":1071},[1050,10998,6332],{"class":1425},[1050,11000,1072],{"class":1071},[1050,11002,8112],{"class":1352},[1050,11004,3068],{"class":1071},[1050,11006,11007,11010,11012,11014,11016,11018],{"class":1052,"line":2716},[1050,11008,11009],{"class":1361},"                    expire_date__lt",[1050,11011,1349],{"class":1071},[1050,11013,3740],{"class":1352},[1050,11015,1072],{"class":1071},[1050,11017,1500],{"class":1352},[1050,11019,1509],{"class":1071},[1050,11021,11022],{"class":1052,"line":2723},[1050,11023,4994],{"class":1071},[1050,11025,11026],{"class":1052,"line":2741},[1050,11027,1456],{"class":1067},[1050,11029,11030,11033,11035,11038,11040,11043],{"class":1052,"line":2751},[1050,11031,11032],{"class":1067},"                count ",[1050,11034,1349],{"class":1071},[1050,11036,11037],{"class":1067}," expired_sessions",[1050,11039,1072],{"class":1071},[1050,11041,11042],{"class":1352},"count",[1050,11044,1509],{"class":1071},[1050,11046,11047,11050,11052,11054],{"class":1052,"line":2756},[1050,11048,11049],{"class":1067},"                expired_sessions",[1050,11051,1072],{"class":1071},[1050,11053,3275],{"class":1352},[1050,11055,1509],{"class":1071},[1050,11057,11058],{"class":1052,"line":2775},[1050,11059,1456],{"class":1067},[1050,11061,11062,11065,11067,11070,11072,11075],{"class":1052,"line":2784},[1050,11063,11064],{"class":4790},"                self",[1050,11066,1072],{"class":1071},[1050,11068,11069],{"class":1425},"stdout",[1050,11071,1072],{"class":1071},[1050,11073,11074],{"class":1352},"write",[1050,11076,3068],{"class":1071},[1050,11078,11079,11081,11083,11086,11088,11091],{"class":1052,"line":2789},[1050,11080,4971],{"class":4790},[1050,11082,1072],{"class":1071},[1050,11084,11085],{"class":1425},"style",[1050,11087,1072],{"class":1071},[1050,11089,11090],{"class":1352},"SUCCESS",[1050,11092,3068],{"class":1071},[1050,11094,11095,11098,11101,11103,11105,11107],{"class":1052,"line":2816},[1050,11096,11097],{"class":1249},"                        f",[1050,11099,11100],{"class":1483},"'Successfully cleaned up ",[1050,11102,2292],{"class":2291},[1050,11104,11042],{"class":1352},[1050,11106,2314],{"class":2291},[1050,11108,11109],{"class":1483}," expired sessions'\n",[1050,11111,11112],{"class":1052,"line":2850},[1050,11113,11114],{"class":1071},"                    )\n",[1050,11116,11117],{"class":1052,"line":2855},[1050,11118,4994],{"class":1071},[1050,11120,11121],{"class":1052,"line":2861},[1050,11122,1334],{"class":1067},[1050,11124,11125,11127],{"class":1052,"line":2880},[1050,11126,2705],{"class":1063},[1050,11128,11129],{"class":1067}," Command\n",[1050,11131,11132],{"class":1052,"line":2899},[1050,11133,1243],{"emptyLinePlaceholder":1242},[1050,11135,11136],{"class":1052,"line":2904},[1050,11137,11138],{"class":1056},"# Session security middleware\n",[1050,11140,11141,11143,11146],{"class":1052,"line":2933},[1050,11142,1250],{"class":1249},[1050,11144,11145],{"class":1253}," SessionSecurityMiddleware",[1050,11147,1257],{"class":1071},[1050,11149,11150,11152,11155],{"class":1052,"line":2960},[1050,11151,1264],{"class":1263},[1050,11153,11154],{"class":1267},"Middleware to enforce session security",[1050,11156,1271],{"class":1263},[1050,11158,11159],{"class":1052,"line":2965},[1050,11160,1277],{"class":1067},[1050,11162,11163,11165,11168,11170,11172,11174,11177],{"class":1052,"line":2995},[1050,11164,1293],{"class":1249},[1050,11166,11167],{"class":1551}," __init__",[1050,11169,1300],{"class":1071},[1050,11171,4433],{"class":4432},[1050,11173,1089],{"class":1071},[1050,11175,11176],{"class":1303}," get_response",[1050,11178,1317],{"class":1071},[1050,11180,11181,11183,11185,11188,11190],{"class":1052,"line":3019},[1050,11182,5573],{"class":4790},[1050,11184,1072],{"class":1071},[1050,11186,11187],{"class":1425},"get_response",[1050,11189,1492],{"class":1071},[1050,11191,11192],{"class":1067}," get_response\n",[1050,11194,11195],{"class":1052,"line":3024},[1050,11196,1277],{"class":1067},[1050,11198,11199,11201,11204,11206,11208,11210,11212],{"class":1052,"line":3030},[1050,11200,1293],{"class":1249},[1050,11202,11203],{"class":1551}," __call__",[1050,11205,1300],{"class":1071},[1050,11207,4433],{"class":4432},[1050,11209,1089],{"class":1071},[1050,11211,2521],{"class":1303},[1050,11213,1317],{"class":1071},[1050,11215,11216],{"class":1052,"line":3057},[1050,11217,11218],{"class":1056},"        # Validate session security before processing request\n",[1050,11220,11221,11223,11225,11227,11229,11231,11233,11235,11237,11239,11241,11243,11245,11247,11249,11251],{"class":1052,"line":3071},[1050,11222,1389],{"class":1063},[1050,11224,1589],{"class":1551},[1050,11226,1300],{"class":1071},[1050,11228,1304],{"class":1352},[1050,11230,1089],{"class":1071},[1050,11232,1567],{"class":1479},[1050,11234,1557],{"class":1483},[1050,11236,1480],{"class":1479},[1050,11238,1583],{"class":1071},[1050,11240,5156],{"class":1395},[1050,11242,2521],{"class":1067},[1050,11244,1072],{"class":1071},[1050,11246,1557],{"class":1425},[1050,11248,1072],{"class":1071},[1050,11250,7053],{"class":1425},[1050,11252,1257],{"class":1071},[1050,11254,11255,11257,11259,11261,11263,11266,11268,11270],{"class":1052,"line":3089},[1050,11256,1417],{"class":1063},[1050,11258,1399],{"class":1395},[1050,11260,9695],{"class":1067},[1050,11262,1072],{"class":1071},[1050,11264,11265],{"class":1352},"validate_session_security",[1050,11267,1300],{"class":1071},[1050,11269,1304],{"class":1352},[1050,11271,1317],{"class":1071},[1050,11273,11274],{"class":1052,"line":3123},[1050,11275,11276],{"class":1056},"                # Session security compromised\n",[1050,11278,11279,11282,11284,11286],{"class":1052,"line":3129},[1050,11280,11281],{"class":1352},"                logout",[1050,11283,1300],{"class":1071},[1050,11285,1304],{"class":1352},[1050,11287,1378],{"class":1071},[1050,11289,11290],{"class":1052,"line":3134},[1050,11291,1456],{"class":1067},[1050,11293,11294,11296,11298,11300],{"class":1052,"line":3141},[1050,11295,4959],{"class":1067},[1050,11297,1072],{"class":1071},[1050,11299,3065],{"class":1352},[1050,11301,3068],{"class":1071},[1050,11303,11304,11306],{"class":1052,"line":3159},[1050,11305,2098],{"class":1352},[1050,11307,1615],{"class":1071},[1050,11309,11310,11312,11315],{"class":1052,"line":3169},[1050,11311,1540],{"class":1479},[1050,11313,11314],{"class":1483},"Your session was terminated for security reasons. Please log in again.",[1050,11316,4365],{"class":1479},[1050,11318,11319],{"class":1052,"line":3174},[1050,11320,4994],{"class":1071},[1050,11322,11323],{"class":1052,"line":3193},[1050,11324,1456],{"class":1067},[1050,11326,11327,11329,11331,11333,11335,11337,11339],{"class":1052,"line":3198},[1050,11328,1760],{"class":1063},[1050,11330,5827],{"class":1352},[1050,11332,1300],{"class":1071},[1050,11334,1480],{"class":1479},[1050,11336,6085],{"class":1483},[1050,11338,1480],{"class":1479},[1050,11340,1378],{"class":1071},[1050,11342,11343],{"class":1052,"line":3225},[1050,11344,1334],{"class":1067},[1050,11346,11347,11350,11352,11354,11356,11358,11360,11362],{"class":1052,"line":3244},[1050,11348,11349],{"class":1067},"        response ",[1050,11351,1349],{"class":1071},[1050,11353,4791],{"class":4790},[1050,11355,1072],{"class":1071},[1050,11357,11187],{"class":1352},[1050,11359,1300],{"class":1071},[1050,11361,1304],{"class":1352},[1050,11363,1378],{"class":1071},[1050,11365,11366],{"class":1052,"line":3263},[1050,11367,1334],{"class":1067},[1050,11369,11370],{"class":1052,"line":3268},[1050,11371,11372],{"class":1056},"        # Update session security info after successful request\n",[1050,11374,11375,11377,11379,11381,11383,11385,11387,11389,11391,11393,11395,11397,11399,11401,11403,11405,11407,11409],{"class":1052,"line":3284},[1050,11376,1389],{"class":1063},[1050,11378,5912],{"class":1071},[1050,11380,5915],{"class":1551},[1050,11382,1300],{"class":1071},[1050,11384,1304],{"class":1352},[1050,11386,1089],{"class":1071},[1050,11388,1567],{"class":1479},[1050,11390,1557],{"class":1483},[1050,11392,1480],{"class":1479},[1050,11394,1583],{"class":1071},[1050,11396,5156],{"class":1395},[1050,11398,2521],{"class":1067},[1050,11400,1072],{"class":1071},[1050,11402,1557],{"class":1425},[1050,11404,1072],{"class":1071},[1050,11406,7053],{"class":1425},[1050,11408,5156],{"class":1395},[1050,11410,5934],{"class":1067},[1050,11412,11413,11415,11417,11419,11421,11423,11425,11427],{"class":1052,"line":3299},[1050,11414,3607],{"class":1067},[1050,11416,1072],{"class":1071},[1050,11418,6419],{"class":1425},[1050,11420,6422],{"class":1395},[1050,11422,1567],{"class":1479},[1050,11424,4800],{"class":1483},[1050,11426,1480],{"class":1479},[1050,11428,1317],{"class":1071},[1050,11430,11431],{"class":1052,"line":3304},[1050,11432,4929],{"class":1067},[1050,11434,11435,11438,11440,11442,11444,11446,11448,11450,11452,11454,11456,11458,11460],{"class":1052,"line":3311},[1050,11436,11437],{"class":1067},"            session_security ",[1050,11439,1349],{"class":1071},[1050,11441,2521],{"class":1067},[1050,11443,1072],{"class":1071},[1050,11445,1473],{"class":1425},[1050,11447,1072],{"class":1071},[1050,11449,2532],{"class":1352},[1050,11451,1300],{"class":1071},[1050,11453,1480],{"class":1479},[1050,11455,9861],{"class":1483},[1050,11457,1480],{"class":1479},[1050,11459,1089],{"class":1071},[1050,11461,10312],{"class":1071},[1050,11463,11464,11467,11469,11471,11474,11476,11478,11480,11482,11484,11486,11488,11490],{"class":1052,"line":3329},[1050,11465,11466],{"class":1067},"            session_security",[1050,11468,1476],{"class":1071},[1050,11470,1480],{"class":1479},[1050,11472,11473],{"class":1483},"last_activity",[1050,11475,1480],{"class":1479},[1050,11477,1489],{"class":1071},[1050,11479,1492],{"class":1071},[1050,11481,1495],{"class":1067},[1050,11483,1072],{"class":1071},[1050,11485,1500],{"class":1352},[1050,11487,1503],{"class":1071},[1050,11489,1506],{"class":1352},[1050,11491,1509],{"class":1071},[1050,11493,11494,11496,11498,11500,11502,11504,11506,11508,11510,11512],{"class":1052,"line":3339},[1050,11495,3607],{"class":1067},[1050,11497,1072],{"class":1071},[1050,11499,1473],{"class":1425},[1050,11501,1476],{"class":1071},[1050,11503,1480],{"class":1479},[1050,11505,9861],{"class":1483},[1050,11507,1480],{"class":1479},[1050,11509,1489],{"class":1071},[1050,11511,1492],{"class":1071},[1050,11513,11514],{"class":1067}," session_security\n",[1050,11516,11517],{"class":1052,"line":3344},[1050,11518,1334],{"class":1067},[1050,11520,11521,11523],{"class":1052,"line":3362},[1050,11522,2705],{"class":1063},[1050,11524,11525],{"class":1067}," response\n",[1050,11527,11528],{"class":1052,"line":3387},[1050,11529,1243],{"emptyLinePlaceholder":1242},[1050,11531,11532],{"class":1052,"line":3420},[1050,11533,11534],{"class":1056},"# Remember me functionality\n",[1050,11536,11537,11539,11542],{"class":1052,"line":3442},[1050,11538,1250],{"class":1249},[1050,11540,11541],{"class":1253}," RememberMeManager",[1050,11543,1257],{"class":1071},[1050,11545,11546,11548,11551],{"class":1052,"line":3475},[1050,11547,1264],{"class":1263},[1050,11549,11550],{"class":1267},"Manage remember me functionality",[1050,11552,1271],{"class":1263},[1050,11554,11555],{"class":1052,"line":3486},[1050,11556,1277],{"class":1067},[1050,11558,11559,11561],{"class":1052,"line":3507},[1050,11560,1283],{"class":1071},[1050,11562,1287],{"class":1286},[1050,11564,11565,11567,11570,11572,11574],{"class":1052,"line":3526},[1050,11566,1293],{"class":1249},[1050,11568,11569],{"class":1296}," create_remember_token",[1050,11571,1300],{"class":1071},[1050,11573,1557],{"class":1303},[1050,11575,1317],{"class":1071},[1050,11577,11578,11580,11583],{"class":1052,"line":3546},[1050,11579,1323],{"class":1263},[1050,11581,11582],{"class":1267},"Create a remember me token",[1050,11584,1271],{"class":1263},[1050,11586,11587],{"class":1052,"line":3566},[1050,11588,1334],{"class":1067},[1050,11590,11591,11593],{"class":1052,"line":3572},[1050,11592,2778],{"class":1063},[1050,11594,11595],{"class":1067}," secrets\n",[1050,11597,11598],{"class":1052,"line":3577},[1050,11599,1334],{"class":1067},[1050,11601,11602],{"class":1052,"line":3583},[1050,11603,11604],{"class":1056},"        # Generate secure token\n",[1050,11606,11607,11609,11611,11614,11616,11619,11621,11624],{"class":1052,"line":3604},[1050,11608,6436],{"class":1067},[1050,11610,1349],{"class":1071},[1050,11612,11613],{"class":1067}," secrets",[1050,11615,1072],{"class":1071},[1050,11617,11618],{"class":1352},"token_urlsafe",[1050,11620,1300],{"class":1071},[1050,11622,11623],{"class":2112},"32",[1050,11625,1378],{"class":1071},[1050,11627,11628],{"class":1052,"line":3628},[1050,11629,1334],{"class":1067},[1050,11631,11632],{"class":1052,"line":3682},[1050,11633,11634],{"class":1056},"        # Store token (you'd need a RememberToken model)\n",[1050,11636,11637,11639],{"class":1052,"line":3735},[1050,11638,8078],{"class":1063},[1050,11640,1257],{"class":1071},[1050,11642,11643,11645,11647,11649,11651,11653],{"class":1052,"line":3797},[1050,11644,8085],{"class":1063},[1050,11646,8088],{"class":1067},[1050,11648,1072],{"class":1071},[1050,11650,8093],{"class":1067},[1050,11652,1083],{"class":1063},[1050,11654,8098],{"class":1067},[1050,11656,11657],{"class":1052,"line":3803},[1050,11658,4929],{"class":1067},[1050,11660,11661,11663,11665,11667,11669,11672],{"class":1052,"line":3808},[1050,11662,8103],{"class":1067},[1050,11664,1072],{"class":1071},[1050,11666,6332],{"class":1425},[1050,11668,1072],{"class":1071},[1050,11670,11671],{"class":1352},"create",[1050,11673,3068],{"class":1071},[1050,11675,11676,11678,11680,11682],{"class":1052,"line":3815},[1050,11677,1707],{"class":1361},[1050,11679,1349],{"class":1071},[1050,11681,1557],{"class":1352},[1050,11683,1615],{"class":1071},[1050,11685,11686,11689,11691,11693],{"class":1052,"line":3850},[1050,11687,11688],{"class":1361},"                token",[1050,11690,1349],{"class":1071},[1050,11692,6455],{"class":1352},[1050,11694,1615],{"class":1071},[1050,11696,11697,11700,11702,11704,11706,11708,11710,11712,11714,11716,11718,11720,11722],{"class":1052,"line":3860},[1050,11698,11699],{"class":1361},"                expires_at",[1050,11701,1349],{"class":1071},[1050,11703,3740],{"class":1352},[1050,11705,1072],{"class":1071},[1050,11707,1500],{"class":1352},[1050,11709,2302],{"class":1071},[1050,11711,2927],{"class":1395},[1050,11713,6207],{"class":1352},[1050,11715,1300],{"class":1071},[1050,11717,5220],{"class":1361},[1050,11719,1349],{"class":1071},[1050,11721,2113],{"class":2112},[1050,11723,1378],{"class":1071},[1050,11725,11726],{"class":1052,"line":3865},[1050,11727,11728],{"class":1071},"            )\n",[1050,11730,11731],{"class":1052,"line":3872},[1050,11732,4929],{"class":1067},[1050,11734,11735,11737],{"class":1052,"line":3877},[1050,11736,1813],{"class":1063},[1050,11738,11739],{"class":1067}," token\n",[1050,11741,11742,11744,11746],{"class":1052,"line":3901},[1050,11743,8131],{"class":1063},[1050,11745,6957],{"class":1286},[1050,11747,1257],{"class":1071},[1050,11749,11750,11752],{"class":1052,"line":3906},[1050,11751,1813],{"class":1063},[1050,11753,10593],{"class":1402},[1050,11755,11756],{"class":1052,"line":3916},[1050,11757,1277],{"class":1067},[1050,11759,11760,11762],{"class":1052,"line":3949},[1050,11761,1283],{"class":1071},[1050,11763,1287],{"class":1286},[1050,11765,11766,11768,11771,11773,11775],{"class":1052,"line":3980},[1050,11767,1293],{"class":1249},[1050,11769,11770],{"class":1296}," validate_remember_token",[1050,11772,1300],{"class":1071},[1050,11774,6455],{"class":1303},[1050,11776,1317],{"class":1071},[1050,11778,11779,11781,11784],{"class":1052,"line":4022},[1050,11780,1323],{"class":1263},[1050,11782,11783],{"class":1267},"Validate and use remember me token",[1050,11785,1271],{"class":1263},[1050,11787,11788],{"class":1052,"line":4038},[1050,11789,1334],{"class":1067},[1050,11791,11792,11794],{"class":1052,"line":4062},[1050,11793,8078],{"class":1063},[1050,11795,1257],{"class":1071},[1050,11797,11798,11800,11802,11804,11806,11808],{"class":1052,"line":4068},[1050,11799,8085],{"class":1063},[1050,11801,8088],{"class":1067},[1050,11803,1072],{"class":1071},[1050,11805,8093],{"class":1067},[1050,11807,1083],{"class":1063},[1050,11809,8098],{"class":1067},[1050,11811,11812],{"class":1052,"line":4073},[1050,11813,4929],{"class":1067},[1050,11815,11816,11819,11821,11824,11826,11828,11830,11832],{"class":1052,"line":4082},[1050,11817,11818],{"class":1067},"            remember_token ",[1050,11820,1349],{"class":1071},[1050,11822,11823],{"class":1067}," RememberToken",[1050,11825,1072],{"class":1071},[1050,11827,6332],{"class":1425},[1050,11829,1072],{"class":1071},[1050,11831,2532],{"class":1352},[1050,11833,3068],{"class":1071},[1050,11835,11836,11838,11840,11842],{"class":1052,"line":4104},[1050,11837,11688],{"class":1361},[1050,11839,1349],{"class":1071},[1050,11841,6455],{"class":1352},[1050,11843,1615],{"class":1071},[1050,11845,11846,11849,11851,11853,11855,11857],{"class":1052,"line":4109},[1050,11847,11848],{"class":1361},"                expires_at__gt",[1050,11850,1349],{"class":1071},[1050,11852,3740],{"class":1352},[1050,11854,1072],{"class":1071},[1050,11856,1500],{"class":1352},[1050,11858,1509],{"class":1071},[1050,11860,11861],{"class":1052,"line":4118},[1050,11862,11728],{"class":1071},[1050,11864,11865],{"class":1052,"line":4148},[1050,11866,4929],{"class":1067},[1050,11868,11869,11872,11874,11877,11879],{"class":1052,"line":4155},[1050,11870,11871],{"class":1067},"            user ",[1050,11873,1349],{"class":1071},[1050,11875,11876],{"class":1067}," remember_token",[1050,11878,1072],{"class":1071},[1050,11880,7287],{"class":1425},[1050,11882,11883],{"class":1052,"line":4181},[1050,11884,4929],{"class":1067},[1050,11886,11887],{"class":1052,"line":4186},[1050,11888,11889],{"class":1056},"            # Token is valid, but delete it (one-time use)\n",[1050,11891,11892,11895,11897,11899],{"class":1052,"line":4193},[1050,11893,11894],{"class":1067},"            remember_token",[1050,11896,1072],{"class":1071},[1050,11898,3275],{"class":1352},[1050,11900,1509],{"class":1071},[1050,11902,11903],{"class":1052,"line":4207},[1050,11904,4929],{"class":1067},[1050,11906,11907,11909],{"class":1052,"line":4217},[1050,11908,1813],{"class":1063},[1050,11910,11911],{"class":1067}," user\n",[1050,11913,11914,11916,11918,11921,11923,11925,11927,11929],{"class":1052,"line":4222},[1050,11915,8131],{"class":1063},[1050,11917,5912],{"class":1071},[1050,11919,11920],{"class":1286},"ImportError",[1050,11922,1089],{"class":1071},[1050,11924,11823],{"class":1067},[1050,11926,1072],{"class":1071},[1050,11928,6359],{"class":1425},[1050,11930,1317],{"class":1071},[1050,11932,11933,11935],{"class":1052,"line":4228},[1050,11934,1813],{"class":1063},[1050,11936,10593],{"class":1402},[1050,11938,11939],{"class":1052,"line":4234},[1050,11940,1277],{"class":1067},[1050,11942,11943,11945],{"class":1052,"line":4239},[1050,11944,1283],{"class":1071},[1050,11946,1287],{"class":1286},[1050,11948,11949,11951,11954],{"class":1052,"line":4258},[1050,11950,1293],{"class":1249},[1050,11952,11953],{"class":1296}," cleanup_expired_tokens",[1050,11955,6504],{"class":1071},[1050,11957,11958,11960,11963],{"class":1052,"line":4263},[1050,11959,1323],{"class":1263},[1050,11961,11962],{"class":1267},"Clean up expired remember me tokens",[1050,11964,1271],{"class":1263},[1050,11966,11967],{"class":1052,"line":4288},[1050,11968,1334],{"class":1067},[1050,11970,11971,11973],{"class":1052,"line":4310},[1050,11972,8078],{"class":1063},[1050,11974,1257],{"class":1071},[1050,11976,11977,11979,11981,11983,11985,11987],{"class":1052,"line":4315},[1050,11978,8085],{"class":1063},[1050,11980,8088],{"class":1067},[1050,11982,1072],{"class":1071},[1050,11984,8093],{"class":1067},[1050,11986,1083],{"class":1063},[1050,11988,8098],{"class":1067},[1050,11990,11991],{"class":1052,"line":4321},[1050,11992,4929],{"class":1067},[1050,11994,11995,11998,12000,12002,12004,12006,12008,12010],{"class":1052,"line":4337},[1050,11996,11997],{"class":1067},"            expired_count ",[1050,11999,1349],{"class":1071},[1050,12001,11823],{"class":1067},[1050,12003,1072],{"class":1071},[1050,12005,6332],{"class":1425},[1050,12007,1072],{"class":1071},[1050,12009,8112],{"class":1352},[1050,12011,3068],{"class":1071},[1050,12013,12014,12017,12019,12021,12023,12025],{"class":1052,"line":4347},[1050,12015,12016],{"class":1361},"                expires_at__lt",[1050,12018,1349],{"class":1071},[1050,12020,3740],{"class":1352},[1050,12022,1072],{"class":1071},[1050,12024,1500],{"class":1352},[1050,12026,1509],{"class":1071},[1050,12028,12029,12031,12033,12036,12038],{"class":1052,"line":4352},[1050,12030,3478],{"class":1071},[1050,12032,3275],{"class":1352},[1050,12034,12035],{"class":1071},"()[",[1050,12037,2159],{"class":2112},[1050,12039,6242],{"class":1071},[1050,12041,12042],{"class":1052,"line":4368},[1050,12043,4929],{"class":1067},[1050,12045,12046,12048],{"class":1052,"line":4378},[1050,12047,1813],{"class":1063},[1050,12049,12050],{"class":1067}," expired_count\n",[1050,12052,12053,12055,12057],{"class":1052,"line":4388},[1050,12054,8131],{"class":1063},[1050,12056,6957],{"class":1286},[1050,12058,1257],{"class":1071},[1050,12060,12061,12063],{"class":1052,"line":4393},[1050,12062,1813],{"class":1063},[1050,12064,9314],{"class":2112},[1026,12066,12067],{},"Implementing secure and user-friendly login and logout functionality requires careful attention to security details, user experience, and proper session management. By following these patterns and implementing comprehensive security measures, you can create authentication flows that protect users while providing a smooth experience.",[11085,12069,12070],{},"html pre.shiki code .s9Tkl, html code.shiki .s9Tkl{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#A0ADA0;--shiki-default-font-style:inherit;--shiki-dark:#758575DD;--shiki-dark-font-style:inherit}html pre.shiki code .siDh9, html code.shiki .siDh9{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#1E754F;--shiki-default-font-style:inherit;--shiki-dark:#4D9375;--shiki-dark-font-style:inherit}html pre.shiki code .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sD-vU, html code.shiki .sD-vU{--shiki-light:#E2931D;--shiki-default:#2E8F82;--shiki-dark:#5DA994}html pre.shiki code .sm7ve, html code.shiki .sm7ve{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#B5695977;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D77;--shiki-dark-font-style:inherit}html pre.shiki code .sVyVU, html code.shiki .sVyVU{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B56959;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D;--shiki-dark-font-style:inherit}html pre.shiki code .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sCyAa, html code.shiki .sCyAa{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .siWMO, html code.shiki .siWMO{--shiki-light:#6182B8;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sqOPj, html code.shiki .sqOPj{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B07D48;--shiki-default-font-style:inherit;--shiki-dark:#BD976A;--shiki-dark-font-style:inherit}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .sBPpx, html code.shiki .sBPpx{--shiki-light:#E53935;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sbYkP, html code.shiki .sbYkP{--shiki-light:#39ADB5;--shiki-default:#B5695977;--shiki-dark:#C98A7D77}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .s3h35, html code.shiki .s3h35{--shiki-light:#F76D47;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sFGJz, html code.shiki .sFGJz{--shiki-light:#E53935;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sRjD_, html code.shiki .sRjD_{--shiki-light:#E53935;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":1045,"searchDepth":1053,"depth":1060,"links":12072},[12073,12076,12079],{"id":1032,"depth":1060,"text":1033,"children":12074},[12075],{"id":1037,"depth":1100,"text":1038},{"id":6969,"depth":1060,"text":6970,"children":12077},[12078],{"id":6973,"depth":1100,"text":6974},{"id":9673,"depth":1060,"text":9674,"children":12080},[12081],{"id":9677,"depth":1100,"text":9678},"md",null,{},{"title":416,"description":1028},"cM4B2Zoazqzhwx4ahTV6rsoTAUk_O0iVhrtCzPdeWxs",[12088,12090],{"title":412,"path":413,"stem":414,"description":12089,"children":-1},"Django provides built-in authentication views for common authentication workflows like login, logout, password change, and password reset. Understanding how to use and customize these views enables you to implement secure authentication flows that meet your application's specific requirements.",{"title":420,"path":421,"stem":422,"description":12091,"children":-1},"Django's default User model works well for many applications, but often you'll need to customize user authentication to fit your specific requirements. Understanding how to create and implement custom user models enables you to build authentication systems tailored to your application's unique needs.",1772474928195]