diff --git a/backend/init_db.py b/backend/init_db.py index c5a71e9..13dc5ab 100644 --- a/backend/init_db.py +++ b/backend/init_db.py @@ -1,77 +1 @@ -""" -Database initialization script. -Creates the database tables and populates with initial family member data. -""" -import sys -from pathlib import Path - -# Add the app directory to the path -sys.path.append(str(Path(__file__).parent)) - -from app.core.database import engine, Base -from app.models.user import User -from app.models.chore import Chore -from app.models.meal import Meal -from app.core.security import get_password_hash -from sqlalchemy.orm import Session - -def init_database(): - """Initialize the database with tables and default data.""" - print("Creating database tables...") - Base.metadata.create_all(bind=engine) - print("āœ… Database tables created successfully!") - - # Create a session to add default users - db = Session(bind=engine) - - try: - # Check if users already exist - existing_user = db.query(User).first() - if existing_user: - print("āš ļø Database already contains users. Skipping initialization.") - return - - print("Adding default family members...") - - # Family members with default password "password123" - family_members = [ - {"username": "lou", "email": "lou@family.local", "full_name": "Lou", "is_admin": False}, - {"username": "jess", "email": "jess@family.local", "full_name": "Jess", "is_admin": True}, - {"username": "william", "email": "william@family.local", "full_name": "William", "is_admin": False}, - {"username": "xander", "email": "xander@family.local", "full_name": "Xander", "is_admin": False}, - {"username": "bella", "email": "bella@family.local", "full_name": "Bella", "is_admin": False}, - ] - - default_password = "password123" # Shorter password for bcrypt (max 72 bytes) - hashed_password = get_password_hash(default_password) - - for member_data in family_members: - user = User( - username=member_data["username"], - email=member_data["email"], - full_name=member_data["full_name"], - hashed_password=hashed_password, - is_admin=member_data["is_admin"], - is_active=True - ) - db.add(user) - - db.commit() - print("āœ… Family members added successfully!") - print("\nšŸ”‘ Default Login Credentials:") - print(" Username: jess (admin) | Password: password123") - print(" Username: lou | Password: password123") - print(" Username: william | Password: password123") - print(" Username: xander | Password: password123") - print(" Username: bella | Password: password123") - print("\nāš ļø Please change these passwords after first login!") - - except Exception as e: - print(f"āŒ Error initializing database: {e}") - db.rollback() - raise - finally: - db.close() - -if __name__ == "__main__": - init_database() +IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoiIiIKRGF0YWJhc2UgaW5pdGlhbGl6YXRpb24gc2NyaXB0IGZvciBGYW1pbHkgSHViLgpDcmVhdGVzIHRhYmxlcyBhbmQgcG9wdWxhdGVzIHdpdGggZGVtbyBkYXRhLgoiIiIKCmltcG9ydCBzeXMKZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCmZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lLCB0aW1lZGVsdGEKCiMgQWRkIHBhcmVudCBkaXJlY3RvcnkgdG8gcGF0aCB0byBpbXBvcnQgZnJvbSBhcHAKc3lzLnBhdGguaW5zZXJ0KDAsIHN0cihQYXRoKF9fZmlsZV9fKS5wYXJlbnQpKQoKZnJvbSBhcHAuY29yZS5kYXRhYmFzZSBpbXBvcnQgZW5naW5lLCBTZXNzaW9uTG9jYWwsIEJhc2UKZnJvbSBhcHAubW9kZWxzIGltcG9ydCBVc2VyLCBDaG9yZQpmcm9tIHBhc3NsaWIuY29udGV4dCBpbXBvcnQgQ3J5cHRDb250ZXh0Cgpwd2RfY29udGV4dCA9IENyeXB0Q29udGV4dChzY2hlbWVzPVsiYmNyeXB0Il0sIGRlcHJlY2F0ZWQ9ImF1dG8iKQoKZGVmIGluaXRfZGIoKToKICAgICIiIkluaXRpYWxpemUgdGhlIGRhdGFiYXNlIHdpdGggdGFibGVzIGFuZCBkZW1vIGRhdGEuIiIiCiAgICBwcmludCgi8J+agCBJbml0aWFsaXppbmcgRmFtaWx5IEh1YiBkYXRhYmFzZS4uLiIpCiAgICAKICAgICMgQ3JlYXRlIGFsbCB0YWJsZXMKICAgIHByaW50KCLwn5SnIENyZWF0aW5nIGRhdGFiYXNlIHRhYmxlcy4uLiIpCiAgICBCYXNlLm1ldGFkYXRhLmNyZWF0ZV9hbGwoYmluZD1lbmdpbmUpCiAgICAKICAgIGRiID0gU2Vzc2lvbkxvY2FsKCkKICAgIAogICAgdHJ5OgogICAgICAgICMgQ2hlY2sgaWYgZGF0YSBhbHJlYWR5IGV4aXN0cwogICAgICAgIGV4aXN0aW5nX3VzZXJzID0gZGIucXVlcnkoVXNlcikuY291bnQoKQogICAgICAgIGlmIGV4aXN0aW5nX3VzZXJzID4gMDoKICAgICAgICAgICAgcHJpbnQoZiLimqDvuI8gIERhdGFiYXNlIGFscmVhZHkgaGFzIHtleGlzdGluZ191c2Vyc30gdXNlcnMuIFNraXBwaW5nIGluaXRpYWxpemF0aW9uLiIpCiAgICAgICAgICAgIHByaW50KCIgICBUbyByZXNldCB0aGUgZGF0YWJhc2UsIGRlbGV0ZSB0aGUgZmlsZSBhbmQgcnVuIHRoaXMgc2NyaXB0IGFnYWluLiIpCiAgICAgICAgICAgIHJldHVybgogICAgICAgIAogICAgICAgICMgQ3JlYXRlIGRlbW8gdXNlcnMKICAgICAgICBwcmludCgiXG7wn5GlIENyZWF0aW5nIGRlbW8gdXNlcnMuLi4iKQogICAgICAgIHVzZXJzX2RhdGEgPSBbCiAgICAgICAgICAgIHsidXNlcm5hbWUiOiAiamVzcyIsICJlbWFpbCI6ICJqZXNzQGZhbWlseS5sb2NhbCIsICJmdWxsX25hbWUiOiAiSmVzcyIsICJpc19hZG1pbiI6IFRydWV9LAogICAgICAgICAgICB7InVzZXJuYW1lIjogImxvdSIsICJlbWFpbCI6ICJsb3VAZmFtaWx5LmxvY2FsIiwgImZ1bGxfbmFtZSI6ICJMb3UiLCAiaXNfYWRtaW4iOiBGYWxzZX0sCiAgICAgICAgICAgIHsidXNlcm5hbWUiOiAid2lsbGlhbSIsICJlbWFpbCI6ICJ3aWxsaWFtQGZhbWlseS5sb2NhbCIsICJmdWxsX25hbWUiOiAiV2lsbGlhbSIsICJpc19hZG1pbiI6IEZhbHNlfSwKICAgICAgICAgICAgeyJ1c2VybmFtZSI6ICJ4YW5kZXIiLCAiZW1haWwiOiAieGFuZGVyQGZhbWlseS5sb2NhbCIsICJmdWxsX25hbWUiOiAiWGFuZGVyIiwgImlzX2FkbWluIjogRmFsc2V9LAogICAgICAgICAgICB7InVzZXJuYW1lIjogImJlbGxhIiwgImVtYWlsIjogImJlbGxhQGZhbWlseS5sb2NhbCIsICJmdWxsX25hbWUiOiAiQmVsbGEiLCAiaXNfYWRtaW4iOiBGYWxzZX0sCiAgICAgICAgXQogICAgICAgIAogICAgICAgIHVzZXJzID0gW10KICAgICAgICBmb3IgdXNlcl9kYXRhIGluIHVzZXJzX2RhdGE6CiAgICAgICAgICAgIHVzZXIgPSBVc2VyKAogICAgICAgICAgICAgICAgdXNlcm5hbWU9dXNlcl9kYXRhWyJ1c2VybmFtZSJdLAogICAgICAgICAgICAgICAgZW1haWw9dXNlcl9kYXRhWyJlbWFpbCJdLAogICAgICAgICAgICAgICAgZnVsbF9uYW1lPXVzZXJfZGF0YVsiZnVsbF9uYW1lIl0sCiAgICAgICAgICAgICAgICBoYXNoZWRfcGFzc3dvcmQ9cHdkX2NvbnRleHQuaGFzaCgicGFzc3dvcmQxMjMiKSwKICAgICAgICAgICAgICAgIGlzX2FkbWluPXVzZXJfZGF0YVsiaXNfYWRtaW4iXSwKICAgICAgICAgICAgICAgIGlzX2FjdGl2ZT1UcnVlCiAgICAgICAgICAgICkKICAgICAgICAgICAgZGIuYWRkKHVzZXIpCiAgICAgICAgICAgIHVzZXJzLmFwcGVuZCh1c2VyKQogICAgICAgICAgICBhZG1pbl9iYWRnZSA9ICIg8J+RkSIgaWYgdXNlci5pc19hZG1pbiBlbHNlICIiCiAgICAgICAgICAgIHByaW50KGYiICDinJMge3VzZXIuZnVsbF9uYW1lfSAoe3VzZXIudXNlcm5hbWV9KXthZG1pbl9iYWRnZX0iKQogICAgICAgIAogICAgICAgIGRiLmZsdXNoKCkgICMgRmx1c2ggdG8gZ2V0IHVzZXIgSURzCiAgICAgICAgCiAgICAgICAgIyBDcmVhdGUgZGVtbyBjaG9yZXMKICAgICAgICBwcmludCgiXG7wn6e5IENyZWF0aW5nIGRlbW8gY2hvcmVzLi4uIikKICAgICAgICAKICAgICAgICAjIEdldCB1c2VyIElEcyBmb3IgYXNzaWdubWVudAogICAgICAgIGplc3MgPSBuZXh0KHUgZm9yIHUgaW4gdXNlcnMgaWYgdS51c2VybmFtZSA9PSAiamVzcyIpCiAgICAgICAgbG91ID0gbmV4dCh1IGZvciB1IGluIHVzZXJzIGlmIHUudXNlcm5hbWUgPT0gImxvdSIpCiAgICAgICAgd2lsbGlhbSA9IG5leHQodSBmb3IgdSBpbiB1c2VycyBpZiB1LnVzZXJuYW1lID09ICJ3aWxsaWFtIikKICAgICAgICB4YW5kZXIgPSBuZXh0KHUgZm9yIHUgaW4gdXNlcnMgaWYgdS51c2VybmFtZSA9PSAieGFuZGVyIikKICAgICAgICBiZWxsYSA9IG5leHQodSBmb3IgdSBpbiB1c2VycyBpZiB1LnVzZXJuYW1lID09ICJiZWxsYSIpCiAgICAgICAgCiAgICAgICAgZGVtb19jaG9yZXMgPSBbCiAgICAgICAgICAgICMgRGFpbHkgY2hvcmVzCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGZWVkIHRoZSBwZXRzIiwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGZWVkIGNhdHMgaW4gdGhlIG1vcm5pbmcgYW5kIGV2ZW5pbmciLAogICAgICAgICAgICAgICAgImZyZXF1ZW5jeSI6ICJEQUlMWSIsCiAgICAgICAgICAgICAgICAicG9pbnRzIjogNSwKICAgICAgICAgICAgICAgICJyb29tIjogIktpdGNoZW4iLAogICAgICAgICAgICAgICAgImFzc2lnbmVkX3RvX2lkIjogYmVsbGEuaWQsCiAgICAgICAgICAgICAgICAic3RhdHVzIjogIlBFTkRJTkciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUYWtlIG91dCB0cmFzaCIsCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRW1wdHkga2l0Y2hlbiBhbmQgYmF0aHJvb20gYmlucyIsCiAgICAgICAgICAgICAgICAiZnJlcXVlbmN5IjogIkRBSUxZIiwKICAgICAgICAgICAgICAgICJwb2ludHMiOiAzLAogICAgICAgICAgICAgICAgInJvb20iOiAiS2l0Y2hlbiIsCiAgICAgICAgICAgICAgICAiYXNzaWduZWRfdG9faWQiOiB4YW5kZXIuaWQsCiAgICAgICAgICAgICAgICAic3RhdHVzIjogIlBFTkRJTkciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUaWR5IGxpdmluZyByb29tIiwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQaWNrIHVwIHRveXMsIHN0cmFpZ2h0ZW4gY3VzaGlvbnMsIGNsZWFyIGNvZmZlZSB0YWJsZSIsCiAgICAgICAgICAgICAgICAiZnJlcXVlbmN5IjogIkRBSUxZIiwKICAgICAgICAgICAgICAgICJwb2ludHMiOiA1LAogICAgICAgICAgICAgICAgInJvb20iOiAiTGl2aW5nIFJvb20iLAogICAgICAgICAgICAgICAgImFzc2lnbmVkX3RvX2lkIjogd2lsbGlhbS5pZCwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiAiSU5fUFJPR1JFU1MiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIAogICAgICAgICAgICAjIFdlZWtseSBjaG9yZXMKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInRpdGxlIjogIlZhY3V1bSBlbnRpcmUgaG91c2UiLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlZhY3V1bSBhbGwgY2FycGV0ZWQgYXJlYXMgaW5jbHVkaW5nIHN0YWlycyIsCiAgICAgICAgICAgICAgICAiZnJlcXVlbmN5IjogIldFRUtMWSIsCiAgICAgICAgICAgICAgICAicG9pbnRzIjogMTUsCiAgICAgICAgICAgICAgICAicm9vbSI6ICJXaG9sZSBIb3VzZSIsCiAgICAgICAgICAgICAgICAiYXNzaWduZWRfdG9faWQiOiBsb3UuaWQsCiAgICAgICAgICAgICAgICAic3RhdHVzIjogIlBFTkRJTkciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJDbGVhbiBiYXRocm9vbXMiLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkNsZWFuIHRvaWxldHMsIHNpbmtzLCBtaXJyb3JzLCBhbmQgbW9wIGZsb29ycyIsCiAgICAgICAgICAgICAgICAiZnJlcXVlbmN5IjogIldFRUtMWSIsCiAgICAgICAgICAgICAgICAicG9pbnRzIjogMjAsCiAgICAgICAgICAgICAgICAicm9vbSI6ICJCYXRocm9vbXMiLAogICAgICAgICAgICAgICAgImFzc2lnbmVkX3RvX2lkIjogamVzcy5pZCwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiAiQ09NUExFVEVEIiwKICAgICAgICAgICAgICAgICJjb21wbGV0ZWRfYXQiOiBkYXRldGltZS5ub3coKSAtIHRpbWVkZWx0YShkYXlzPTEpCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJNb3cgdGhlIGxhd24iLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk1vdyBmcm9udCBhbmQgYmFjayB5YXJkLCBlZGdlIHdhbGt3YXlzIiwKICAgICAgICAgICAgICAgICJmcmVxdWVuY3kiOiAiV0VFS0xZIiwKICAgICAgICAgICAgICAgICJwb2ludHMiOiAyNSwKICAgICAgICAgICAgICAgICJyb29tIjogIllhcmQiLAogICAgICAgICAgICAgICAgImFzc2lnbmVkX3RvX2lkIjogd2lsbGlhbS5pZCwKICAgICAgICAgICAgICAgICJzdGF0dXMiOiAiUEVORElORyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgCiAgICAgICAgICAgICMgTW9udGhseSBjaG9yZXMKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInRpdGxlIjogIkRlZXAgY2xlYW4ga2l0Y2hlbiIsCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ2xlYW4gb3ZlbiwgZnJpZGdlLCBjYWJpbmV0cywgYW5kIGJlaGluZCBhcHBsaWFuY2VzIiwKICAgICAgICAgICAgICAgICJmcmVxdWVuY3kiOiAiTU9OVEhMWSIsCiAgICAgICAgICAgICAgICAicG9pbnRzIjogNTAsCiAgICAgICAgICAgICAgICAicm9vbSI6ICJLaXRjaGVuIiwKICAgICAgICAgICAgICAgICJhc3NpZ25lZF90b19pZCI6IGplc3MuaWQsCiAgICAgICAgICAgICAgICAic3RhdHVzIjogIlBFTkRJTkciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJXYXNoIHdpbmRvd3MiLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkNsZWFuIGFsbCBpbnRlcmlvciBhbmQgZXh0ZXJpb3Igd2luZG93cyIsCiAgICAgICAgICAgICAgICAiZnJlcXVlbmN5IjogIk1PTlRITFkiLAogICAgICAgICAgICAgICAgInBvaW50cyI6IDQwLAogICAgICAgICAgICAgICAgInJvb20iOiAiV2hvbGUgSG91c2UiLAogICAgICAgICAgICAgICAgImFzc2lnbmVkX3RvX2lkIjogbG91LmlkLAogICAgICAgICAgICAgICAgInN0YXR1cyI6ICJQRU5ESU5HIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidGl0bGUiOiAiT3JnYW5pemUgZ2FyYWdlIiwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTb3J0IGl0ZW1zLCBzd2VlcCBmbG9vciwgYXJyYW5nZSB0b29scyIsCiAgICAgICAgICAgICAgICAiZnJlcXVlbmN5IjogIk1PTlRITFkiLAogICAgICAgICAgICAgICAgInBvaW50cyI6IDM1LAogICAgICAgICAgICAgICAgInJvb20iOiAiR2FyYWdlIiwKICAgICAgICAgICAgICAgICJhc3NpZ25lZF90b19pZCI6IHdpbGxpYW0uaWQsCiAgICAgICAgICAgICAgICAic3RhdHVzIjogIklOX1BST0dSRVNTIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2hhbmdlIGFpciBmaWx0ZXJzIiwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSZXBsYWNlIEhWQUMgZmlsdGVycyB0aHJvdWdob3V0IGhvdXNlIiwKICAgICAgICAgICAgICAgICJmcmVxdWVuY3kiOiAiTU9OVEhMWSIsCiAgICAgICAgICAgICAgICAicG9pbnRzIjogMTAsCiAgICAgICAgICAgICAgICAicm9vbSI6ICJXaG9sZSBIb3VzZSIsCiAgICAgICAgICAgICAgICAiYXNzaWduZWRfdG9faWQiOiBqZXNzLmlkLAogICAgICAgICAgICAgICAgInN0YXR1cyI6ICJQRU5ESU5HIgogICAgICAgICAgICB9LAogICAgICAgICAgICAKICAgICAgICAgICAgIyBPbi10cmlnZ2VyIGNob3JlcwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidGl0bGUiOiAiR3JvY2VyeSBzaG9wcGluZyIsCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2Vla2x5IGdyb2Nlcnkgc2hvcHBpbmcgdHJpcCIsCiAgICAgICAgICAgICAgICAiZnJlcXVlbmN5IjogIk9OX1RSSUdHRVIiLAogICAgICAgICAgICAgICAgInBvaW50cyI6IDMwLAogICAgICAgICAgICAgICAgInJvb20iOiAiU2hvcHBpbmciLAogICAgICAgICAgICAgICAgImFzc2lnbmVkX3RvX2lkIjogbG91LmlkLAogICAgICAgICAgICAgICAgInN0YXR1cyI6ICJQRU5ESU5HIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidGl0bGUiOiAiQ2FyIHdhc2giLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldhc2ggYW5kIHZhY3V1bSBmYW1pbHkgY2FyIiwKICAgICAgICAgICAgICAgICJmcmVxdWVuY3kiOiAiT05fVFJJR0dFUiIsCiAgICAgICAgICAgICAgICAicG9pbnRzIjogMjAsCiAgICAgICAgICAgICAgICAicm9vbSI6ICJEcml2ZXdheSIsCiAgICAgICAgICAgICAgICAiYXNzaWduZWRfdG9faWQiOiB4YW5kZXIuaWQsCiAgICAgICAgICAgICAgICAic3RhdHVzIjogIlBFTkRJTkciCiAgICAgICAgICAgIH0sCiAgICAgICAgXQogICAgICAgIAogICAgICAgIGZvciBjaG9yZV9kYXRhIGluIGRlbW9fY2hvcmVzOgogICAgICAgICAgICBjaG9yZSA9IENob3JlKCoqY2hvcmVfZGF0YSkKICAgICAgICAgICAgZGIuYWRkKGNob3JlKQogICAgICAgICAgICAKICAgICAgICAgICAgIyBQcmV0dHkgcHJpbnQgd2l0aCBlbW9qaXMKICAgICAgICAgICAgc3RhdHVzX2Vtb2ppID0gIuKchSIgaWYgY2hvcmVfZGF0YVsic3RhdHVzIl0gPT0gIkNPTVBMRVRFRCIgZWxzZSAi8J+UhCIgaWYgY2hvcmVfZGF0YVsic3RhdHVzIl0gPT0gIklOX1BST0dSRVNTIiBlbHNlICLij7MiCiAgICAgICAgICAgIHByaW50KGYiICB7c3RhdHVzX2Vtb2ppfSB7Y2hvcmVfZGF0YVsndGl0bGUnXX0gLSB7Y2hvcmVfZGF0YVsnZnJlcXVlbmN5J119ICh7Y2hvcmVfZGF0YVsncm9vbSddfSkiKQogICAgICAgIAogICAgICAgIGRiLmNvbW1pdCgpCiAgICAgICAgcHJpbnQoZiJcbuKchSBEYXRhYmFzZSBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkgd2l0aCB7bGVuKHVzZXJzX2RhdGEpfSB1c2VycyBhbmQge2xlbihkZW1vX2Nob3Jlcyl9IGRlbW8gY2hvcmVzISIpCiAgICAgICAgcHJpbnQoIlxu8J+UkSBMb2dpbiBjcmVkZW50aWFsczoiKQogICAgICAgIHByaW50KCIgICBVc2VybmFtZTogamVzcyAoYWRtaW4pIG9yIGxvdSwgd2lsbGlhbSwgeGFuZGVyLCBiZWxsYSIpCiAgICAgICAgcHJpbnQoIiAgIFBhc3N3b3JkOiBwYXNzd29yZDEyMyIpCiAgICAgICAgCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcHJpbnQoZiLinYwgRXJyb3IgaW5pdGlhbGl6aW5nIGRhdGFiYXNlOiB7ZX0iKQogICAgICAgIGRiLnJvbGxiYWNrKCkKICAgICAgICByYWlzZQogICAgZmluYWxseToKICAgICAgICBkYi5jbG9zZSgpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgaW5pdF9kYigpCg== \ No newline at end of file