[
  {
    "path": ".circleci/ci-scripts/accept-android-licenses.sh",
    "content": "#!/usr/bin/env bash\n\nexport LICENSES_PATH=\"$ANDROID_HOME/licenses\"\nexport ANDROID_SDK_LICENSE_PATH=\"$LICENSES_PATH/android-sdk-license\"\nexport ANDROID_SDK_LICENSE_CONTENTS=$'\\n8933bad161af4178b1185d1a37fbf41ea5269c55'\n\nif [ ! -e ${ANDROID_SDK_LICENSE_PATH} ]; then\n    echo \"Android SDK license acceptance not found in '$LICENSES_PATH', creating it...\"\n\n    mkdir \"$LICENSES_PATH\" || true\n    echo -e \"$ANDROID_SDK_LICENSE_CONTENTS\" > \"$ANDROID_SDK_LICENSE_PATH\"\n\n    echo \"Done.\"\nelse\n    echo \"No need to create license acceptance file, already found in: $LICENSES_PATH/\"\nfi\n"
  },
  {
    "path": ".circleci/ci-scripts/ensure-sdkmanager.sh",
    "content": "#!/usr/bin/env bash\n\nexport TOOLS_BIN_PATH=\"$ANDROID_HOME/tools/bin\"\nexport SDKMANAGER_PATH=\"$TOOLS_BIN_PATH/sdkmanager\"\n\nif [ ! -e ${SDKMANAGER_PATH} ]; then\n    echo \"sdkmanager tool not found in '$SDKMANAGER_PATH', updating Android SDK tools...\"\n\n    android update sdk --no-ui --all --filter tools\n\n    echo \"Android SDK tools updated.\"\nelse\n    echo \"No need to update Android SDK tools, sdkmanager found in: $TOOLS_BIN_PATH/\"\nfi\n"
  },
  {
    "path": ".circleci/ci-scripts/mock-google-services.json",
    "content": "{\n  \"project_info\": {\n    \"project_id\": \"mockproject-1234\",\n    \"project_number\": \"123456789000\",\n    \"name\": \"FirebaseQuickstarts\",\n    \"firebase_url\": \"https://mockproject-1234.firebaseio.com\"\n  },\n  \"client\": [\n    {\n      \"client_info\": {\n        \"mobilesdk_app_id\": \"1:123456789000:android:f1bf012572b04063\",\n        \"client_id\": \"android:com.google.samples.quickstart.admobexample\",\n        \"client_type\": 1,\n        \"android_client_info\": {\n          \"package_name\": \"com.alexstyl.specialdates\",\n          \"certificate_hash\": []\n        }\n      },\n      \"oauth_client\": [\n        {\n          \"client_id\": \"123456789000-hjugbg6ud799v4c49dim8ce2usclthar.apps.googleusercontent.com\",\n          \"client_type\": 1,\n          \"android_info\": {\n            \"package_name\": \"com.alexstyl.specialdates\",\n            \"certificate_hash\": \"4C20644DE36B8F89D25650C7D1FF9FBAE650FDF7\"\n          }\n        },\n        {\n          \"client_id\": \"123456789000-e4uksm38sne0bqrj6uvkbo4oiu4hvigl.apps.googleusercontent.com\",\n          \"client_type\": 3\n        }\n      ],\n      \"api_key\": [\n        {\n          \"current_key\": \"AIzbSzCn1N6LWIe6wthYyrgUUSAlUsdqMb-wvTo\"\n        }\n      ],\n      \"services\": {\n        \"analytics_service\": {\n          \"status\": 1\n        },\n        \"cloud_messaging_service\": {\n          \"status\": 2,\n          \"apns_config\": []\n        },\n        \"appinvite_service\": {\n          \"status\": 2,\n          \"other_platform_oauth_client\": [\n            {\n              \"client_id\": \"123456789000-e4uksm38sne0bqrj6uvkbo4oiu4hvigl.apps.googleusercontent.com\",\n              \"client_type\": 3\n            }\n          ]\n        },\n        \"google_signin_service\": {\n          \"status\": 2\n        },\n        \"ads_service\": {\n          \"status\": 2,\n          \"test_banner_ad_unit_id\": \"ca-app-pub-3940256099942544/6300978111\",\n          \"test_interstitial_ad_unit_id\": \"ca-app-pub-3940256099942544/1033173712\"\n        }\n      }\n    },\n    {\n      \"client_info\": {\n        \"mobilesdk_app_id\": \"1:123456789000:android:f1bf012572b04063\",\n        \"client_id\": \"android:com.google.samples.quickstart.admobexample\",\n        \"client_type\": 1,\n        \"android_client_info\": {\n          \"package_name\": \"com.alexstyl.specialdates.pro\",\n          \"certificate_hash\": []\n        }\n      },\n      \"oauth_client\": [\n        {\n          \"client_id\": \"123456789000-hjugbg6ud799v4c49dim8ce2usclthar.apps.googleusercontent.com\",\n          \"client_type\": 1,\n          \"android_info\": {\n            \"package_name\": \"com.alexstyl.specialdates.pro\",\n            \"certificate_hash\": \"4C20644DE36B8F89D25650C7D1FF9FBAE650FDF7\"\n          }\n        },\n        {\n          \"client_id\": \"123456789000-e4uksm38sne0bqrj6uvkbo4oiu4hvigl.apps.googleusercontent.com\",\n          \"client_type\": 3\n        }\n      ],\n      \"api_key\": [\n        {\n          \"current_key\": \"AIzbSzCn1N6LWIe6wthYyrgUUSAlUsdqMb-wvTo\"\n        }\n      ],\n      \"services\": {\n        \"analytics_service\": {\n          \"status\": 1\n        },\n        \"cloud_messaging_service\": {\n          \"status\": 2,\n          \"apns_config\": []\n        },\n        \"appinvite_service\": {\n          \"status\": 2,\n          \"other_platform_oauth_client\": [\n            {\n              \"client_id\": \"123456789000-e4uksm38sne0bqrj6uvkbo4oiu4hvigl.apps.googleusercontent.com\",\n              \"client_type\": 3\n            }\n          ]\n        },\n        \"google_signin_service\": {\n          \"status\": 2\n        },\n        \"ads_service\": {\n          \"status\": 2,\n          \"test_banner_ad_unit_id\": \"ca-app-pub-3940256099942544/6300978111\",\n          \"test_interstitial_ad_unit_id\": \"ca-app-pub-3940256099942544/1033173712\"\n        }\n      }\n    }\n  ],\n  \"client_info\": [],\n  \"ARTIFACT_VERSION\": \"1\"\n}"
  },
  {
    "path": ".circleci/config.yml",
    "content": "version: 2\n\njobs:\n  build:\n    docker:\n      - image: circleci/android:api-27-alpha\n\n    environment:\n      ANDROID_HOME: /opt/android/sdk\n      APPLICATION_ID: com.alexstyl.specialdates\n\n    steps:\n      - checkout\n\n      # Restore cached dependencies (if any)\n      - restore_cache:\n          key: jars-{{ checksum \"build.gradle\" }}-{{ checksum  \"android_mobile/build.gradle\" }}\n\n      # Prepare the container for the build\n      - run:\n          name: Accept Android SDK license\n          command: .circleci/ci-scripts/accept-android-licenses.sh\n      - run:\n          name: Ensure Android SDK install is up-to-date\n          command: .circleci/ci-scripts/ensure-sdkmanager.sh\n\n      # Run the main job command, delegating to Gradle\n      - run:\n          name: Run Gradle :check command\n          command: ./gradlew check --stacktrace --continue\n\n      # Store all the downloaded dependencies in the CI cache\n      - save_cache:\n          paths:\n            # Android SDK\n            - /usr/local/android-sdk-linux/tools\n            - /usr/local/android-sdk-linux/platform-tools\n            - /usr/local/android-sdk-linux/build-tools\n            - /usr/local/android-sdk-linux/licenses\n            - /usr/local/android-sdk-linux/extras/google/m2repository\n\n            # Gradle dependencies\n            - ~/.gradle\n          key: jars-{{ checksum \"build.gradle\" }}-{{ checksum  \"android_mobile/build.gradle\" }}\n\n      # Collect static analysis reports as build artifacts\n      - store_artifacts:\n          path: android_mobile/build/reports\n          destination: reports\n\n      # Collect JUnit test results\n      - store_test_results:\n          path: android_mobile/build/test-results\n"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "## Ways of contributing\n\nThere are a few ways of contributing into the project:\n\n1. Bug fixes\n2. Check the [Issues page](https://github.com/alexstyl/MementoNamedays/issues) and resolve any issues you can find\n3. Code refactor. The project is fairly old, so there is huge room for improvement :)\n4. Introduce any interesting functionality you might need. Please do let me know before doing this first. There might be a chance that a feature you might want to include be really specific to your needs and not fit the overall style of the app. For any questions on features PR, email me at alexstyl.dev@gmail.com\n5. Translate the app [by visiting OneSky](https://memento.oneskyapp.com/admin/project/dashboard/project/85177)\n\n## Creating Pull Requests (PR)\nThe repo contains two main branches:\n\n* `master` which contains all changes currently available to the Play Store.\n* `develop` which contains all changes to be uploaded in the next version of Memento.\n\n1. Create a branch from `develop`.\n2. Make any modifications required.\n3. When done, open a PR of that branch against develop.\n\nMake sure to consider testing the code you push.\n\nDo not create huge PRs. If a PR grows big, make sure to create a new branch with those changes, and create a PR against your initial `feature` branch. The bigger the PR, the less chances of it getting merged on time.\n\n## Reporting Issues\nIn case you found a bug in the app, or some bits in the code base that can cause issues, you can open an Issue so that someone can fix it. If it is a bug, make sure to write down all the steps it took to replicate it and (if possible) add a GIF showcasing the bug.\n\nYou can record your screen with the help of Android Studio ([see this video](https://youtu.be/uOvL4TXzOm4?t=39s)). Keep in mind that video recording does not work on Emulators, so you will need a real device for that. After you are done recording, convert the video into a GIF. I usually use this [website (video to gif)](http://image.online-convert.com/convert-to-gif). Make sure to attach the GIF into your Issue :)\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "content": "#### Short Description\n\n_Give a brief description of what the issue is_\n\n##### Steps to reproduce\n _This is just an example of how to write the steps_\n 1. Open app from home screen's icon\n 2. Select any day on the list\n 3. Tap on a contact's card\n\n##### Resulted in\nApp crashes\n\n##### Expected Results\nDisplay the contact details of the selected contact\n\n##### Video/Screenshots\n(if no visual change, just delete)\n\n{before image}\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "#### Description\n\n_Give a brief explanation of what is the problem/feature you are working on and what this PR contains_\n\n##### Test(s) added\n\n _yes|no_ and reasoning why\n\n##### Screenshots\n(if no visual change, just delete)\n\n| Before | After |\n| ------ | ----- |\n| {before image} | {after image} |\n"
  },
  {
    "path": ".gitignore",
    "content": "# Built application files\n*.apk\n*.ap_\n\n# Files for the ART/Dalvik VM\n*.dex\n\n# Java class files\n*.class\n\n# Generated files\nbin/\ngen/\nout/\n\n# Gradle files\n.gradle/\nbuild/\n\n# Local configuration file (sdk path, etc)\nlocal.properties\n\n# Proguard folder generated by Eclipse\nproguard/\n\n# Log Files\n*.log\n\n# Android Studio Navigation editor temp files\n.navigation/\n\n# Android Studio captures folder\ncaptures/\n\n# Intellij\n.idea/\n*.iml\n*.iws\n\n# Keystore files\n*.jks\n\n# Mac\n.DS_Store\n\n# secrets\ngoogle-services.json\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2016 Alex Styl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "PEOPLE.md",
    "content": "Memento Calendar could not be in the amazing shape it is today if it wasn't for the following amazing people (alphabetically sorted):\n\n* [auricgoldfinger](https://github.com/alexstyl/Memento-Calendar/pulls?utf8=%E2%9C%93&q=author%3Aauricgoldfinger) for the Big Text notification implementation\n* [Andreas Sfakianakis](https://github.com/exaila) for the creation of the greeklish sound converter\n* [Chrysa Papadopoulou](https://github.com/alexstyl/Memento-Calendar/pulls?utf8=%E2%9C%93&q=author%3Apchrysa) for the italian namedays\n* [Daniele Bonaldo](https://github.com/alexstyl/Memento-Calendar/pulls?utf8=%E2%9C%93&q=author%3Adanybony) for the Android Wear implementation\n* [Daniele Conti](https://github.com/alexstyl/Memento-Calendar/pulls?utf8=%E2%9C%93&q=author%3Afourlastor) for performance improvements and kotlin enhancements\n* [Thanos Psaridis (Fisherman)](https://github.com/alexstyl/Memento-Calendar/pulls?utf8=%E2%9C%93&q=author%3AThanosFisherman) for bug fixing\n* [Qi Qu](https://github.com/alexstyl/Memento-Calendar/pulls?utf8=%E2%9C%93&q=author%3Aqqipp) for the updated Memento Calendar app icon\n* [madlymad](https://github.com/alexstyl/Memento-Calendar/pulls?utf8=%E2%9C%93&q=author%3Amadlymad) for improvements in the CI and madfixes\n\nYou can find all contributors at https://github.com/alexstyl/Memento-Calendar/graphs/contributors\n\nBig thanks to all the translators via [OneSky](https://memento.oneskyapp.com/collaboration/project/85177):\n\n* Andrejs Kotovs for the 🇱🇻 Latvian translations\n* Aggela Styl for the 🇫🇷 French translations\n* Bert for the 🇳🇱 Dutch translations\n* Denis Mone for the 🇬🇷 Greek translations (corrections and improvements)\n* Giangi for the 🇮🇹 Italian translations\n* janfelcman for the 🇨🇿 Czech translations\n"
  },
  {
    "path": "README.md",
    "content": "# Archived\n\nThe repo is now archived and no new commits will take place. Thank for your support and contributions. \n\n\n# Memento Calendar for Android  [![alt text](https://travis-ci.org/alexstyl/Memento-Calendar.svg?branch=master \"Check the build status on Travis CI\")](https://travis-ci.org/alexstyl/Memento-Calendar)\n\n<img src=\"https://github.com/alexstyl/Memento-Calendar/blob/main/android_common/src/main/res/mipmap-xxxhdpi/ic_launcher.png?raw=true\" width=\"200\" align=\"right\" hspace=\"20\">\n\nMemento Calendar is a modern namedays app for Android.\nThis repository contains the source code of Memento Calendar.\n\nYou can get started by having a look at the project's wiki. It contains some information about how to get Memento up and running on your machine and other useful info.\n\nThis repo is open for PRs and they are more than welcome! Have a look [at the wiki page to see how to contribute](https://github.com/alexstyl/Memento-Calendar/wiki/How-to-contribute).\n\n\n[![alt text](http://developer.android.com/images/brand/en_app_rgb_wo_60.png \"Download Memento Calendar from the Play Store\")](https://play.google.com/store/apps/details?id=com.alexstyl.specialdates)\n\n## Project Goal\nMemento Calendar is my pet project/playground in which I experiment with various platform features development patterns and share my foundings with the community my foundings via blog posts and talks. Memento started off as a side project app back in 2014 and has been on development on and off. Current goal of the project is to split out the business logic of the app from the app logic so that it could potentially be ported into other platforms with the help of Kotlin.\n\n## Modules\nThe app is split into multiple modules. \nThe business logic of the app can be found in the **memento** module. There are three other Android Modules: \n\n### android_common\nThis is the shared resources across all Android specific modules. It depends on *memento*.\n\n### android_wear\nThis is the Android Wear module. It depends on *android_common*.\n\n### android_mobile\nThis is the Android mobile app module. It depends on *android_common*.\n\n## Architecture\nThe Model-View-Presenter is used in order to architecture the app. \n\n**Presenters** are platform agnostic and live in the **memento** module, in order to be able to be used across all platforms. They contain the core logic of forwarding *Models* to the *Views*. It is up for the specific platform component to create a View\n\n**Views** are responsible displaying information back to the user. For each view there is one interface that lives in the memento module. A view is not to be confused with Android's View classes, Activities or Fragments. \n\n**Models** contain the minimum amount of information needed to render the information on the screen.\n\nI did a talk in the GDG Android Athens about the structure of Memento Calendar. The talk is in Greek, but the slides contain more information about the structure [(see the slides)](https://speakerdeck.com/alexstyl/the-journey-towards-a-platform-agnostic-codebase).\n\n\n\n## License\n```\nMIT License\n\nCopyright (c) 2016 Alex Styl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n```\n"
  },
  {
    "path": "android_common/build.gradle",
    "content": "apply plugin: 'com.android.library'\napply plugin: 'kotlin-android'\napply from: '../versions.gradle'\n\nandroid {\n\n    compileSdkVersion androidCompileSdkVersion\n    buildToolsVersion androidBuildToolsVersion\n\n    // All these unused resources are actually used by other modules\n    lintOptions {\n        abortOnError false\n    }\n\n    defaultConfig {\n        minSdkVersion 16\n        buildConfigField 'String', 'MIXPANEL_TOKEN', '\\\"' + mixpanelToken + \"\\\"\"\n    }\n}\n\n\ndependencies {\n    api project(path: ':memento')\n    api 'com.mixpanel.android:mixpanel-android:4.9.2'\n    api \"com.android.support:support-annotations:$android_support_version\"\n    api 'net.danlew:android.joda:2.9.9'\n    api \"org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version\"\n    api 'io.reactivex.rxjava2:rxandroid:2.0.1'\n}\n"
  },
  {
    "path": "android_common/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"com.alexstyl.specialdates.common\" />\n"
  },
  {
    "path": "android_common/src/main/java/com/alexstyl/android/AndroidLogger.kt",
    "content": "package com.alexstyl.android\n\nimport android.util.Log\nimport com.alexstyl.Logger\n\nclass AndroidLogger : Logger {\n    override fun debug(message: String) {\n        Log.d(this.javaClass.simpleName, message)\n    }\n\n    override fun warning(message: String) {\n        Log.w(this.javaClass.simpleName, message)\n    }\n}\n"
  },
  {
    "path": "android_common/src/main/java/com/alexstyl/android/Version.kt",
    "content": "package com.alexstyl.android\n\nimport android.os.Build\n\n\nobject Version {\n\n    fun hasJellyBean(): Boolean {\n        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN\n    }\n\n    fun hasKitKat(): Boolean {\n        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT\n    }\n\n    fun hasLollipop(): Boolean {\n        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP\n    }\n\n    fun hasMarshmallow(): Boolean {\n        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M\n    }\n\n    fun hasOreo(): Boolean {\n        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O\n    }\n}\n"
  },
  {
    "path": "android_common/src/main/java/com/alexstyl/android/ViewVisibility.java",
    "content": "package com.alexstyl.android;\n\nimport android.support.annotation.IntDef;\nimport android.view.View;\n\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\n\n@Retention(RetentionPolicy.SOURCE)\n@IntDef({\n        View.VISIBLE,\n        View.INVISIBLE,\n        View.GONE\n})\npublic @interface ViewVisibility {\n}\n"
  },
  {
    "path": "android_common/src/main/java/com/alexstyl/android/preferences/widget/TimePreference.java",
    "content": "\npackage com.alexstyl.android.preferences.widget;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.preference.DialogPreference;\nimport android.preference.PreferenceManager;\nimport android.text.format.DateFormat;\nimport android.util.AttributeSet;\nimport android.view.View;\nimport android.widget.TimePicker;\n\nimport com.alexstyl.specialdates.common.R;\n\npublic class TimePreference extends DialogPreference {\n    private int lastHour = 0;\n    private int lastMinute = 0;\n\n    private TimePicker picker;\n\n    public TimePreference(Context ctx, AttributeSet attrs) {\n        super(ctx, attrs);\n        setDialogTitle(ctx.getString(R.string.set_time));\n        setPositiveButtonText(ctx.getString(R.string.set));\n        setNegativeButtonText(null);\n    }\n\n    @Override\n    protected View onCreateDialogView() {\n        picker = new TimePicker(getContext());\n        picker.setIs24HourView(DateFormat.is24HourFormat(getContext()));\n        return picker;\n    }\n\n    @Override\n    protected void onBindDialogView(View v) {\n        super.onBindDialogView(v);\n\n        picker.setCurrentHour(lastHour);\n        picker.setCurrentMinute(lastMinute);\n    }\n\n    @Override\n    protected void onDialogClosed(boolean positiveResult) {\n        super.onDialogClosed(positiveResult);\n\n        if (positiveResult) {\n            lastHour = picker.getCurrentHour();\n            lastMinute = picker.getCurrentMinute();\n\n            int[] time = new int[2];\n            time[0] = lastHour;\n            time[1] = lastMinute;\n\n            if (callChangeListener(time)) {\n                persistString(time[0] + \":\" + time[1]);\n            }\n        }\n    }\n\n    @Override\n    protected Object onGetDefaultValue(TypedArray a, int index) {\n        return (a.getString(index));\n    }\n\n    @Override\n    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {\n        String time;\n\n        if (restoreValue) {\n            if (defaultValue == null) {\n                time = PreferenceManager.getDefaultSharedPreferences(getContext()).getString(\n                        getKey(), \"00:00\");\n            } else {\n                time = getPersistedString(defaultValue.toString());\n            }\n        } else {\n            time = defaultValue.toString();\n        }\n\n        lastHour = getHour(time);\n        lastMinute = getMinute(time);\n    }\n\n    private static int getHour(String time) {\n        String[] pieces = time.split(\":\");\n        return Integer.parseInt(pieces[0]);\n    }\n\n    private static int getMinute(String time) {\n        String[] pieces = time.split(\":\");\n\n        return (Integer.parseInt(pieces[1]));\n    }\n}\n"
  },
  {
    "path": "android_common/src/main/java/com/alexstyl/android/widget/AppWidgetId.java",
    "content": "package com.alexstyl.android.widget;\n\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\n\n/**\n * A id of a Widget\n */\n@Retention(RetentionPolicy.SOURCE)\npublic @interface AppWidgetId {\n}\n"
  },
  {
    "path": "android_common/src/main/java/com/alexstyl/resources/AndroidDimensionResources.java",
    "content": "package com.alexstyl.resources;\n\nimport android.content.res.Resources;\nimport android.support.annotation.DimenRes;\n\nfinal class AndroidDimensionResources implements DimensionResources {\n\n    private final Resources resources;\n\n    AndroidDimensionResources(Resources resources) {\n        this.resources = resources;\n    }\n\n    @Override\n    public int getPixelSize(@DimenRes int id) {\n        return resources.getDimensionPixelSize(id);\n    }\n\n}\n"
  },
  {
    "path": "android_common/src/main/java/com/alexstyl/resources/DimensionResources.java",
    "content": "package com.alexstyl.resources;\n\nimport android.support.annotation.DimenRes;\nimport android.support.annotation.Px;\n\npublic interface DimensionResources {\n    @Px\n    int getPixelSize(@DimenRes int id);\n}\n"
  },
  {
    "path": "android_common/src/main/java/com/alexstyl/specialdates/AndroidStrings.kt",
    "content": "package com.alexstyl.specialdates\n\nimport android.content.res.Resources\nimport com.alexstyl.specialdates.common.R\nimport com.alexstyl.specialdates.events.namedays.NamedayLocale\nimport com.alexstyl.specialdates.events.peopleevents.EventType\nimport com.alexstyl.specialdates.events.peopleevents.StandardEventType\nimport com.alexstyl.specialdates.person.StarSign\n\nclass AndroidStrings(private val resources: Resources) : Strings {\n    override fun contactAddedFailed(): String = resources.getString(R.string.failed_to_add_contact)\n\n    override fun contactAdded(): String = resources.getString(R.string.contact_added)\n\n    override fun contactUpdated(): String = resources.getString(R.string.contact_updated)\n\n    override fun contactUpdateFailed(): String = resources.getString(R.string.failed_to_update_contact)\n\n    override fun dontForgetToSendWishes(): String = resources.getString(R.string.Dont_forget_to_send_your_wishes)\n    override fun call(): String = resources.getString(R.string.Call)\n    override fun sendWishes(): String = resources.getString(R.string.Send_wishes)\n\n    override fun bankholidaySubtitle(): String = resources.getString(R.string.Bank_holiday_subtitle)\n\n    override fun contacts(): String = resources.getString(R.string.contacts)\n\n    override fun namedays(): String = resources.getString(R.string.namedays)\n\n    override fun bankholidays(): String = resources.getString(R.string.Bank_holidays)\n\n    override fun dailyReminder(): String = resources.getString(R.string.daily_reminder)\n\n    override fun postOnFacebook(): String = resources.getString(R.string.Post_on_Facebook)\n\n    override fun facebook(): String = resources.getString(R.string.Facebook)\n\n    override fun facebookMessenger(): String = resources.getString(R.string.facebook_messenger)\n\n    override fun viewConversation(): String = resources.getString(R.string.View_conversation)\n\n    override fun nameOf(starSign: StarSign): String = when (starSign) {\n        StarSign.AQUARIUS -> resources.getString(R.string.starsigns_aquarius)\n        StarSign.PISCES -> resources.getString(R.string.starsigns_pisces)\n        StarSign.ARIES -> resources.getString(R.string.starsigns_aries)\n        StarSign.TAURUS -> resources.getString(R.string.starsigns_taurus)\n        StarSign.GEMINI -> resources.getString(R.string.starsigns_gemini)\n        StarSign.CANCER -> resources.getString(R.string.starsigns_cancer)\n        StarSign.LEO -> resources.getString(R.string.starsigns_leo)\n        StarSign.VIRGO -> resources.getString(R.string.starsigns_virgo)\n        StarSign.LIBRA -> resources.getString(R.string.starsigns_libra)\n        StarSign.SCORPIO -> resources.getString(R.string.starsigns_scorpio)\n        StarSign.SAGITTARIUS -> resources.getString(R.string.starsigns_sagittarius)\n        StarSign.CAPRICORN -> resources.getString(R.string.starsigns_capricorn)\n    }\n\n    override fun turnsAge(age: Int): String = resources.getString(R.string.turns_age, age);\n\n    override fun inviteFriend(): String = resources.getString(R.string.Invite_friend)\n\n    override fun todaysNamedays(numberOfNamedays: Int): String = resources.getQuantityString(R.plurals.todays_nameday, numberOfNamedays)\n\n    override fun donateAmount(amount: String): String = resources.getString(R.string.donation_donate_amount, amount)\n\n    override fun eventOnDate(eventLabel: String, dateLabel: String): String = resources.getString(R.string.eventlabel_on_dateLabel, eventLabel, dateLabel)\n\n    override fun appName(): String = resources.getString(R.string.app_name)\n\n    override fun shareText(): String = resources.getString(R.string.share_text)\n\n    override fun today(): String = resources.getString(R.string.today)\n\n    override fun tomorrow(): String = resources.getString(R.string.tomorrow)\n\n    override fun todayCelebrateTwo(nameOne: String, nameTwo: String): String = resources.getString(R.string.today_celebrates_two, nameOne, nameTwo)\n\n    override fun todayCelebrateMany(name: String, numberLeft: Int): String = resources.getString(R.string.today_celebrates_many, name, numberLeft)\n\n    override fun nameOfEvent(event: EventType): String = when (event) {\n        StandardEventType.BIRTHDAY -> resources.getString(R.string.birthday)\n        StandardEventType.NAMEDAY -> resources.getString(R.string.nameday)\n        StandardEventType.ANNIVERSARY -> resources.getString(R.string.Anniversary)\n        StandardEventType.OTHER -> resources.getString(R.string.Other)\n        StandardEventType.CUSTOM -> resources.getString(R.string.Custom)\n        else -> {\n            throw IllegalStateException(\"$event has no name\")\n        }\n    }\n\n    override fun localeName(locale: NamedayLocale): String = when (locale) {\n        NamedayLocale.GREEK -> resources.getString(R.string.Greek)\n        NamedayLocale.ROMANIAN -> resources.getString(R.string.Romanian)\n        NamedayLocale.RUSSIAN -> resources.getString(R.string.Russian)\n        NamedayLocale.LATVIAN -> resources.getString(R.string.Latvian_Traditional)\n        NamedayLocale.LATVIAN_EXTENDED -> resources.getString(R.string.Latvian_Extended)\n        NamedayLocale.SLOVAK -> resources.getString(R.string.Slovak)\n        NamedayLocale.ITALIAN -> resources.getString(R.string.Italian)\n        NamedayLocale.CZECH -> resources.getString(R.string.Czech)\n        NamedayLocale.HUNGARIAN -> resources.getString(R.string.Hungarian)\n    }\n\n    override fun viewFacebookProfile(): String = resources.getString(R.string.View_Facebook_Profile)\n\n    override fun importFromFacebook(): String = resources.getString(R.string.Import_from_Facebook)\n}\n"
  },
  {
    "path": "android_common/src/main/java/com/alexstyl/specialdates/TextViewLabelSetter.java",
    "content": "package com.alexstyl.specialdates;\n\nimport android.widget.TextView;\n\npublic class TextViewLabelSetter implements LabelSetter {\n    private final TextView textView;\n\n    public TextViewLabelSetter(TextView textView) {\n        this.textView = textView;\n    }\n\n    @Override\n    public void setLabel(String text) {\n        textView.setText(text);\n    }\n}\n"
  },
  {
    "path": "android_common/src/main/java/com/alexstyl/specialdates/date/IntentDateExtensions.kt",
    "content": "package com.alexstyl.specialdates.date\n\nimport android.content.Intent\n\nval EXTRA_DAY_OF_MONTH = \"extra:day_of_month\"\nval EXTRA_MONTH = \"extra:month\"\nval EXTRA_YEAR = \"extra:year\"\n\nfun Intent.putExtraDate(date: Date): Intent {\n    return putExtra(EXTRA_DAY_OF_MONTH, date.dayOfMonth)\n            .putExtra(EXTRA_MONTH, date.month)\n            .putExtra(EXTRA_YEAR, date.year)\n}\n\n\nfun Intent.getDateExtraOrThrow(): Date {\n    val dayOfMonth = getExtraOrThrow(this, EXTRA_DAY_OF_MONTH)\n    @MonthInt val month = getExtraOrThrow(this, EXTRA_MONTH)\n    val year = getExtraOrThrow(this, EXTRA_YEAR)\n    return Date.on(dayOfMonth, month, year)\n}\n\nprivate fun getExtraOrThrow(intent: Intent, extra: String): Int {\n    val intExtra = intent.getIntExtra(extra, -1)\n    if (intExtra == -1) {\n        throw IllegalArgumentException(\"Passing Intent did not include extra [$extra]\")\n    }\n    return intExtra\n}\n\n"
  },
  {
    "path": "android_common/src/main/java/com/alexstyl/specialdates/events/database/EventColumns.java",
    "content": "package com.alexstyl.specialdates.events.database;\n\npublic interface EventColumns {\n    /**\n     * A value of {@link EventTypeId} that indicates the type of event\n     */\n    String EVENT_TYPE = \"event_type\";\n\n    /**\n     * The id of the same event stored in the device's default database\n     * <p>Will be set to -1 if not available</p>\n     */\n    String DEVICE_EVENT_ID = \"device_event_id\";\n\n    String DATE = \"date\";\n    String SOURCE = \"source\";\n\n    /**\n     * A value to indicate whether the user is interested in seeing this event.\n     * <p>1 for visible, 0 for not-visible</p>\n     */\n    String VISIBLE = \"visible\";\n}\n"
  },
  {
    "path": "android_common/src/main/java/com/alexstyl/specialdates/wear/SharedConstants.java",
    "content": "package com.alexstyl.specialdates.wear;\n\npublic final class SharedConstants {\n\n    public static final String NEXT_CONTACT_EVENTS_PATH = \"/next-contact-events\";\n    public static final String KEY_DATE = \"key_date\";\n    public static final String KEY_CONTACTS_NAMES = \"key_contacts_names\";\n\n    private SharedConstants() {\n        // not instantiable\n    }\n\n}\n"
  },
  {
    "path": "android_common/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n  <color name=\"main_grey\">#eeeeee</color>\n  <color name=\"light_grey\">#F6F6F6</color>\n  <color name=\"main_white\">@android:color/white</color>\n  <color name=\"pressed_example\">#CC33B5E5</color>\n  <color name=\"avatar_number\">#414141</color>\n  <color name=\"card_text\">#707070</color>\n  <color name=\"teal\">#55B2A5</color>\n\n  <color name=\"main_red\">#c61d30</color>\n  <color name=\"main_cream\">#ffeebb</color>\n\n\n  <color name=\"primary_dark_red\">#B71C1C</color>\n  <color name=\"primary_red\">#c61d30</color>\n\n  <color name=\"main_red_semi_transparent\">#99c61d30</color>\n\n  <color name=\"avatar_variant_1\">#aeb857</color>\n  <color name=\"avatar_variant_2\">#536173</color>\n  <color name=\"avatar_variant_3\">#df5948</color>\n  <color name=\"avatar_variant_4\">#547bca</color>\n  <color name=\"avatar_variant_5\">#e5ae4f</color>\n  <color name=\"font_on_red\">#ffffff</color>\n\n  <color name=\"statusbar_color\">#9e1726</color>\n\n  <color name=\"birthday_red\">#ffff4444</color>\n  <color name=\"anniversary_yellow\">@color/avatar_variant_1</color>\n  <color name=\"nameday_blue\">#ff33b5e5</color>\n\n  <color name=\"past_date_grey\">#595959</color>\n  <color name=\"purple_custom_event\">#6a1b9a</color>\n\n  <color name=\"white_semi_transparents\">#99ffffff</color>\n  <color name=\"neutral_ripple\">#46000000</color>\n\n  <drawable name=\"dark_variant\">#263238</drawable>\n  <color name=\"bankholiday_green\">#ff669900</color>\n  <color name=\"facebook_blue\">#3b5998</color>\n  <color name=\"black_light\">#151515</color>\n</resources>\n"
  },
  {
    "path": "android_common/src/main/res/values/strings-non-translatable.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\"\n  tools:ignore=\"MissingTranslation\">\n  <string name=\"app_name\">@string/localised_app_name</string>\n  <string name=\"Memento_Calendar\">Memento Calendar</string>\n  <string name=\"email\">email</string>\n  <string name=\"email_start\">Email</string>\n  <string name=\"link_translate_short\">goo.gl/GxZd6M</string>\n    <string name=\"demo_contact_name\">Mathilda Dawson</string>\n\n    <plurals name=\"plural_birthday\">\n    <item quantity=\"one\">@string/birthday</item>\n    <item quantity=\"other\">@string/birthdays</item>\n  </plurals>\n  <plurals name=\"plural_nameday\">\n    <item quantity=\"one\">@string/nameday</item>\n    <item quantity=\"other\">@string/namedays</item>\n  </plurals>\n\n  <plurals name=\"todays_nameday\">\n    <item quantity=\"one\">@string/celebrates_one_namedays</item>\n    <item quantity=\"other\">@string/todays_namedays</item>\n  </plurals>\n\n</resources>\n"
  },
  {
    "path": "android_common/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- The original name of the app is Memento Calendar. In Greek though the name is Εορτολόγιο Memento (Nameday Almanac Memento)\n  as the name makes more sense. If there is a local specific name, make sure to write it here. If not, leave it as is-->\n    <string name=\"localised_app_name\">Memento Calendar</string>\n    <string name=\"today\">Today</string>\n    <string name=\"tomorrow\">Tomorrow</string>\n    <string name=\"birthday\">Birthday</string>\n    <string name=\"birthdays\">Birthdays</string>\n    <string name=\"namedays\">Name Days</string>\n    <string name=\"nameday\">Name Day</string>\n    <string name=\"contacts_birthday\">\"It's %s's birthday!\"</string>\n    <string name=\"contacts_nameday\">\"It's %s's nameday!\"</string>\n    <string name=\"namedays_no_names\">No name days for this day</string>\n    <string name=\"birthday_no_birthday\">No contact has their birthday this day</string>\n    <string name=\"action_settings\">Settings</string>\n    <string name=\"disable\">Disable</string>\n    <string name=\"enable\">Enable</string>\n    <string name=\"today_celebrates_one\">%1$s</string>\n    <string name=\"today_celebrates_two\">%1$s and %2$s</string>\n    <string name=\"today_celebrates_many\">%1$s and %2$d others</string>\n    <string name=\"about\">About</string>\n    <string name=\"service_dailyreminder\">Daily Reminder Service</string>\n    <string name=\"display_namedays\">Display Name Days</string>\n    <string name=\"display_namedays_on\">Name Days will be displayed for all of your contacts</string>\n    <string name=\"display_namedays_off\">Name Days will not be displayed</string>\n    <string name=\"contact_dev\">Contact the developer</string>\n    <string name=\"contact_dev_summary\">Found a bug? Have a suggestion? Let me know!</string>\n    <string name=\"choose\">Choose</string>\n    <string name=\"number\">number</string>\n    <string name=\"Call\">Call</string>\n    <string name=\"action_text\">Send SMS</string>\n    <string name=\"action_send_mail\">Send e-mail</string>\n    <string name=\"no_app_found\">No application found in order to perform this action</string>\n    <string name=\"send_mail_via\">Send e-mail via</string>\n    <string name=\"daily_reminder\">Daily Reminder</string>\n    <string name=\"daily_reminder_summary\">\"Remind me for every day's events\"</string>\n    <string name=\"Sound\">Sound</string>\n    <string name=\"vibrate\">Vibrate</string>\n    <string name=\"daily_reminder_time_summary\">Every day at %s</string>\n    <string name=\"set_time\">Set time</string>\n    <string name=\"set\">Set</string>\n    <string name=\"Discard\">Discard</string>\n    <string name=\"contact_added\">Contact added</string>\n    <string name=\"failed_to_add_contact\">Contact could not be added</string>\n    <string name=\"contact_updated\">Contact updated</string>\n    <string name=\"failed_to_update_contact\">Contact could not be updated</string>\n    <string name=\"label_widget_textonly\" translatable=\"false\">@string/upcoming</string>\n    <string name=\"ringtone_silent\">Silent</string>\n    <string name=\"contacts_today\">Contacts celebrating this day</string>\n    <string name=\"no_contacts_to_wish\">There are no contacts celebrating this day</string>\n    <string name=\"upcoming\">Upcoming</string>\n    <string name=\"turns_age\">Turns %1$d</string>\n    <string name=\"display_namedays_names\">Today\\'s Namedays</string>\n    <string name=\"share_text\">Check out %1$s - a sweet looking birthdays and namedays reminder app for Android! Get it at %2$s</string>\n    <string name=\"share_via\">Share via</string>\n    <string name=\"licences\">Licences</string>\n    <string name=\"about_dev\">Developed and designed by Alex Styl</string>\n    <string name=\"about_special_thanks\">\"Special thanks to\n\n        Andreas Sfakianakis for his work on the Greeklish library\n        Kosta Stoupas for the German translation\n        Aggela Stylianidou for the French translation\n        Gian Maria Calzolari for the Italian translation\n        Andrejs Kotovs for the Latvian translation\"</string>\n    <string name=\"about_thanks_special_someone\">and *%s* for using and supporting the app! :)</string>\n    <string name=\"about_contact\">Something is wrong with the app? Got a suggestion? Send an email at %s</string>\n    <string name=\"you\">You</string>\n    <string name=\"switch_on\">On</string>\n    <string name=\"switch_off\">Off</string>\n    <string name=\"thanks_for_support\">Thank you for supporting the app</string>\n    <string name=\"donate\">Donate</string>\n    <string name=\"loading\">Loading…</string>\n    <string name=\"action_search\">Search</string>\n    <string name=\"contacts\">Contacts</string>\n    <string name=\"search_namedays_on\">Nameday on</string>\n    <string name=\"show_more\">Show more</string>\n    <string name=\"create\">Create</string>\n    <!-- The name for contacts with empty Display name-->\n    <string name=\"no_name\">(No name)</string>\n    <string name=\"include_year\">Include year?</string>\n    <string name=\"Save\">Save</string>\n    <string name=\"add\">Add</string>\n    <string name=\"contact_no_birthday\">No birthday set</string>\n    <string name=\"contact_no_nameday\">No nameday for the name %s</string>\n    <string name=\"edit\">Edit</string>\n    <string name=\"Add_birthday\">Add birthday</string>\n    <string name=\"search\">Search</string>\n    <string name=\"and\">and</string>\n    <string name=\"Greek\">Greek</string>\n    <string name=\"Italian\">Italian</string>\n    <string name=\"Czech\">Czech</string>\n    <string name=\"Slovak\">Slovak</string>\n    <string name=\"Russian\">Russian</string>\n    <string name=\"Latvian_Traditional\">Latvian (Traditional)</string>\n    <string name=\"Latvian_Extended\">Latvian (Extended)</string>\n    <string name=\"Hungarian\">Hungarian</string>\n    <string name=\"nameday_language_title\">Nameday Calendar</string>\n    <string name=\"no_sound\">Silent</string>\n    <string name=\"label_widget_namedays\">\"Memento - Namedays\"</string>\n    <string name=\"share\">Share</string>\n    <string name=\"support_app\">Support the app</string>\n    <string name=\"fb_go_to_fanpage\">Open Facebook Page</string>\n    <string name=\"rate_rate_ask\">How would you rate the app?</string>\n    <string name=\"rate_1_stars\">\"It\\'s pretty much horrible\"</string>\n    <string name=\"rate_2_stars\">\"I don't like it\"</string>\n    <string name=\"rate_3_stars\">\"It's okay\"</string>\n    <string name=\"rate_4_stars\">\"It's good\"</string>\n    <string name=\"rate_5_stars\">\"I LOVE it!\"</string>\n    <string name=\"rate\">Rate</string>\n    <string name=\"message\">Message</string>\n    <string name=\"contact_turns_age\">%1$s turns %2$d</string>\n    <string name=\"no_results_found\">No results found</string>\n    <string name=\"contact_celebration_count\">%d contacts celebrate today</string>\n    <string name=\"todays_namedays\">Today\\'s Namedays</string>\n    <string name=\"celebrates_one_namedays\">\"Today's nameday\"</string>\n    <string name=\"celebrates_many_namedays\">\"Today's namedays\"</string>\n    <string name=\"action_via\">%s via…</string>\n    <string name=\"go_to_fb_short\">Like Page</string>\n    <string name=\"rate_app\">Rate the app</string>\n    <string name=\"like_page\">Like Facebook Page</string>\n    <string name=\"days_namedays\">Namedays for %1$s</string>\n    <string name=\"get_days\">Get %1$s at %2$s</string>\n    <string name=\"hide_names_hints\">You can hide names you don\\'t want to appear in the app, by long pressing on them.</string>\n    <string name=\"got_it\">OK, got it</string>\n    <string name=\"namedays_contacts_only_on\">Namedays will be displayed for stored contacts only</string>\n    <string name=\"namedays_contacts_only_off\">Namedays will be displays for the namedays of all year</string>\n    <string name=\"namedays_contacts_only\">Namedays for Contacts only</string>\n    <string name=\"support_message\">I hope you enjoy using the app, and it is useful for you. Here are some ways you can support the app:</string>\n    <string name=\"translate\">Translate the app</string>\n    <string name=\"translate_the_app_title\">Translating the app</string>\n    <string name=\"translate_the_app_message\">Visit the following url from your computer browser</string>\n    <!-- Neutral button on a dialog, saying that pressing the button will copy to clipboard the url to translate the app -->\n    <string name=\"copy_link\">Copy Link</string>\n    <string name=\"copied_to_clipboard\">Link copied to clipboard</string>\n    <string name=\"select_donation_amount\">Select the amount you would like to donate</string>\n    <string name=\"View_contact\">View contact</string>\n    <string name=\"no_birthday_set\">No birthday set</string>\n    <string name=\"No_contacts_with_events_found_Tap_the_plus_to_add_some\">\"No contacts with events found.\\nTap the '+' to add some\"</string>\n    <string name=\"No_contacts_with_events_found\">\"No contacts with special events found\"</string>\n    <string name=\"add_birthday\">Add birthday</string>\n    <string name=\"Birthday_date\">Birthday date</string>\n    <string name=\"Contact_name\">Contact name</string>\n    <string name=\"Themes\">Themes</string>\n    <string name=\"Romanian\">Romanian</string>\n    <string name=\"Configure_widget\">Configure Widget</string>\n    <string name=\"Done\">Done</string>\n    <string name=\"Transparency\">Transparency</string>\n    <string name=\"Use_dark_theme\">Use dark theme</string>\n    <string name=\"Contact_names\">Contact Names</string>\n    <string name=\"Bank_holiday\">Bank holiday</string>\n    <string name=\"Bank_holidays\">Bank holidays</string>\n    <string name=\"GoogleP_community\">Google+ community</string>\n    <string name=\"Display_Bankholidays\">Display Bank holidays</string>\n    <string name=\"Bankholidays_Country\">Country</string>\n    <string name=\"Bankholidays_are_currently_supported_only_for_Greek\">Bankholidays are currently supported only for Greek</string>\n    <string name=\"Clear\">Clear</string>\n    <string name=\"Search_for_contacts\">Search for contacts</string>\n    <string name=\"Search_for_contacts_or_namedays\">Search for contacts or namedays</string>\n    <string name=\"Memento_requires_your_permission_to_read_your_contacts_in_order_to_display_when_they_celebrate\">Memento requires your permission to read your contacts in order to display when they celebrate.</string>\n    <string name=\"Fact_Some_people_give_free_cake_to_those_who_wish_them_Happy_Birthday._Use_Memento_to_keep_track_of_potential_cake_givers\">Fact: Some people give free cake to those who wish them Happy Birthday. Use Memento to keep track of potential cake givers.</string>\n    <string name=\"Grant_permission\">Grant permission</string>\n    <string name=\"Use_all_parts_of_names\">Use all parts of names</string>\n    <string name=\"The_app_will_lookup_namedays_for_all_names_in_a_contact_including_surname\">\"The app will lookup namedays for all names in a contact (including surname).\"</string>\n    <string name=\"The_app_will_lookup_namedays_only_in_contacts_given_names_excluding_surname\">\"The app will lookup namedays only in contacts\\' given names (excluding surname).\"</string>\n    <string name=\"eventlabel_on_dateLabel\">%1$s on %2$s</string>\n    <string name=\"Anniversary\">Anniversary</string>\n    <string name=\"Other\">Other</string>\n    <string name=\"Custom\">Custom</string>\n    <string name=\"Add_event\">Add event</string>\n    <string name=\"Change_photo\">Change photo</string>\n    <string name=\"Remove_photo\">Remove photo</string>\n    <string name=\"Take_new_photo\">Take new photo</string>\n    <string name=\"Pick_existing_photo\">Pick existing photo</string>\n    <string name=\"Discard_changes\">Discard changes?</string>\n    <string name=\"No_events_on_this_date\">No events on this date</string>\n    <string name=\"Invite_friend\">Invite friend</string>\n    <string name=\"Facebook_Log_In\">Facebook Log In</string>\n    <string name=\"Your_Friends_will_be_here_shortly_smiley\">Your Friends will be here shortly :)</string>\n    <string name=\"An_error_came_up\">An error came up</string>\n    <string name=\"Try_again_in_a_bit\">Try again in a bit</string>\n    <string name=\"Hi_X\">Hi, %s!</string>\n    <string name=\"Import_from_Facebook\">Import from Facebook</string>\n    <string name=\"View_Facebook_Profile\">View Facebook Profile</string>\n    <string name=\"Friends_update_daily\">Friends update daily</string>\n    <string name=\"Memento_on_Facebook\">Memento on Facebook</string>\n    <string name=\"log_out\">Log out</string>\n    <string name=\"Facebook_profile\">Facebook Profile</string>\n    <string name=\"has_nameday_on\">Nameday on %s</string>\n    <string name=\"has_birthday_on\">Birthday on %s</string>\n    <string name=\"has_birthday_on_age\">Turns %1$d on %2$s</string>\n    <string name=\"title_add_birthday\">Add birthday</string>\n    <string name=\"Post_on_Facebook\">Post on Facebook</string>\n    <string name=\"romanian\">Romanian</string>\n    <string name=\"Open_Source\">Open Source</string>\n    <string name=\"Licenses\">Licences</string>\n    <string name=\"Donate_Remove_ads\">Donate - Remove ads</string>\n    <string name=\"Memento_on_Github\">Memento on Github</string>\n    <string name=\"Import_Birthdays\">Import Birthdays</string>\n    <string name=\"New\">New</string>\n    <string name=\"starsigns_aquarius\">Aquarius</string>\n    <string name=\"starsigns_pisces\">Pisces</string>\n    <string name=\"starsigns_aries\">Aries</string>\n    <string name=\"starsigns_taurus\">Taurus</string>\n    <string name=\"starsigns_gemini\">Gemini</string>\n    <string name=\"starsigns_cancer\">Cancer</string>\n    <string name=\"starsigns_leo\">Leo</string>\n    <string name=\"starsigns_virgo\">Virgo</string>\n    <string name=\"starsigns_libra\">Libra</string>\n    <string name=\"starsigns_scorpio\">Scorpio</string>\n    <string name=\"starsigns_sagittarius\">Sagittarius</string>\n    <string name=\"starsigns_capricorn\">Capricorn</string>\n    <string name=\"facebook_messenger\">Messenger</string>\n    <string name=\"phone_type_home\">Home</string>\n    <string name=\"phone_type_mobile\">Mobile</string>\n    <string name=\"phone_type_work\">Work</string>\n    <string name=\"View_conversation\">View conversation</string>\n    <string name=\"donation_donate_amount\">Donate %s</string>\n    <string name=\"donate_thanks_for_donating\">♥</string>\n    <string name=\"donate_welcome\">\"Hi, I'm Alex Styl\"</string>\n    <string name=\"donate_text\">\"Memento Calendar was developed in Greece for all those who don't want to forget their loved ones.\\n\\nIt feels great to see how well received Memento is both by users and devs! All these Play Store reviews and donations give me the strength to keep maintaining Memento with new features and polishing!\"\\n\\nMemento is a free application, supported by ads and donations. Donating any amount, removes all ads and grants you my infinite gratitude ♥.</string>\n    <string name=\"donate_restore_title\">Restore donation</string>\n    <string name=\"donate_restore_summary\">Placed a donation, but still see ads? Tap here</string>\n    <string name=\"donate_checking_for_donations\">Checking for donations</string>\n    <string name=\"donate_no_donation_found\">\"No donation found. Have you donated?\"</string>\n    <string name=\"Select_date\">Select date</string>\n    <string name=\"Facebook\">Facebook</string>\n    <string name=\"person_show\">Show</string>\n    <string name=\"person_hide\">Hide</string>\n    <string name=\"Welcome\">Welcome</string>\n    <string name=\"donate_hint\">\"Want to support Memento's development?\"</string>\n    <string name=\"Bank_holiday_subtitle\">Tap to see more events.</string>\n    <string name=\"Advanced_notification_settings\">Advanced notification settings</string>\n    <string name=\"daily_reminder_advanced_settings_summary\">Change sounds, vibration, lights and more.</string>\n    <string name=\"Send_wishes\">Send wishes</string>\n    <string name=\"Dont_forget_to_send_your_wishes\">\"Don't forget to send your wishes.\"</string>\n    <string name=\"dailyreminder_title_bankholiday\">\"Today's bank holiday\"</string>\n    <string name=\"Load_my_wallpaper\">Load my wallpaper</string>\n    <string name=\"Close\">Close</string>\n    <string name=\"Opacity\">Opacity</string>\n    <string name=\"Apply\">Apply</string>\n</resources>\n"
  },
  {
    "path": "android_common/src/main/res/values-cs/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- The original name of the app is Memento Calendar. In Greek though the name is Εορτολόγιο Memento (Nameday Almanac Memento)\nas the name makes more sense. If there is a local specific name, make sure to write it here. If not, leave it as is-->\n    <string name=\"localised_app_name\">Memento Calendar</string>\n    <string name=\"today\">Dnes</string>\n    <string name=\"tomorrow\">Zítra</string>\n    <string name=\"birthday\">Datum narození</string>\n    <string name=\"birthdays\">Narozeniny</string>\n    <string name=\"namedays\">Svátky</string>\n    <string name=\"nameday\">Svátek</string>\n    <string name=\"contacts_birthday\">\"%s má narozeniny\"</string>\n    <string name=\"contacts_nameday\">\"%s má svátek\"</string>\n    <string name=\"namedays_no_names\">Žádný svátek pro tento den</string>\n    <string name=\"birthday_no_birthday\">Žádný kontakt nemá narozeniny</string>\n    <string name=\"action_settings\">Nastavení</string>\n    <string name=\"disable\">Zakázat</string>\n    <string name=\"enable\">Povolit</string>\n    <string name=\"today_celebrates_one\">%1$s</string>\n    <string name=\"today_celebrates_two\">%1$s a %2$s</string>\n    <string name=\"today_celebrates_many\">%1$s a %2$d ostatní</string>\n    <string name=\"about\">O aplikaci</string>\n    <string name=\"service_dailyreminder\">Služba denního připomínání</string>\n    <string name=\"display_namedays\">Zobrazit svátky</string>\n    <string name=\"display_namedays_on\">Budou zobrazeny svátky pro všechny Vaše kontakty</string>\n    <string name=\"display_namedays_off\">Svátky nebudou zobrazeny</string>\n    <string name=\"contact_dev\">Kontakt na vývojáře</string>\n    <string name=\"contact_dev_summary\">Nalezl/a jste chybu? Máte námět? Dejte mi vědět!</string>\n    <string name=\"choose\">Vybrat</string>\n    <string name=\"number\">číslo</string>\n    <string name=\"Call\">Zavolat</string>\n    <string name=\"action_text\">Poslat SMS</string>\n    <string name=\"action_send_mail\">Poslat e-mail</string>\n    <string name=\"no_app_found\">Pro provedení této akce nebyla nalezena zádná aplikace</string>\n    <string name=\"send_mail_via\">Poslat emailem</string>\n    <string name=\"daily_reminder\">Denní připomínání</string>\n    <string name=\"daily_reminder_summary\">\"Připomínat každodenní události\"</string>\n    <string name=\"Sound\">Vyzváněcí tón</string>\n    <string name=\"vibrate\">Vibrace</string>\n    <string name=\"daily_reminder_time_summary\">Každý den v %s</string>\n    <string name=\"set_time\">Čas připomínky</string>\n    <string name=\"set\">Nastavit</string>\n    <string name=\"Discard\">Zrušit</string>\n    <string name=\"contact_added\">Kontakt přidán</string>\n    <string name=\"failed_to_add_contact\">Kontakt nemohl být přidán</string>\n    <string name=\"contact_updated\">Kontakt aktualizován</string>\n    <string name=\"failed_to_update_contact\">Kontakt nemohl být aktualizován</string>\n    <string name=\"ringtone_silent\">Tichý</string>\n    <string name=\"contacts_today\">Kontakty slavící dnes</string>\n    <string name=\"no_contacts_to_wish\">Žádné kontakty slavící tento den</string>\n    <string name=\"upcoming\">Nadcházející</string>\n    <string name=\"turns_age\">Slaví %1$d</string>\n    <string name=\"display_namedays_names\">Dnešní svátky</string>\n    <string name=\"share_text\">Ozkoušejte %1$s - pěknou aplikaci pro připomínání narozenin a svátků pro Android! Získejte ji zde %2$s</string>\n    <string name=\"share_via\">Sdílet přes</string>\n    <string name=\"licences\">Licence</string>\n    <string name=\"about_dev\">Vývoj a design Alex Styl</string>\n    <string name=\"about_special_thanks\">\"O překlad se zasloužili:\n\nAndreas Sfakianakis - řecký překlad\nKosta Stoupas - německý překlad\nAggele Stylianidou - francouzský překlad\nGian Maria Calzolari - italský překlad\nAndrejs Kotovs - lotyšský překlad\"</string>\n    <string name=\"about_thanks_special_someone\">a *%s* za používání a podporu aplikace</string>\n    <string name=\"about_contact\">Chyba v aplikaci? Máte nějaký podnět? Pošlete email na %s</string>\n    <string name=\"you\">Vy</string>\n    <string name=\"switch_on\">Zapnout</string>\n    <string name=\"switch_off\">Vypnout</string>\n    <string name=\"thanks_for_support\">Děkuji za podporu aplikace</string>\n    <string name=\"donate\">Darovat</string>\n    <string name=\"loading\">Nahrávání...</string>\n    <string name=\"action_search\">Hledat</string>\n    <string name=\"contacts\">Kontakty</string>\n    <string name=\"search_namedays_on\">Svátek dne</string>\n    <string name=\"show_more\">Více</string>\n    <string name=\"create\">Vytvořit</string>\n    <!-- The name for contacts with empty Display name-->\n    <string name=\"no_name\">(Beze jména)</string>\n    <string name=\"include_year\">Zahrnout rok?</string>\n    <string name=\"Save\">Uložit</string>\n    <string name=\"add\">Přidat</string>\n    <string name=\"contact_no_birthday\">Narozeniny nenastaveny</string>\n    <string name=\"contact_no_nameday\">Žádné narozeniny pro %s</string>\n    <string name=\"edit\">Upravit</string>\n    <string name=\"search\">Hledat</string>\n    <string name=\"and\">a</string>\n    <string name=\"Greek\">řecký</string>\n    <string name=\"Czech\">český</string>\n    <string name=\"Slovak\">slovenský</string>\n    <string name=\"Russian\">ruský</string>\n    <string name=\"Latvian_Traditional\">lotyšský</string>\n    <string name=\"Hungarian\">maďarský</string>\n    <string name=\"nameday_language_title\">Kalendář svátků</string>\n    <string name=\"no_sound\">Tichý</string>\n    <string name=\"label_widget_namedays\">\"Připomínač svátků\"</string>\n    <string name=\"share\">Sdílet</string>\n    <string name=\"support_app\">Aplikační podpora</string>\n    <string name=\"fb_go_to_fanpage\">Otevřít stránku Facebooku</string>\n    <string name=\"rate_rate_ask\">Jak aplikaci hodnotíte?</string>\n    <string name=\"rate_1_stars\">\"Je hrozná\"</string>\n    <string name=\"rate_2_stars\">\"Nemám ji moc rád\"</string>\n    <string name=\"rate_3_stars\">\"Je ok\"</string>\n    <string name=\"rate_4_stars\">\"Je dobrá\"</string>\n    <string name=\"rate_5_stars\">\"MILUJI ji!\"</string>\n    <string name=\"rate\">Hodnotit</string>\n    <string name=\"message\">Zpráva</string>\n    <string name=\"contact_turns_age\">%1$s slaví %2$d</string>\n    <string name=\"no_results_found\">Žádné výsledky nenalezeny</string>\n    <string name=\"contact_celebration_count\">Dnes slaví %d konkakty</string>\n    <string name=\"todays_namedays\">Dnešní svátky</string>\n    <string name=\"celebrates_one_namedays\">\"Dnešní svátek\"</string>\n    <string name=\"celebrates_many_namedays\">\"Dnešní svátky\"</string>\n    <string name=\"action_via\">%s přes…</string>\n    <string name=\"go_to_fb_short\">Jako strana</string>\n    <string name=\"rate_app\">Ohodnotit aplikaci</string>\n    <string name=\"like_page\">Pochválit stránku Facebooku</string>\n    <string name=\"days_namedays\">Narozeniny pro %1$s</string>\n    <string name=\"get_days\">Dostat %1$s v %2$s</string>\n    <string name=\"hide_names_hints\">Dlouhým stiskem můžete skrýt jména, která nechcete v aplikaci zobrazit</string>\n    <string name=\"got_it\">Ok, rozumím</string>\n    <string name=\"namedays_contacts_only_on\">Svátky budou zobrazeny pouze pro uložené kontakty</string>\n    <string name=\"namedays_contacts_only_off\">Svátky budou zobrazeny pro celý rok</string>\n    <string name=\"namedays_contacts_only\">Svátky pouze pro kontakty</string>\n    <string name=\"support_message\">Doufám, že se Vám aplikace líbí a je Vám užitečná. Tady jsou nějaké možnosti jak ji můžete podpořit:</string>\n    <string name=\"translate\">Přeložit aplikaci</string>\n    <string name=\"translate_the_app_title\">Překládání aplikace</string>\n    <string name=\"translate_the_app_message\">Navštívit následující odkaz ze svého počítače</string>\n    <!-- Neutral button on a dialog, saying that pressing the button will copy to clipboard the url to translate the app -->\n    <string name=\"copy_link\">Zkopírovat odkaz</string>\n    <string name=\"copied_to_clipboard\">Odkaz zkopírován do schránky</string>\n    <string name=\"select_donation_amount\">Vyber částku, kterou chcete darovat</string>\n    <string name=\"View_contact\">Zobrazit kontakt</string>\n    <string name=\"no_birthday_set\">Žádné narozeniny nastaveny</string>\n    <string name=\"No_contacts_with_events_found_Tap_the_plus_to_add_some\">\"Nenalezeny žádné kontakty se zvláštními událostmi\\nPoklepejte na '+' pro přidání\"</string>\n    <string name=\"No_contacts_with_events_found\">\"Nenalezeny žádné kontakty se zvláštními událostmi\"</string>\n    <string name=\"add_birthday\">Přidat narozeniny</string>\n    <string name=\"Birthday_date\">Datum narození</string>\n    <string name=\"Contact_name\">Jméno</string>\n    <string name=\"Themes\">Motiv</string>\n    <string name=\"Configure_widget\">Konfigurace widgetu</string>\n    <string name=\"Done\">Hotovo</string>\n    <string name=\"Transparency\">Průhlednost</string>\n    <string name=\"Use_dark_theme\">Tmavý motiv</string>\n    <string name=\"Contact_names\">Kontaktní jména</string>\n    <string name=\"Bank_holiday\">Státní svátek</string>\n    <string name=\"Bank_holidays\">Státní svátky</string>\n    <string name=\"GoogleP_community\">Google+ komunita</string>\n    <string name=\"Display_Bankholidays\">Zobrazit státní svátky</string>\n    <string name=\"Bankholidays_Country\">Státní svátky pro zemi</string>\n    <string name=\"Bankholidays_are_currently_supported_only_for_Greek\">Státní svátky jsou v současnosti podporovány pouze pro Řecko</string>\n    <string name=\"Clear\">Vymazat</string>\n    <string name=\"Search_for_contacts\">Hledat kontakty</string>\n    <string name=\"Search_for_contacts_or_namedays\">Hledat kontakty nebo svátky</string>\n    <string name=\"Memento_requires_your_permission_to_read_your_contacts_in_order_to_display_when_they_celebrate\">Memento požaduje Vaše svolení číst Vaše kontakty, aby zobrazilo datum oslavy.</string>\n    <string name=\"Fact_Some_people_give_free_cake_to_those_who_wish_them_Happy_Birthday._Use_Memento_to_keep_track_of_potential_cake_givers\">Fakt: Někteří lidé darují dort těm, kteří jim přejí vše nejlepší. Využijte Memento k dokumentování potencionálních dárců dortu.</string>\n    <string name=\"Grant_permission\">Povolit přístup.</string>\n    <string name=\"has_nameday_on\">Svátek %s</string>\n    <string name=\"has_birthday_on\">Narozeniny %s</string>\n    <string name=\"has_birthday_on_age\">%1$s slaví %2$d</string>\n    <string name=\"title_add_birthday\">Přidat narozeniny</string>\n    <string name=\"Post_on_Facebook\">Otevřít tabuli</string>\n    <string name=\"romanian\">Rumunsko</string>\n</resources>\n"
  },
  {
    "path": "android_common/src/main/res/values-de/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- The original name of the app is Memento Calendar. In Greek though the name is Εορτολόγιο Memento (Nameday Almanac Memento)\nas the name makes more sense. If there is a local specific name, make sure to write it here. If not, leave it as is-->\n    <string name=\"localised_app_name\">Memento Geburtstage</string>\n    <string name=\"today\">Heute</string>\n    <string name=\"tomorrow\">Morgen</string>\n    <string name=\"birthday\">Geburtstag</string>\n    <string name=\"birthdays\">Geburtstage</string>\n    <string name=\"namedays\">Namenstage</string>\n    <string name=\"nameday\">Namenstag</string>\n    <string name=\"contacts_birthday\">\"%s hat Geburtstag!\"</string>\n    <string name=\"contacts_nameday\">\"Es ist %s's Namenstag!\"</string>\n    <string name=\"namedays_no_names\">Keine Namenstage für heute</string>\n    <string name=\"birthday_no_birthday\">Keiner Ihrer Konatkte hat heute Geburtstag</string>\n    <string name=\"action_settings\">Einstellungen</string>\n    <string name=\"disable\">Deaktivieren</string>\n    <string name=\"enable\">Aktivieren</string>\n    <string name=\"today_celebrates_one\">%1$s</string>\n    <string name=\"today_celebrates_two\">%1$s und %2$s</string>\n    <string name=\"today_celebrates_many\">%1$s und %2$d weitere</string>\n    <string name=\"about\">Über</string>\n    <string name=\"service_dailyreminder\">Tägliche Erinnerung</string>\n    <string name=\"display_namedays\">Namenstage anzeigen</string>\n    <string name=\"display_namedays_on\">Namenstage werden für alle Ihre Kontakte angezeigt</string>\n    <string name=\"display_namedays_off\">Namenstage werden nicht angezeigt</string>\n    <string name=\"contact_dev\">Den Entwickler kontaktieren</string>\n    <string name=\"contact_dev_summary\">Haben Sie einen Bug gefunden? Oder Sie haben einen Vorschlag? Lassen Sie es uns wissen!</string>\n    <string name=\"choose\">Wähle</string>\n    <string name=\"number\">Nummer</string>\n    <string name=\"Call\">Anrufen</string>\n    <string name=\"action_text\">SMS schreiben</string>\n    <string name=\"action_send_mail\">Email schreiben</string>\n    <string name=\"no_app_found\">Es wurde keine Anwendung zum Durchführen dieser Aktion gefunden</string>\n    <string name=\"send_mail_via\">Email schreiben via</string>\n    <string name=\"daily_reminder\">Tägliche Erinnerung</string>\n    <string name=\"daily_reminder_summary\">\"Tägliche Erinnerung für jedes Ereignis\"</string>\n    <string name=\"Sound\">Klingelton</string>\n    <string name=\"vibrate\">Vibration</string>\n    <string name=\"daily_reminder_time_summary\">Jeden Tag um %s</string>\n    <string name=\"set_time\">Zeit festlegen</string>\n    <string name=\"set\">Fertig</string>\n    <string name=\"ringtone_silent\">Lautlos</string>\n    <string name=\"turns_age\">Wird %1$d</string>\n    <!-- The name for contacts with empty Display name-->\n    <string name=\"message\">Nachricht</string>\n    <!-- Neutral button on a dialog, saying that pressing the button will copy to clipboard the url to translate the app -->\n    <string name=\"has_nameday_on\">Namenstag am %s</string>\n    <string name=\"has_birthday_on\">Geburtstag am %s</string>\n    <string name=\"has_birthday_on_age\">Wird %1$d am %2$s</string>\n</resources>\n"
  },
  {
    "path": "android_common/src/main/res/values-el/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- The original name of the app is Memento Calendar. In Greek though the name is Εορτολόγιο Memento (Nameday Almanac Memento)\n  as the name makes more sense. If there is a local specific name, make sure to write it here. If not, leave it as is-->\n    <string name=\"localised_app_name\">Γιορτές Memento</string>\n    <string name=\"today\">Σήμερα</string>\n    <string name=\"tomorrow\">Αύριο</string>\n    <string name=\"birthday\">Γενέθλια</string>\n    <string name=\"birthdays\">Γενέθλια</string>\n    <string name=\"namedays\">Γιορτές</string>\n    <string name=\"nameday\">Γιορτή</string>\n    <string name=\"contacts_birthday\">\"Είναι τα γενέθλια του/της %s!\"</string>\n    <string name=\"contacts_nameday\">\"Γιορτάζει ο/η %s!\"</string>\n    <string name=\"namedays_no_names\">Καμία ονομαστική εορτή για αυτήν την ημέρα</string>\n    <string name=\"birthday_no_birthday\">Καμία επαφή δεν έχει γενέθλια αυτήν την ημέρα</string>\n    <string name=\"action_settings\">Ρυθμίσεις</string>\n    <string name=\"disable\">Απενεργοποίηση</string>\n    <string name=\"enable\">Ενεργό</string>\n    <string name=\"today_celebrates_one\">%1$s</string>\n    <string name=\"today_celebrates_two\">%1$s και %2$s</string>\n    <string name=\"today_celebrates_many\">%1$s και %2$d άλλοι</string>\n    <string name=\"about\">Σχετικά</string>\n    <string name=\"service_dailyreminder\">Υπηρεσία Καθημερινής Υπενθύμισης</string>\n    <string name=\"display_namedays\">Εμφάνιση Ονομαστικών Εορτών</string>\n    <string name=\"display_namedays_on\">Οι Ονομαστικές Εορτές εμφανίζονται για όλες τις επαφές</string>\n    <string name=\"display_namedays_off\">Οι Ονομαστικές Εορτές δεν θα εμφανίζονται</string>\n    <string name=\"contact_dev\">Επικοινωνία</string>\n    <string name=\"contact_dev_summary\">Παρουσιάστηκε κάποιο πρόβλημα; Έχετε κάποια πρόταση για την εφαρμογή; Πατήστε εδώ</string>\n    <string name=\"choose\">Επιλογή</string>\n    <string name=\"number\">αριθμού</string>\n    <string name=\"Call\">Κλήση</string>\n    <string name=\"action_text\">Αποστολή SMS</string>\n    <string name=\"action_send_mail\">Αποστολή e-mail</string>\n    <string name=\"no_app_found\">Δεν βρέθηκε κάποια εγκατεστημένη εφαρμογή για να ολοκληρωθεί αυτή η ενέργεια</string>\n    <string name=\"send_mail_via\">Αποστολή e-mail μέσω</string>\n    <string name=\"daily_reminder\">Καθημερινή Υπενθύμιση</string>\n    <string name=\"daily_reminder_summary\">\"Θύμιζέ μου τις γιορτές και τα γενέθλια της κάθε ημέρας\"</string>\n    <string name=\"Sound\">Ήχος</string>\n    <string name=\"vibrate\">Δόνηση</string>\n    <string name=\"daily_reminder_time_summary\">Κάθε μέρα στις %s</string>\n    <string name=\"set_time\">Ρύθμιση Ώρας</string>\n    <string name=\"set\">Τέλος</string>\n    <string name=\"Discard\">Ακύρωση</string>\n    <string name=\"contact_added\">Η επαφή δημιουργήθηκε</string>\n    <string name=\"failed_to_add_contact\">Η επαφή δεν προστέθηκε</string>\n    <string name=\"contact_updated\">Η επαφή ανανεώθηκε</string>\n    <string name=\"failed_to_update_contact\">Η επαφή δεν ενημερώθηκε</string>\n    <string name=\"ringtone_silent\">Αθόρυβο</string>\n    <string name=\"contacts_today\">Επαφές που γιορτάζουν αυτή την ημέρα</string>\n    <string name=\"no_contacts_to_wish\">Δεν γιορτάζει καμία επαφή αυτή την ημέρα</string>\n    <string name=\"upcoming\">Επερχόμενες</string>\n    <string name=\"turns_age\">Γίνεται %1$d</string>\n    <string name=\"display_namedays_names\">Σημερινές Εορτές</string>\n    <string name=\"share_text\">Δείτε το %1$s - μια μοντέρνα εφαρμογή για γενέθλια και ονομαστικές γιορτες επαφών για Android! Κατεβαστε το στο %2$s</string>\n    <string name=\"share_via\">Μοιραστείτε μέσω</string>\n    <string name=\"licences\">Άδειες</string>\n    <string name=\"about_dev\">Υλοποιήθηκε και σχεδιάστηκε από τον Alex Styl</string>\n    <string name=\"about_special_thanks\">\"Πολλά ευχαριστώ στους\\n\n        \\nAndreas Sfakianakis για την βιβλιοθήκη για τους Greeklish χαρακτήρες\n        \\nKosta Stoupas για την Γερμανική μετάφραση\n        \\nAggela Stylianidou για την Γαλλική μετάφραση\"</string>\n    <string name=\"about_thanks_special_someone\">και *%s* που χρησιμοποιείται και υποστηρίζεται την εφαρμογή! :)</string>\n    <string name=\"about_contact\">Κάτι πάει στραβά με την εφαρμογή; Θέλετε κάτι νέο να προστεθεί; Στείλτε e-mail στο %s</string>\n    <string name=\"you\">Εσάς</string>\n    <string name=\"switch_on\">Ενεργό</string>\n    <string name=\"switch_off\">Ανενεργό</string>\n    <string name=\"thanks_for_support\">Σας ευχαριστώ για την υποστήριξη</string>\n    <string name=\"donate\">Δωρεά</string>\n    <string name=\"loading\">Άνοιγμα…</string>\n    <string name=\"action_search\">Αναζητήστε</string>\n    <string name=\"contacts\">Επαφές</string>\n    <string name=\"search_namedays_on\">Γιορτάζει στις</string>\n    <string name=\"show_more\">Εμφάνισε περισσότερα</string>\n    <string name=\"create\">Δημιούργησε</string>\n    <!-- The name for contacts with empty Display name-->\n    <string name=\"no_name\">(Ακατανόμαστος)</string>\n    <string name=\"include_year\">με έτος γέννησης;</string>\n    <string name=\"Save\">Αποθήκευση</string>\n    <string name=\"add\">Προσθήκη</string>\n    <string name=\"contact_no_birthday\">Χωρίς γενέθλια</string>\n    <string name=\"contact_no_nameday\">Δεν υπάρχει ονομαστική εορτή για το όνομα %s</string>\n    <string name=\"edit\">Επεξεργασία</string>\n    <string name=\"Add_birthday\">Προσθήκη γενεθλίων</string>\n    <string name=\"search\">Αναζήτηση</string>\n    <string name=\"and\">και</string>\n    <string name=\"Greek\">Ελληνικά</string>\n    <string name=\"Italian\">Ιταλικά</string>\n    <string name=\"Czech\">Τσέχικα</string>\n    <string name=\"Slovak\">Σλοβάκικα</string>\n    <string name=\"Russian\">Ρώσικα</string>\n    <string name=\"Latvian_Traditional\">Λατβικά</string>\n    <string name=\"Hungarian\">Ουγγρικά</string>\n    <string name=\"nameday_language_title\">Γλώσσα Εορτολογίου</string>\n    <string name=\"no_sound\">Αθόρυβο</string>\n    <string name=\"label_widget_namedays\">\"Γιορτές - Ονομαστικές Εορτές\"</string>\n    <string name=\"share\">Μοιραστείτε</string>\n    <string name=\"support_app\">Υποστηρίξτε την εφαρμογή</string>\n    <string name=\"fb_go_to_fanpage\">Άνοιγα της Facebook σελίδας</string>\n    <string name=\"rate_rate_ask\">Πως θα βαθμολογούσατε την εφαρμογή;</string>\n    <string name=\"rate_1_stars\">\"Είναι απαίσια\"</string>\n    <string name=\"rate_2_stars\">\"Δεν μου αρέσει\"</string>\n    <string name=\"rate_3_stars\">\"Είναι εντάξει\"</string>\n    <string name=\"rate_4_stars\">\"Πολύ καλή\"</string>\n    <string name=\"rate_5_stars\">\"Την ΛΑΤΡΕΥΩ!\"</string>\n    <string name=\"rate\">Βαθμολογείστε</string>\n    <string name=\"message\">Μήνυμα</string>\n    <string name=\"contact_turns_age\">Ο/η %1$s γίνεται %2$d</string>\n    <string name=\"no_results_found\">Δεν βρέθηκαν αποτελέσματα</string>\n    <string name=\"contact_celebration_count\">%d επαφές γιορτάζουν σήμερα</string>\n    <string name=\"todays_namedays\">Σημερινές Εορτές</string>\n    <string name=\"celebrates_one_namedays\">\"Η γιορτή της ημέρας\"</string>\n    <string name=\"celebrates_many_namedays\">\"Οι γιορτές της ημέρας\"</string>\n    <string name=\"action_via\">%s μέσω…</string>\n    <string name=\"go_to_fb_short\">Κάντε Like στην σελίδα</string>\n    <string name=\"rate_app\">Βαθμολογίστε την εφαρμογή</string>\n    <string name=\"like_page\">Κάντε Like στην σελίδα</string>\n    <string name=\"days_namedays\">Ονομαστικές εορτές για %1$s</string>\n    <string name=\"get_days\">Κατεβάστε το %1$s στο %2$s</string>\n    <string name=\"hide_names_hints\">Μπορείτε να κρύψετε ονομαστικές εορτές, πατώντας παρατεταμένα πάντως τους.</string>\n    <string name=\"got_it\">ΟΚ, το \\'πιασα.</string>\n    <string name=\"namedays_contacts_only_on\">Οι Ονομαστικές εορτές θα εμφανίζονται μόνο για τις αποθηκευμένες επαφές</string>\n    <string name=\"namedays_contacts_only_off\">Οι Ονομαστικές εορτές θα εμφανίζονται για όλες τις ημέρες του χρόνου</string>\n    <string name=\"namedays_contacts_only\">Μόνο για επαφές</string>\n    <string name=\"support_message\">Ελπίζω να σας αρέσει η εφαρμογή και να σας είναι χρήσιμη. Αν θέλετε να υποστηρίξετε την εφαρμογή, μπορείτε να επιλέξετε κάτι από τα παρακάτω</string>\n    <string name=\"translate\">Μεταφράστε την εφαρμογή</string>\n    <string name=\"translate_the_app_title\">Μετάφραση την εφαρμογή</string>\n    <string name=\"translate_the_app_message\">Επισκεφθείτε το url απο τον browser του υπολογιστή σας</string>\n    <!-- Neutral button on a dialog, saying that pressing the button will copy to clipboard the url to translate the app -->\n    <string name=\"copy_link\">Αντιγραφή</string>\n    <string name=\"copied_to_clipboard\">Το URL αντιγράφθηκε στο πρόχειρο</string>\n    <string name=\"select_donation_amount\">Επιλέξτε το ποσό που θα θέλατε να προσφέρετε</string>\n    <string name=\"View_contact\">Προβολή επαφής</string>\n    <string name=\"no_birthday_set\">Δεν έχει οριστεί ημερομηνία γενεθλίων</string>\n    <string name=\"No_contacts_with_events_found_Tap_the_plus_to_add_some\">\"Δεν βρέθηκαν επαφές με εορτές. Πατήστε το '+' για προσθήκη\"</string>\n    <string name=\"No_contacts_with_events_found\">\"Δεν βρέθηκαν επαφές με εορτές\"</string>\n    <string name=\"add_birthday\">Προσθήκη γενεθλίων</string>\n    <string name=\"Birthday_date\">Ημερομηνία γενεθλίων</string>\n    <string name=\"Contact_name\">Όνομα επαφής</string>\n    <string name=\"Themes\">Θέματα</string>\n    <string name=\"Romanian\">Ρωμανικά</string>\n    <string name=\"Configure_widget\">Ρύθμιση Γρ. Στοιχείου</string>\n    <string name=\"Done\">Αποθήκευση</string>\n    <string name=\"Transparency\">Διαφάνεια</string>\n    <string name=\"Use_dark_theme\">Σκοτεινό θέμα;</string>\n    <string name=\"Contact_names\">Ονόματα επαφών</string>\n    <string name=\"Bank_holiday\">Αργία</string>\n    <string name=\"Bank_holidays\">Αργίες</string>\n    <string name=\"GoogleP_community\">Κοινότητα Google+</string>\n    <string name=\"Display_Bankholidays\">Προβολή αργίων</string>\n    <string name=\"Bankholidays_Country\">Χώρα αργίων</string>\n    <string name=\"Bankholidays_are_currently_supported_only_for_Greek\">Οι αργίες υποστηρίζονται μόνο για την Ελλάδα αυτή τη στιγμή</string>\n    <string name=\"Clear\">Καθάρισμα</string>\n    <string name=\"Search_for_contacts\">Αναζήτηση επαφών</string>\n    <string name=\"Search_for_contacts_or_namedays\">Αναζήτηση επαφών ή εορτών</string>\n    <string name=\"Memento_requires_your_permission_to_read_your_contacts_in_order_to_display_when_they_celebrate\">Το Memento χρειάζεται την άδειά σας για να διαβάσει τις επαφές σας προκειμένου να μπορεί να σας πει πότε γιορτάζουν.</string>\n    <string name=\"Fact_Some_people_give_free_cake_to_those_who_wish_them_Happy_Birthday._Use_Memento_to_keep_track_of_potential_cake_givers\">Μερικοί άνθρωποι δίνουν δωρεάν γλυκό σε όποιον τους πει Χρόνια Πολλά. Χρησιμοποιήστε το Memento για να είσαστε ενήμεροι για το ποιοι γιορτάζουν.</string>\n    <string name=\"Grant_permission\">Δώστε άδεια</string>\n    <string name=\"Use_all_parts_of_names\">Χρήση όλων των ονομάτων επαφών</string>\n    <string name=\"The_app_will_lookup_namedays_for_all_names_in_a_contact_including_surname\">\"Η εφαρμογή θα προσπαθήσει να βρει ονομαστικές εορτές από όλα τα ονόματα κάθε επαφής (συμπεριλαμβανομένου του επωνύμου)\"</string>\n    <string name=\"The_app_will_lookup_namedays_only_in_contacts_given_names_excluding_surname\">\"Η εφαρμογή θα προσπαθήσει να βρει ονομαστικές εορτές μόνο από τα μικρά ονόματα κάθε επαφές (χωρίς το επώνυμο)\"</string>\n    <string name=\"eventlabel_on_dateLabel\">%1$s στις %2$s</string>\n    <string name=\"Anniversary\">Επέτειοι</string>\n    <string name=\"Other\">Άλλο</string>\n    <string name=\"Add_event\">Προσθήκη γεγονότος</string>\n    <string name=\"Change_photo\">Αλλαγή φωτογραφίας</string>\n    <string name=\"Remove_photo\">Αφαίρεση φωτογραφίας</string>\n    <string name=\"Take_new_photo\">Λήψη νέας φωτογραφίας</string>\n    <string name=\"Pick_existing_photo\">Επιλογή υπάρχουσας φωτογραφίας</string>\n    <string name=\"Discard_changes\">Ακύρωση αλλαγών;</string>\n    <string name=\"No_events_on_this_date\">Δεν υπάρχει γεγονότα για αυτή την ημερομηνία</string>\n    <string name=\"Invite_friend\">Πρόσκληση φίλου</string>\n    <string name=\"Facebook_Log_In\">Σύνδεση στο Facebook</string>\n    <string name=\"Your_Friends_will_be_here_shortly_smiley\">Οι Φίλοι σας είναι καθοδόν :)</string>\n    <string name=\"An_error_came_up\">Παρουσιάσθηκε κάποιο σφάλμα</string>\n    <string name=\"Try_again_in_a_bit\">Δοκιμάστε ξανά σε λιγάκι</string>\n    <string name=\"Hi_X\">Γεια σου, %s!</string>\n    <string name=\"Import_from_Facebook\">Εισαγωγή από το Facebook</string>\n    <string name=\"Friends_update_daily\">Οι φίλοι ανανεώνονται καθημερινά</string>\n    <string name=\"Memento_on_Facebook\">Το Memento στο Facebook</string>\n    <string name=\"log_out\">Αποσύνδεση</string>\n    <string name=\"Facebook_profile\">Facebook προφίλ</string>\n    <string name=\"has_nameday_on\">Γιορτάζει την %s</string>\n    <string name=\"has_birthday_on\">Γενέθλια την %s</string>\n    <string name=\"has_birthday_on_age\">Γίνεται %1$d την %2$s</string>\n    <string name=\"title_add_birthday\">Προσθήκη γενεθλίων</string>\n    <string name=\"Post_on_Facebook\">Άνοιγμα Τοίχου</string>\n    <string name=\"romanian\">Ρωμάνικα</string>\n    <string name=\"Advanced_notification_settings\">Περισσότερες ρυθμίσεις</string>\n    <string name=\"daily_reminder_advanced_settings_summary\">Αλλάξτε τον ήχο, την δόνηση, το χρώμα του LED και άλλα.</string>\n    <string name=\"Dont_forget_to_send_your_wishes\">\"Μην ξεχάσετε να τους ευχηθείτε.\"</string>\n</resources>\n"
  },
  {
    "path": "android_common/src/main/res/values-fr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- The original name of the app is Memento Calendar. In Greek though the name is Εορτολόγιο Memento (Nameday Almanac Memento)\nas the name makes more sense. If there is a local specific name, make sure to write it here. If not, leave it as is-->\n    <string name=\"localised_app_name\">Memento Fêtes</string>\n    <string name=\"today\">Aujourd\\'hui</string>\n    <string name=\"tomorrow\">Demain</string>\n    <string name=\"birthday\">Anniversaire</string>\n    <string name=\"birthdays\">Anniversaires</string>\n    <string name=\"namedays\">Fêtes</string>\n    <string name=\"nameday\">Fête</string>\n    <string name=\"contacts_birthday\">\"C'est l'anniversaire de %s!\"</string>\n    <string name=\"contacts_nameday\">\"C'est la fête de %s!\"</string>\n    <string name=\"namedays_no_names\">Pas de fête aujourd\\'hui</string>\n    <string name=\"birthday_no_birthday\">Pas de contact ayant son anniversaire aujourd\\'hui</string>\n    <string name=\"action_settings\">Paramètres</string>\n    <string name=\"disable\">Désactivation</string>\n    <string name=\"enable\">Activation</string>\n    <string name=\"today_celebrates_one\">%1$s</string>\n    <string name=\"today_celebrates_two\">%1$s et %2$s</string>\n    <string name=\"today_celebrates_many\">%1$s et %2$d encore</string>\n    <string name=\"about\">À propos</string>\n    <string name=\"service_dailyreminder\">Service de rappel quotidien</string>\n    <string name=\"display_namedays\">Apparition des fêtes</string>\n    <string name=\"display_namedays_on\">Les fêtes se montreront pour tous les contacts</string>\n    <string name=\"display_namedays_off\">Les fêtes ne se montreront pas</string>\n    <string name=\"contact_dev\">Communiquez avec le programmateur</string>\n    <string name=\"contact_dev_summary\">Est-ce qu\\'il y a des problèmes? Est-ce que vous avez des suggestions concernant l\\' application? Touchez ici</string>\n    <string name=\"choose\">Choisissez</string>\n    <string name=\"number\">un numéro de téléphone</string>\n    <string name=\"Call\">Appel</string>\n    <string name=\"action_text\">Envoi un message</string>\n    <string name=\"action_send_mail\">Envoi un courriel</string>\n    <string name=\"no_app_found\">Pas d\\' application existante afin que cette action se termine</string>\n    <string name=\"send_mail_via\">Envoi un courriel via</string>\n    <string name=\"daily_reminder\">Rappel quotidien</string>\n    <string name=\"daily_reminder_summary\">\"Rappelle-moi les fêtes et les anniversaires de chaque jour\"</string>\n    <string name=\"Sound\">Son</string>\n    <string name=\"vibrate\">Vibrer au rappel</string>\n    <string name=\"daily_reminder_time_summary\">Chaque jour à %s</string>\n    <string name=\"set_time\">Réglage de l\\'heure</string>\n    <string name=\"set\">Fin</string>\n    <string name=\"ringtone_silent\">Silencieux</string>\n    <string name=\"contacts_today\">Contacts qui fêtent aujourd\\'hui</string>\n    <string name=\"no_contacts_to_wish\">Pas de contacts ayant sα fête ou son anniversaire aujourd\\'hui</string>\n    <string name=\"turns_age\">Aura %1$d</string>\n    <string name=\"share_text\">Voyez %1$s - Une application moderne pour les anniversaires et les fêtes des contacts pour Android!Téléchargez-la à %2$s</string>\n    <string name=\"share_via\">Partagez via</string>\n    <string name=\"licences\">Licences</string>\n    <string name=\"about_dev\">Développée et dessinée par Alex Styl</string>\n    <string name=\"about_special_thanks\">\"Remerciements spéciaux\\n\n        \\nAndreas Sfakianakis pour son travail à la librairie de Greeklish\n        \\nKosta Stoupas pour la traduction en allemand\n        \\nAggela Stylianidou pour la traduction en français\"</string>\n    <string name=\"about_thanks_special_someone\">et *%s* qui utilisez et supportez l\\'application! :)</string>\n    <string name=\"about_contact\">Est-se qu\\' il y a des problèmes concernant l\\' application? Est-ce que vous avez des suggestions concernant l\\' application? Envoyez un courriel à %s</string>\n    <string name=\"you\">Vous</string>\n    <string name=\"thanks_for_support\">Merci de supporter l\\'application</string>\n    <!-- The name for contacts with empty Display name-->\n    <string name=\"search\">Rechercher</string>\n    <string name=\"and\">et</string>\n    <string name=\"no_sound\">Silencieux</string>\n    <string name=\"share\">Partager</string>\n    <string name=\"support_app\">Supporter l\\'application</string>\n    <string name=\"fb_go_to_fanpage\">Ouvrir Facebook</string>\n    <string name=\"rate_rate_ask\">Comment évalueriez-vous l\\'application?</string>\n    <string name=\"rate_1_stars\">\"C\\'est un peu horrible\"</string>\n    <string name=\"rate_2_stars\">\"Je ne l'aime pas\"</string>\n    <string name=\"rate_3_stars\">\"C'est ok\"</string>\n    <string name=\"rate_4_stars\">\"C'est bien\"</string>\n    <string name=\"rate_5_stars\">\"Je l'adore!\"</string>\n    <string name=\"rate\">Evaluer</string>\n    <string name=\"message\">Message</string>\n    <string name=\"no_results_found\">Aucun résultat trouvé</string>\n    <!-- Neutral button on a dialog, saying that pressing the button will copy to clipboard the url to translate the app -->\n    <string name=\"has_nameday_on\">Sa fête est %s</string>\n    <string name=\"has_birthday_on\">Son anniversaire est %s</string>\n    <string name=\"has_birthday_on_age\">Aura %1$d ans %2$s</string>\n    <string name=\"title_add_birthday\">Ajouter anniversaire</string>\n</resources>\n"
  },
  {
    "path": "android_common/src/main/res/values-it/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- The original name of the app is Memento Calendar. In Greek though the name is Εορτολόγιο Memento (Nameday Almanac Memento)\nas the name makes more sense. If there is a local specific name, make sure to write it here. If not, leave it as is-->\n    <string name=\"localised_app_name\">Memento Calendar</string>\n    <string name=\"today\">Oggi</string>\n    <string name=\"tomorrow\">Domani</string>\n    <string name=\"birthday\">Compleanno</string>\n    <string name=\"birthdays\">Compleanni</string>\n    <string name=\"namedays\">Onomastici</string>\n    <string name=\"nameday\">Onomastico</string>\n    <string name=\"contacts_birthday\">\"E' il compleanno di %s!\"</string>\n    <string name=\"contacts_nameday\">\"E' l'onomastico di %s!\"</string>\n    <string name=\"namedays_no_names\">Nessun onomastico in questo giorno</string>\n    <string name=\"birthday_no_birthday\">Nessun compleanno in questo giorno</string>\n    <string name=\"action_settings\">Impostazioni</string>\n    <string name=\"disable\">Disattiva</string>\n    <string name=\"enable\">Attiva</string>\n    <string name=\"today_celebrates_one\">%1$s</string>\n    <string name=\"today_celebrates_two\">%1$s e %2$s</string>\n    <string name=\"today_celebrates_many\">%1$s e altri %2$d</string>\n    <string name=\"about\">Informazioni</string>\n    <string name=\"service_dailyreminder\">Servizio di notifica giornaliera</string>\n    <string name=\"display_namedays\">Visualizza onomastici</string>\n    <string name=\"display_namedays_on\">Verranno visualizzati gli onomastici per tutti i tuoi contatti</string>\n    <string name=\"display_namedays_off\">Gli onomastici non verranno visualizzati</string>\n    <string name=\"contact_dev\">Contatta lo sviluppatore</string>\n    <string name=\"contact_dev_summary\">Hai trovato un bug? Hai un suggerimento? Fammelo sapere!</string>\n    <string name=\"choose\">Scegli</string>\n    <string name=\"number\">numero</string>\n    <string name=\"Call\">Chiama</string>\n    <string name=\"action_text\">Invia SMS</string>\n    <string name=\"action_send_mail\">Invia e-mail</string>\n    <string name=\"no_app_found\">Nessuna applicazione trovata per questa azione</string>\n    <string name=\"send_mail_via\">Invia e-mail con</string>\n    <string name=\"daily_reminder\">Notifica giornaliera</string>\n    <string name=\"daily_reminder_summary\">\"Notificami per ogni evento del giorno\"</string>\n    <string name=\"Sound\">Suoneria</string>\n    <string name=\"vibrate\">Vibrazione</string>\n    <string name=\"daily_reminder_time_summary\">Ogni giorno alle %s</string>\n    <string name=\"set_time\">Imposta ora</string>\n    <string name=\"set\">Imposta</string>\n    <string name=\"Discard\">Ignora</string>\n    <string name=\"contact_added\">Contatto aggiunto</string>\n    <string name=\"failed_to_add_contact\">Il contatto non può essere aggiunto</string>\n    <string name=\"contact_updated\">Contatto aggiornato</string>\n    <string name=\"failed_to_update_contact\">Il contatto non può essere aggiornato</string>\n    <string name=\"ringtone_silent\">Silenzioso</string>\n    <string name=\"contacts_today\">Contatti che celebrano oggi</string>\n    <string name=\"no_contacts_to_wish\">Nessun contatto celebra oggi</string>\n    <string name=\"upcoming\">Prossimamente</string>\n    <string name=\"turns_age\">Compie %1$d anni</string>\n    <string name=\"display_namedays_names\">Onomastici di oggi</string>\n    <string name=\"share_text\">Prova %1$s - una bella app di promemoria per compleanni e onomastici per Android! Installala da %2$s</string>\n    <string name=\"share_via\">Condividi con</string>\n    <string name=\"licences\">Licenze</string>\n    <string name=\"about_dev\">Sviluppato e progettato da Alex Styl</string>\n    <string name=\"about_special_thanks\">\"Ringraziamenti speciali a\n\nAndreas Sfakianakis per il suo lavoro alla libreria di translitterazione dal Greco (\"Greeklish\")\nKosta Stoupas per la traduzione in Tedesco\nAggela Stylianidou per la traduzione in Francese\nGian Maria Calzolari per la traduzione in Italiano\nAndrejs Kotovs per la traduzione in Lituano\"</string>\n    <string name=\"about_thanks_special_someone\">e *%s* perché usi e supporti l\\'app! :)</string>\n    <string name=\"about_contact\">C\\'è qualche cosa di errato nella app? Hai un suggerimento? Invia una e-mail a %s</string>\n    <string name=\"you\">Tu</string>\n    <string name=\"switch_on\">Attivo</string>\n    <string name=\"switch_off\">Spento</string>\n    <string name=\"thanks_for_support\">Grazie per supportare l\\'app</string>\n    <string name=\"donate\">Dona</string>\n    <string name=\"loading\">Sto caricando...</string>\n    <string name=\"action_search\">Cerca</string>\n    <string name=\"contacts\">Contatti</string>\n    <string name=\"search_namedays_on\">Onomastico il</string>\n    <string name=\"show_more\">Mostra altri</string>\n    <string name=\"create\">Crea</string>\n    <!-- The name for contacts with empty Display name-->\n    <string name=\"no_name\">(Nessun nome)</string>\n    <string name=\"include_year\">Includi l\\'anno?</string>\n    <string name=\"Save\">Salva</string>\n    <string name=\"add\">Aggiungi</string>\n    <string name=\"contact_no_birthday\">Compleanno non impostato</string>\n    <string name=\"contact_no_nameday\">Nessun onomastico per il nome %s</string>\n    <string name=\"edit\">Modifica</string>\n    <string name=\"Add_birthday\">Aggiungi compleanno</string>\n    <string name=\"search\">Cerca</string>\n    <string name=\"and\">e</string>\n    <string name=\"Greek\">Greco</string>\n    <string name=\"Italian\">Italiano</string>\n    <string name=\"Czech\">Ceco</string>\n    <string name=\"Slovak\">Slovacco</string>\n    <string name=\"Russian\">Russo</string>\n    <string name=\"Latvian_Traditional\">Lituano</string>\n    <string name=\"Hungarian\">Ungherese</string>\n    <string name=\"nameday_language_title\">Calendario onomastico</string>\n    <string name=\"no_sound\">Silenzioso</string>\n    <string name=\"label_widget_namedays\">\"Memento - Onomastici\"</string>\n    <string name=\"share\">Condividi</string>\n    <string name=\"support_app\">Supporta l\\'app</string>\n    <string name=\"fb_go_to_fanpage\">Vai alla pagina Facebook</string>\n    <string name=\"rate_rate_ask\">Quanto valuteresti l\\'app?</string>\n    <string name=\"rate_1_stars\">\"Pessima\"</string>\n    <string name=\"rate_2_stars\">\"Non mi piace\"</string>\n    <string name=\"rate_3_stars\">\"Va bene\"</string>\n    <string name=\"rate_4_stars\">\"Mi è piaciuta\"</string>\n    <string name=\"rate_5_stars\">\"L'adoro!\"</string>\n    <string name=\"rate\">Valutazione</string>\n    <string name=\"message\">Messaggio</string>\n    <string name=\"contact_turns_age\">%1$s compie %2$d anni</string>\n    <string name=\"no_results_found\">Nessun risultato trovato</string>\n    <string name=\"contact_celebration_count\">%d contatti celebrano oggi</string>\n    <string name=\"todays_namedays\">Onomastici di oggi</string>\n    <string name=\"celebrates_one_namedays\">\"Onomastico di oggi\"</string>\n    <string name=\"celebrates_many_namedays\">\"Onomastici di oggi\"</string>\n    <string name=\"action_via\">%s con…</string>\n    <string name=\"go_to_fb_short\">Mi piace</string>\n    <string name=\"rate_app\">Valuta l\\'app</string>\n    <string name=\"like_page\">Mi piace su Facebook</string>\n    <string name=\"days_namedays\">Onomastici del %1$s</string>\n    <string name=\"get_days\">Installa %1$s da %2$s</string>\n    <string name=\"hide_names_hints\">Puoi nascondere I nomi che non vuoi visualizzare nella app premendoli a lungo.</string>\n    <string name=\"got_it\">OK, ho capito</string>\n    <string name=\"namedays_contacts_only_on\">Verranno visualizzati gli onomastici solo per i contatti memorizzati</string>\n    <string name=\"namedays_contacts_only_off\">Verranno visualizzati tutti gli onomastici dell\\'anno</string>\n    <string name=\"namedays_contacts_only\">Onomastici solo per i contatti</string>\n    <string name=\"support_message\">Mi auguro che tu sia soddisfatto della app e che ti sia utile. Ecco alcuni modi per supportarmi:</string>\n    <string name=\"translate\">Tradurre l\\'applicazione</string>\n    <string name=\"translate_the_app_title\">Per tradurre l\\'applicazione</string>\n    <string name=\"translate_the_app_message\">Visita l\\'url seguente dal browser del tuo computer</string>\n    <!-- Neutral button on a dialog, saying that pressing the button will copy to clipboard the url to translate the app -->\n    <string name=\"copy_link\">Copia il link</string>\n    <string name=\"copied_to_clipboard\">Link copiato negli appunti</string>\n    <string name=\"select_donation_amount\">Scegli l\\'importo che vuoi donare</string>\n    <string name=\"View_contact\">Visualizza il contatto</string>\n    <string name=\"no_birthday_set\">Compleanno non impostato</string>\n    <string name=\"No_contacts_with_events_found_Tap_the_plus_to_add_some\">\"Non ho trovato contatti con eventi speciali.\\nTocca il '+' per aggiungerne\"</string>\n    <string name=\"No_contacts_with_events_found\">\"Non ho trovato contatti con eventi speciali\"</string>\n    <string name=\"add_birthday\">Aggiungi compleanno</string>\n    <string name=\"Birthday_date\">Compleanno</string>\n    <string name=\"Contact_name\">Nome contatto</string>\n    <string name=\"Themes\">Temi</string>\n    <string name=\"Romanian\">Romeno</string>\n    <string name=\"Configure_widget\">Configura il widget</string>\n    <string name=\"Done\">Fatto</string>\n    <string name=\"Transparency\">Trasparenza</string>\n    <string name=\"Use_dark_theme\">Tema scuro?</string>\n    <string name=\"Contact_names\">Nomi dei contatti</string>\n    <string name=\"Bank_holiday\">Festività</string>\n    <string name=\"Bank_holidays\">Festività</string>\n    <string name=\"GoogleP_community\">Comunità Google+</string>\n    <string name=\"Display_Bankholidays\">Visualizza Festività</string>\n    <string name=\"Bankholidays_Country\">Nazione</string>\n    <string name=\"Bankholidays_are_currently_supported_only_for_Greek\">Al momento sono supportate solo le Festività greche</string>\n    <string name=\"Clear\">Pulisci</string>\n    <string name=\"Search_for_contacts\">Ricerca dei contatti</string>\n    <string name=\"Search_for_contacts_or_namedays\">Ricerca dei contatti o onomastici</string>\n    <string name=\"Memento_requires_your_permission_to_read_your_contacts_in_order_to_display_when_they_celebrate\">L\\'app necessita il tuo permesso di leggere i contatti per poter visualizzare le date.</string>\n    <string name=\"Fact_Some_people_give_free_cake_to_those_who_wish_them_Happy_Birthday._Use_Memento_to_keep_track_of_potential_cake_givers\">Alcune persone offrono una torta a chi gli augura Buon Compleanno. Usa questa app per tenere traccia dei potenziali donatori di torta.</string>\n    <string name=\"Grant_permission\">Concedi il permesso</string>\n    <string name=\"Use_all_parts_of_names\">Usa sia il nome che il cognome</string>\n    <string name=\"The_app_will_lookup_namedays_for_all_names_in_a_contact_including_surname\">\"L'app cercherà gli onomastici per il nome completo dei contatti (cognome incluso)\"</string>\n    <string name=\"The_app_will_lookup_namedays_only_in_contacts_given_names_excluding_surname\">\"L\\'app cercherà gli onomastici per il solo nome dei contatti (cognome escluso)\"</string>\n    <string name=\"eventlabel_on_dateLabel\">%1$s il %2$s</string>\n    <string name=\"Anniversary\">Anniversario</string>\n    <string name=\"Other\">Altro</string>\n    <string name=\"Custom\">Personalizzato</string>\n    <string name=\"Add_event\">Aggiungi evento</string>\n    <string name=\"Change_photo\">Cambia la foto</string>\n    <string name=\"Remove_photo\">Rimuovi la foto</string>\n    <string name=\"Take_new_photo\">Scatta una nuova foto</string>\n    <string name=\"Pick_existing_photo\">Scegli una foto esistente</string>\n    <string name=\"Discard_changes\">Annulli le modifiche?</string>\n    <string name=\"No_events_on_this_date\">Nessun evento in questa data</string>\n    <string name=\"Invite_friend\">Invita un amico</string>\n    <string name=\"Facebook_Log_In\">Accedi a Facebook</string>\n    <string name=\"Your_Friends_will_be_here_shortly_smiley\">I tuoi Amici saranno qui a breve :)</string>\n    <string name=\"An_error_came_up\">Si è verificato un errore</string>\n    <string name=\"Try_again_in_a_bit\">Riprova tra poco</string>\n    <string name=\"Hi_X\">Ciao, %s!</string>\n    <string name=\"Import_from_Facebook\">Importa da Facebook</string>\n    <string name=\"Friends_update_daily\">Aggiornamento Amici giornalmente</string>\n    <string name=\"Memento_on_Facebook\">Memento su Facebook</string>\n    <string name=\"log_out\">Esci</string>\n    <string name=\"Facebook_profile\">Profilo Facebook</string>\n    <string name=\"has_nameday_on\">Onomastico il %s</string>\n    <string name=\"has_birthday_on\">Compleanno il %s</string>\n    <string name=\"has_birthday_on_age\">Compie %1$d anni il %2$s</string>\n    <string name=\"title_add_birthday\">Aggiungi compleanno</string>\n    <string name=\"Post_on_Facebook\">Apri il diario</string>\n    <string name=\"romanian\">Rumeno</string>\n</resources>\n"
  },
  {
    "path": "android_common/src/main/res/values-lv/bools.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<bool name=\"isNamedaySupported\">true</bool>\n</resources>"
  },
  {
    "path": "android_common/src/main/res/values-lv-rLV/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- The original name of the app is Memento Calendar. In Greek though the name is Εορτολόγιο Memento (Nameday Almanac Memento)\nas the name makes more sense. If there is a local specific name, make sure to write it here. If not, leave it as is-->\n    <string name=\"localised_app_name\">Memento Calendar</string>\n    <string name=\"today\">Šodiena</string>\n    <string name=\"tomorrow\">Rītdien</string>\n    <string name=\"birthday\">Dzimšanas diena</string>\n    <string name=\"birthdays\">Dzimšanas dienas</string>\n    <string name=\"namedays\">Vārda dienas</string>\n    <string name=\"nameday\">Vārda diena</string>\n    <string name=\"contacts_birthday\">\"%s dzimšanas diena!\"</string>\n    <string name=\"contacts_nameday\">\"%s vārda diena!\"</string>\n    <string name=\"namedays_no_names\">Šajā dienā nevienam nav vārda dienas</string>\n    <string name=\"birthday_no_birthday\">Šajā dienā nevienai kontaktpersonai nav dzimšanas dienas</string>\n    <string name=\"action_settings\">Iestatījumi</string>\n    <string name=\"disable\">Izslēgt</string>\n    <string name=\"enable\">Ieslēgt</string>\n    <string name=\"today_celebrates_one\">%1$s</string>\n    <string name=\"today_celebrates_two\">%1$s un %2$s</string>\n    <string name=\"today_celebrates_many\">%1$s un %2$d citi</string>\n    <string name=\"about\">Par</string>\n    <string name=\"service_dailyreminder\">Ikdienas atgādinājumi</string>\n    <string name=\"display_namedays\">Rādīt vārda dienas</string>\n    <string name=\"display_namedays_on\">Tiks rādītas vārda dienas atbilstoši uzstādījumiem zemāk</string>\n    <string name=\"display_namedays_off\">Vārda dienas netiks rādītas</string>\n    <string name=\"contact_dev\">Sazināties ar izstrādātāju</string>\n    <string name=\"contact_dev_summary\">Atradi kļūdu? Ir ieteikumi? Padod man ziņu!</string>\n    <string name=\"choose\">Izvēlēties</string>\n    <string name=\"number\">numurs</string>\n    <string name=\"Call\">Zvanīt</string>\n    <string name=\"action_text\">Sūtīt SMS</string>\n    <string name=\"action_send_mail\">Sūtīt e-pastu</string>\n    <string name=\"no_app_found\">Nav nevienas piemērotas lietotnes, lai paveiktu darbību</string>\n    <string name=\"send_mail_via\">Sūtīt e-pastu ar</string>\n    <string name=\"daily_reminder\">Ikdienas atgādinājums</string>\n    <string name=\"daily_reminder_summary\">\"Atgādināt par katras dienas notikumiem\"</string>\n    <string name=\"Sound\">Skaņas tonis</string>\n    <string name=\"vibrate\">Vibrācija</string>\n    <string name=\"daily_reminder_time_summary\">Katru dienu plkst. %s</string>\n    <string name=\"set_time\">Uzstādīt laiku</string>\n    <string name=\"set\">Uzstādīt</string>\n    <string name=\"Discard\">Atmest</string>\n    <string name=\"contact_added\">Kontaktpersona pievienota</string>\n    <string name=\"failed_to_add_contact\">Kontaktpersona netika pievienota</string>\n    <string name=\"contact_updated\">Kontaktpersona atjaunota</string>\n    <string name=\"failed_to_update_contact\">Kontaktpersona netika atjaunota</string>\n    <string name=\"ringtone_silent\">Klusums</string>\n    <string name=\"contacts_today\">Kontaktpersonas, kas svin šajā dienā</string>\n    <string name=\"no_contacts_to_wish\">Kontaktos nav neviena, kas svin šajā dienā</string>\n    <string name=\"upcoming\">Svētku dienas drīzumā</string>\n    <string name=\"turns_age\">Paliek %1$d</string>\n    <string name=\"display_namedays_names\">Šodienas vārda dienas</string>\n    <string name=\"share_text\">Izmēģini %1$s - glīta dzimšanas dienu un vārda dienu atgādinājumu Android lietotne! Iegūsti to %2$s</string>\n    <string name=\"share_via\">Dalies ar</string>\n    <string name=\"licences\">Licences</string>\n    <string name=\"about_dev\">Alex Styl izstrāde un dizains</string>\n    <string name=\"about_special_thanks\">\"Īpaša pateicība\\n\n        \\nAndreas Sfakianakis par darbu ar grieķu resursiem\n        \\nKosta Stoupas par vācu valodas tulkojumu\n        \\nAggela Stylianidou par franču valodas tulkojumu\n        \\nGian Maria Calzolari par itāļu valodas tulkojumu\n        \\nAndrejs Kotovs par latviešu valodas tulkojumu\"</string>\n    <string name=\"about_thanks_special_someone\">un *%s* par lietošanu un atbalstu! :)</string>\n    <string name=\"about_contact\">Kaut kas ir nepareizi lietotnē? Ir ieteikumi? Sūti e-pastu uz %s</string>\n    <string name=\"you\">tev</string>\n    <string name=\"switch_on\">Iesl.</string>\n    <string name=\"switch_off\">Izsl.</string>\n    <string name=\"thanks_for_support\">Pateicos par atbalstu lietotnei</string>\n    <string name=\"donate\">Ziedot</string>\n    <string name=\"loading\">Ielāde...</string>\n    <string name=\"action_search\">Meklēt</string>\n    <string name=\"contacts\">Kontaktpersonas</string>\n    <string name=\"search_namedays_on\">Vārda diena</string>\n    <string name=\"show_more\">Rādīt vairāk</string>\n    <string name=\"create\">Izveidot</string>\n    <!-- The name for contacts with empty Display name-->\n    <string name=\"no_name\">(Nav vārda)</string>\n    <string name=\"include_year\">Iekļaut gadskaitli?</string>\n    <string name=\"Save\">Saglabāt</string>\n    <string name=\"add\">Pievienot</string>\n    <string name=\"contact_no_birthday\">Dzimšanas diena nav norādīta</string>\n    <string name=\"contact_no_nameday\">%s vārda diena nav zināma</string>\n    <string name=\"edit\">Rediģēt</string>\n    <string name=\"Add_birthday\">Pievienot dzimšanas dienu</string>\n    <string name=\"search\">Meklēt</string>\n    <string name=\"and\">un</string>\n    <string name=\"Greek\">Grieķu</string>\n    <string name=\"Italian\">Itāļu</string>\n    <string name=\"Czech\">Čehu</string>\n    <string name=\"Slovak\">Slovāku</string>\n    <string name=\"Russian\">Krievu</string>\n    <string name=\"Latvian_Traditional\">Latviešu</string>\n    <string name=\"Hungarian\">Ungāru</string>\n    <string name=\"nameday_language_title\">Vārda dienu kalendārs</string>\n    <string name=\"no_sound\">Klusums</string>\n    <string name=\"label_widget_namedays\">\"Memento - Vārda dienas\"</string>\n    <string name=\"share\">Dalīties</string>\n    <string name=\"support_app\">Atbalsti lietotni</string>\n    <string name=\"fb_go_to_fanpage\">Atvērt Facebook</string>\n    <string name=\"rate_rate_ask\">Vēlies novērtēt lietotni?</string>\n    <string name=\"rate_1_stars\">\"Diezgan briesmīgi\"</string>\n    <string name=\"rate_2_stars\">\"Man nepatīk\"</string>\n    <string name=\"rate_3_stars\">\"Ir OK\"</string>\n    <string name=\"rate_4_stars\">\"Labi\"</string>\n    <string name=\"rate_5_stars\">\"Man ļoti patīk!\"</string>\n    <string name=\"rate\">Novērtēt</string>\n    <string name=\"message\">Īsziņa</string>\n    <string name=\"contact_turns_age\">%1$s paliek %2$d</string>\n    <string name=\"no_results_found\">Nekas nav atrasts</string>\n    <string name=\"contact_celebration_count\">%d kontaktpersonas šodien svin</string>\n    <string name=\"todays_namedays\">Šodienas vārda dienas</string>\n    <string name=\"celebrates_one_namedays\">\"Šodienas vārda diena\"</string>\n    <string name=\"celebrates_many_namedays\">\"Šodienas vārda dienas\"</string>\n    <string name=\"action_via\">%s ar…</string>\n    <string name=\"go_to_fb_short\">Like Page</string>\n    <string name=\"rate_app\">Novērtē lietotni</string>\n    <string name=\"like_page\">Like Facebook Page</string>\n    <string name=\"days_namedays\">Vārda dienas %1$s</string>\n    <string name=\"get_days\">Iegūsti %1$s no %2$s</string>\n    <string name=\"hide_names_hints\">Ilgāk paturot, vari paslēpt vārdus, kurus nevēlies redzēt lietotnē</string>\n    <string name=\"got_it\">Labi, sapratu</string>\n    <string name=\"namedays_contacts_only_on\">Tiks rādītas tikai kontaktpersonu vārda dienas</string>\n    <string name=\"namedays_contacts_only_off\">Tiks rādītas vārda dienas visām gada dienām</string>\n    <string name=\"namedays_contacts_only\">Vārda dienas tikai kontaktpersonām</string>\n    <string name=\"support_message\">Es ceru, ka tev patīk šī lietotne. Tu vari atbalstīt lietotnes izstrādi šādos veidos:</string>\n    <string name=\"translate\">Tulkot lietotni</string>\n    <string name=\"translate_the_app_title\">Lietotnes tulkošana</string>\n    <string name=\"translate_the_app_message\">Atvērt šo saiti no datora pārlūkprogrammas</string>\n    <!-- Neutral button on a dialog, saying that pressing the button will copy to clipboard the url to translate the app -->\n    <string name=\"copy_link\">Kopēt saiti</string>\n    <string name=\"copied_to_clipboard\">Saite ir nokopēta</string>\n    <string name=\"select_donation_amount\">Izvēlies ziedojuma summu</string>\n    <string name=\"View_contact\">Apskatīt kontaktpersonu</string>\n    <string name=\"no_birthday_set\">Dzimšanas datums nav uzstādīts</string>\n    <string name=\"No_contacts_with_events_found_Tap_the_plus_to_add_some\">\"Kontaktpersonas ar svētku dienām nav atrastas.\\n\\nSpied '+', lai pievienotu\"</string>\n    <string name=\"No_contacts_with_events_found\">\"Kontaktpersonas ar svētku dienām nav atrastas\"</string>\n    <string name=\"add_birthday\">Pievienot dzimšanas dienu</string>\n    <string name=\"Birthday_date\">Dzimšanas datums</string>\n    <string name=\"Contact_name\">Kontaktpersonas vārds</string>\n    <string name=\"Themes\">Tēmas</string>\n    <string name=\"Romanian\">Rumāņu</string>\n    <string name=\"Configure_widget\">Konfigurēt logrīku</string>\n    <string name=\"Done\">Darīts</string>\n    <string name=\"Transparency\">Caurspīdīgums</string>\n    <string name=\"Use_dark_theme\">Tumšā tēma?</string>\n    <string name=\"Contact_names\">Kontaktpersonu vārdi</string>\n    <string name=\"Bank_holiday\">Valsts svētku diena</string>\n    <string name=\"Bank_holidays\">Valsts svētku dienas</string>\n    <string name=\"GoogleP_community\">Google+ kopiena</string>\n    <string name=\"Display_Bankholidays\">Rādīt valsts svētku dienas</string>\n    <string name=\"Bankholidays_Country\">Valsts</string>\n    <string name=\"Bankholidays_are_currently_supported_only_for_Greek\">Pašlaik tiek atbalstītas tikai Grieķijas valsts svētku dienas</string>\n    <string name=\"Clear\">Dzēst</string>\n    <string name=\"Search_for_contacts\">Meklēt kontaktpersonas</string>\n    <string name=\"Search_for_contacts_or_namedays\">Meklēt kontaktpersonas vai vārda dienas</string>\n    <string name=\"Memento_requires_your_permission_to_read_your_contacts_in_order_to_display_when_they_celebrate\">Memento lietotnei nepieciešama piekļuve taviem kontaktiem, lai parādītu kontaktpersonu svētku dienas.</string>\n    <string name=\"Fact_Some_people_give_free_cake_to_those_who_wish_them_Happy_Birthday._Use_Memento_to_keep_track_of_potential_cake_givers\">Fakts: Daudzi cilvēki mēdz cienāt ar kūkām sveicējus dzimšanas dienā. Izmanto Memento, lai laicīgi uzzinātu par potenciālajiem cienastiem.</string>\n    <string name=\"Grant_permission\">Atļaut piekļuvi</string>\n    <string name=\"Use_all_parts_of_names\">Izmantot visas vārdu daļas</string>\n    <string name=\"The_app_will_lookup_namedays_for_all_names_in_a_contact_including_surname\">\"Vārda dienu piemeklēšanai lietotne izmantos visas kontaktpersonu vārda daļas, t.sk. uzvārdus\"</string>\n    <string name=\"The_app_will_lookup_namedays_only_in_contacts_given_names_excluding_surname\">\"Lietotne neiekļaus kontaktpersonu uzvārdus meklējot vārda dienas\"</string>\n    <string name=\"eventlabel_on_dateLabel\">%1$s - %2$s</string>\n    <string name=\"Anniversary\">Jubileja</string>\n    <string name=\"Other\">Citi</string>\n    <string name=\"Custom\">Pielāgoti</string>\n    <string name=\"Add_event\">Pievienot notikumu</string>\n    <string name=\"Change_photo\">Mainīt fotoattēlu</string>\n    <string name=\"Remove_photo\">Noņemt fotoattēlu</string>\n    <string name=\"Take_new_photo\">Uzņemt jaunu fotoattēlu</string>\n    <string name=\"Pick_existing_photo\">Atlasīt jaunu fotoattēlu</string>\n    <string name=\"Discard_changes\">Atcelt izmaiņas?</string>\n    <string name=\"No_events_on_this_date\">Nav pasākumu šajā datumā</string>\n    <string name=\"Invite_friend\">Aicināt draugus</string>\n    <string name=\"Facebook_Log_In\">Ieiet Facebook</string>\n    <string name=\"Your_Friends_will_be_here_shortly_smiley\">Tavi draugi drīz būs te :)</string>\n    <string name=\"An_error_came_up\">Radusies kļūda!</string>\n    <string name=\"Try_again_in_a_bit\">Pēc brīža mēģini atkārtoti!</string>\n    <string name=\"Hi_X\">Sveiki, %s!</string>\n    <string name=\"Import_from_Facebook\">Importēt no Facebook</string>\n    <string name=\"Friends_update_daily\">Draugu atjaunājumi ik dienu</string>\n    <string name=\"Memento_on_Facebook\">Memento lietotne Facebook</string>\n    <string name=\"log_out\">Iziet</string>\n    <string name=\"Facebook_profile\">Facebook profils</string>\n    <string name=\"has_nameday_on\">Vārda diena %s</string>\n    <string name=\"has_birthday_on\">Dzimšanas diena %s</string>\n    <string name=\"has_birthday_on_age\">Paliek %1$d vecs %2$s</string>\n    <string name=\"title_add_birthday\">Pievienot dzimšanas dienu</string>\n    <string name=\"Post_on_Facebook\">Apskatīt sienu</string>\n    <string name=\"romanian\">Rumāņu</string>\n</resources>\n"
  },
  {
    "path": "android_common/src/main/res/values-nl/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- The original name of the app is Memento Calendar. In Greek though the name is Εορτολόγιο Memento (Nameday Almanac Memento)\nas the name makes more sense. If there is a local specific name, make sure to write it here. If not, leave it as is-->\n    <string name=\"localised_app_name\">Memento Calendar</string>\n    <string name=\"today\">Vandaag</string>\n    <string name=\"tomorrow\">Morgen</string>\n    <string name=\"birthday\">Verjaardag</string>\n    <string name=\"birthdays\">Verjaardagen</string>\n    <string name=\"namedays\">Naamdagen</string>\n    <string name=\"nameday\">Naamdag</string>\n    <string name=\"contacts_birthday\">\"Het is de verjaardag van %s!\"</string>\n    <string name=\"contacts_nameday\">\"Het is de naamdag van %s!\"</string>\n    <string name=\"namedays_no_names\">Geen naamdagen op deze dag</string>\n    <string name=\"birthday_no_birthday\">Niemand van je contacten heeft vandaag zijn verjaardag.</string>\n    <string name=\"action_settings\">Instellingen</string>\n    <string name=\"disable\">Uitschakelen</string>\n    <string name=\"enable\">Inschakelen</string>\n    <string name=\"today_celebrates_one\">%1$s</string>\n    <string name=\"today_celebrates_two\">%1$s en %2$s</string>\n    <string name=\"today_celebrates_many\">%1$s en %2$d anderen</string>\n    <string name=\"about\">Over</string>\n    <string name=\"service_dailyreminder\">Service voor dagelijkse herinneringen</string>\n    <string name=\"display_namedays\">Toon naamdagen</string>\n    <string name=\"display_namedays_on\">Naamdagen zullen worden getoond voor al je contactpersonen</string>\n    <string name=\"display_namedays_off\">Naamdagen zullen niet getoond worden</string>\n    <string name=\"contact_dev\">Contacteer de ontwikkelaar</string>\n    <string name=\"contact_dev_summary\">Een bug gevonden? Een suggestie? Laat het me weten!</string>\n    <string name=\"choose\">Kies</string>\n    <string name=\"number\">nummer</string>\n    <string name=\"Call\">Bel</string>\n    <string name=\"action_text\">Stuur SMS</string>\n    <string name=\"action_send_mail\">Stuur e-mail</string>\n    <string name=\"no_app_found\">Geen app gevonden om deze actie uit te voeren</string>\n    <string name=\"send_mail_via\">Stuur e-mail via</string>\n    <string name=\"daily_reminder\">Dagelijkse herinnering</string>\n    <string name=\"daily_reminder_summary\">\"Toon me dagelijks een herinnering voor de verjaardagen of naamdagen van de dag\"</string>\n    <string name=\"Sound\">Beltoon</string>\n    <string name=\"vibrate\">Trillen</string>\n    <string name=\"daily_reminder_time_summary\">Every day om %s</string>\n    <string name=\"set_time\">Tijd van herinnering</string>\n    <string name=\"set\">opslaan</string>\n    <string name=\"Discard\">Annuleer</string>\n    <string name=\"contact_added\">Contact toegevoegd</string>\n    <string name=\"failed_to_add_contact\">Contact kon niet toegevoegd worden</string>\n    <string name=\"contact_updated\">Contact bijgewerkt</string>\n    <string name=\"failed_to_update_contact\">Contact kon niet bijgewerkt worden</string>\n    <string name=\"ringtone_silent\">Stil</string>\n    <string name=\"contacts_today\">Contactpersonen die deze dag vieren</string>\n    <string name=\"no_contacts_to_wish\">Er zijn geen contactpersonen die deze dag vieren</string>\n    <string name=\"upcoming\">Eerstvolgende</string>\n    <string name=\"turns_age\">Wordt %1$d</string>\n    <string name=\"display_namedays_names\">Naamdagen van vandaag</string>\n    <string name=\"share_text\">Je moet %1$s eens bekijken - een knappe app voor Android die herinneringen toont voor verjaardagen en naamdagen! Download van %2$s</string>\n    <string name=\"share_via\">Delen via</string>\n    <string name=\"licences\">Licenties</string>\n    <string name=\"about_dev\">Ontwikkeld en ontworpen door Alex Styl</string>\n    <string name=\"about_special_thanks\">\"Speciaal bedankt aan\n\nAndreas Sfakianakis voor zijn werk aan de Greeklish bibliotheek\nKosta Stoupas voor de Duitse vertaling\nAggela Stylianidou voor de Franse vertaling\nGian Maria Calzolari voor de Italiaanse vertaling\nAndrejs Kotovs voor de Letse vertaling\nBert Van Dooren voor de Nederlandse vertaling\"</string>\n    <string name=\"about_thanks_special_someone\">en *%s* om deze app te gebruiken en te ondersteunen! :)</string>\n    <string name=\"about_contact\">Is er iets mis met de app? Heb je een suggestie? Stuur een e-mail naar %s</string>\n    <string name=\"you\">JIJ</string>\n    <string name=\"switch_on\">Aan</string>\n    <string name=\"switch_off\">Uit</string>\n    <string name=\"thanks_for_support\">Bedankt om deze app te ondersteunen</string>\n    <string name=\"donate\">Doneer</string>\n    <string name=\"loading\">Bezig met laden...</string>\n    <string name=\"action_search\">Zoeken</string>\n    <string name=\"contacts\">Contactpersonen</string>\n    <string name=\"search_namedays_on\">Naamdag op</string>\n    <string name=\"show_more\">Toon meer</string>\n    <string name=\"create\">Aanmaken</string>\n    <!-- The name for contacts with empty Display name-->\n    <string name=\"no_name\">(Geen naam)</string>\n    <string name=\"include_year\">Jaar toevoegen?</string>\n    <string name=\"Save\">Opslaan</string>\n    <string name=\"add\">Toevoegen</string>\n    <string name=\"contact_no_birthday\">Geen verjaardag gezet</string>\n    <string name=\"contact_no_nameday\">Geen naamdag voor de naam %s</string>\n    <string name=\"edit\">Bewerken</string>\n    <string name=\"Add_birthday\">Verjaardag toevoegen</string>\n    <string name=\"search\">Zoeken</string>\n    <string name=\"and\">en</string>\n    <string name=\"Greek\">Grieks</string>\n    <string name=\"Italian\">Italiaans</string>\n    <string name=\"Czech\">Tsjechisch</string>\n    <string name=\"Slovak\">Slovaaks</string>\n    <string name=\"Russian\">Russisch</string>\n    <string name=\"Latvian_Traditional\">Lets</string>\n    <string name=\"Hungarian\">Hongaars</string>\n    <string name=\"nameday_language_title\">Naamdag kalender</string>\n    <string name=\"no_sound\">Stil</string>\n    <string name=\"label_widget_namedays\">\"Memento - Naamdagen\"</string>\n    <string name=\"share\">Delen</string>\n    <string name=\"support_app\">Ondersteun de app</string>\n    <string name=\"fb_go_to_fanpage\">Open de Facebook Pagina</string>\n    <string name=\"rate_rate_ask\">Welke waardering zou je de app geven?</string>\n    <string name=\"rate_1_stars\">\"Het is echt afgrijselijk\"</string>\n    <string name=\"rate_2_stars\">\"Ik hou er niet van\"</string>\n    <string name=\"rate_3_stars\">\"'t Is wel ok\"</string>\n    <string name=\"rate_4_stars\">\"Het is goed\"</string>\n    <string name=\"rate_5_stars\">\"Ik kan niet meer zonder!\"</string>\n    <string name=\"rate\">Waardering geven</string>\n    <string name=\"message\">Bericht</string>\n    <string name=\"contact_turns_age\">%1$s wordt %2$d</string>\n    <string name=\"no_results_found\">Geen resultaten gevonden</string>\n    <string name=\"contact_celebration_count\">%d contactpersonen vieren vandaag</string>\n    <string name=\"todays_namedays\">Naamdagen van vandaag</string>\n    <string name=\"celebrates_one_namedays\">\"Naamdag van vandaag\"</string>\n    <string name=\"celebrates_many_namedays\">\"Naamdagen van vandaag\"</string>\n    <string name=\"action_via\">%s via...</string>\n    <string name=\"go_to_fb_short\">Like de pagina</string>\n    <string name=\"rate_app\">Geef de app een waardering</string>\n    <string name=\"like_page\">Like de Facebook pagina</string>\n    <string name=\"days_namedays\">Naamdagen voor %1$s</string>\n    <string name=\"get_days\">Download %1$s op %2$s</string>\n    <string name=\"hide_names_hints\">Je kan de namen verbergen die je niet wil zien in de app door er lang op te duwen.</string>\n    <string name=\"got_it\">Ok, verstaan.</string>\n    <string name=\"namedays_contacts_only_on\">Enkel de naamdagen van je contactpersonen zullen worden getoond</string>\n    <string name=\"namedays_contacts_only_off\">Alle naamdagen van het jaar zullen getoond worden</string>\n    <string name=\"namedays_contacts_only\">Enkel naamdagen voor contactpersonen</string>\n    <string name=\"support_message\">Ik hoop dat je de app leuk en bruikbaar vindt. Hier zijn enkele manieren om de app de ondersteunen:</string>\n    <string name=\"translate\">Vertaal de app</string>\n    <string name=\"translate_the_app_title\">De app vertalen</string>\n    <string name=\"translate_the_app_message\">Open de volgende link op je computer</string>\n    <!-- Neutral button on a dialog, saying that pressing the button will copy to clipboard the url to translate the app -->\n    <string name=\"copy_link\">Kopiëer de link</string>\n    <string name=\"copied_to_clipboard\">Link gekopiëerd naar het klembord</string>\n    <string name=\"select_donation_amount\">Selecteer hoeveel je wil doneren</string>\n    <string name=\"View_contact\">Toon contactpersoon</string>\n    <string name=\"no_birthday_set\">Geen verjaardag gevonden</string>\n    <string name=\"No_contacts_with_events_found_Tap_the_plus_to_add_some\">\"Geen contactpersonen met speciale gebeurtenissen gevonden. \\nDuw op de '+' om er toe te voegen\"</string>\n    <string name=\"No_contacts_with_events_found\">\"Geen contacten met speciale gebeurtenissen gevonden\"</string>\n    <string name=\"add_birthday\">Verjaardag toevoegen</string>\n    <string name=\"Birthday_date\">Geboortedatum</string>\n    <string name=\"Contact_name\">Naam contactpersoon</string>\n    <string name=\"Themes\">Thema\\'s</string>\n    <string name=\"Romanian\">Roemeens</string>\n    <string name=\"Configure_widget\">Stel widget in</string>\n    <string name=\"Done\">Klaar</string>\n    <string name=\"Transparency\">Transparantie</string>\n    <string name=\"Use_dark_theme\">Donker thema?</string>\n    <string name=\"Contact_names\">Namen contactpersonen</string>\n    <string name=\"Bank_holiday\">Verlofdag</string>\n    <string name=\"Bank_holidays\">Verlofdagen</string>\n    <string name=\"GoogleP_community\">Google+ gemeenschap</string>\n    <string name=\"Display_Bankholidays\">Toon verlofdagen</string>\n    <string name=\"Bankholidays_Country\">Land</string>\n    <string name=\"Bankholidays_are_currently_supported_only_for_Greek\">Momenteel zijn enkel Griekse verlofdagen ondersteund</string>\n    <string name=\"Clear\">Leegmaken</string>\n    <string name=\"Search_for_contacts\">Contacten zoeken</string>\n    <string name=\"Search_for_contacts_or_namedays\">Contacten of naamdagen zoeken</string>\n    <string name=\"Memento_requires_your_permission_to_read_your_contacts_in_order_to_display_when_they_celebrate\">Memento heeft je goedkeuring nodig om je contacten in te lezen en zo te kunnen tonen wanneer ze gevierd worden.</string>\n    <string name=\"Fact_Some_people_give_free_cake_to_those_who_wish_them_Happy_Birthday._Use_Memento_to_keep_track_of_potential_cake_givers\">\"Feit: sommige mensen geven een gratis taart aan zij die hen Gelukkige Verjaardag wensen. Gebruik Memento om zulke potentiële taartgevers in het oog te houden. \"</string>\n    <string name=\"Grant_permission\">Toestemming verlenen</string>\n    <string name=\"Use_all_parts_of_names\">Gebruik alle delen van namen</string>\n    <string name=\"The_app_will_lookup_namedays_for_all_names_in_a_contact_including_surname\">\"De app zal de naamdagen opzoeken voor alle namen in een contact (inclusief achternaam)\"</string>\n    <string name=\"The_app_will_lookup_namedays_only_in_contacts_given_names_excluding_surname\">\"De app zal naamdagen enkel op basis van de voornaam van de contacten opzoeken (exclusief achternaam)\"</string>\n    <string name=\"eventlabel_on_dateLabel\">%1$s op %2$s</string>\n    <string name=\"Anniversary\">Jubileum</string>\n    <string name=\"Other\">Andere</string>\n    <string name=\"Custom\">Aangepast</string>\n    <string name=\"Add_event\">Gebeurtenis toevoegen</string>\n    <string name=\"Change_photo\">Foto wijzigen</string>\n    <string name=\"Remove_photo\">Foto verwijderen</string>\n    <string name=\"Take_new_photo\">Nieuwe foto nemen</string>\n    <string name=\"Pick_existing_photo\">Kies bestaande foto</string>\n    <string name=\"Discard_changes\">Wijzigingen verwerpen?</string>\n    <string name=\"No_events_on_this_date\">Geen gebeurtenissen op deze datum</string>\n    <string name=\"Invite_friend\">Vriend uitnodigen</string>\n    <string name=\"Facebook_Log_In\">Aanmelden met Facebook</string>\n    <string name=\"Your_Friends_will_be_here_shortly_smiley\">Je vrienden zullen hier weldra zijn :-)</string>\n    <string name=\"An_error_came_up\">Er is iets fout gegaan</string>\n    <string name=\"Try_again_in_a_bit\">Wacht even en probeer nog eens</string>\n    <string name=\"Hi_X\">Hey, %s!</string>\n    <string name=\"Import_from_Facebook\">Importeren van Facebook</string>\n    <string name=\"Friends_update_daily\">Vrienden worden dagelijks geüpdatet</string>\n    <string name=\"Memento_on_Facebook\">Memento op Facebook</string>\n    <string name=\"log_out\">Afmelden</string>\n    <string name=\"Facebook_profile\">Facebook profiel</string>\n    <string name=\"has_nameday_on\">Naamdag op %s</string>\n    <string name=\"has_birthday_on\">Verjaardag op %s</string>\n    <string name=\"has_birthday_on_age\">Wordt %1$d op %2$s</string>\n    <string name=\"title_add_birthday\">Verjaardag toevoegen</string>\n    <string name=\"Post_on_Facebook\">Open Prikbord</string>\n    <string name=\"romanian\">Roemeens</string>\n</resources>\n"
  },
  {
    "path": "android_common/src/main/res/values-sk/bool.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <bool name=\"isNamedaySupported\">true</bool>\n</resources>"
  },
  {
    "path": "android_mobile/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "android_mobile/build.gradle",
    "content": "plugins {\n    id \"io.gitlab.arturbosch.detekt\" version \"1.0.0.M13.2\"\n}\n\napply from: '../versions.gradle'\napply plugin: 'com.android.application'\napply plugin: 'kotlin-android'\napply plugin: 'kotlin-kapt'\napply plugin: 'io.fabric'\n\ndetekt {\n    version = \"1.0.0.M13.2\"\n\n    profile(\"main\") {\n        input = \"$projectDir/src/main/java\"\n        config = \"$rootDir/team-props/static-analysis/detekt-config.yml\"\n        filters = \".*test.*,.*/resources/.*,.*/tmp/.*\"\n        output = \"$projectDir/build/reports/detekt.xml\"\n    }\n}\n\n\nproject.afterEvaluate {\n    check.dependsOn tasks['detektCheck']\n}\n\nandroid {\n\n    compileSdkVersion androidCompileSdkVersion\n    buildToolsVersion androidBuildToolsVersion\n\n    applicationVariants.all { variant ->\n        variant.outputs.all { output ->\n            output.outputFileName = new File(\n                    \"./../../../../../build/\",\n                    output.outputFileName.replace(\".apk\", \"-${variant.versionName}.apk\"))\n        }\n    }\n\n\n    defaultConfig {\n        applicationId 'com.alexstyl.specialdates'\n        minSdkVersion 16\n        targetSdkVersion 27\n        versionCode androidVersionCode\n        versionName androidVersionName\n        resValue \"string\", \"admob_unit_id\", \"\\\"$adMobUnitId\\\"\"\n\n\n        buildConfigField \"String\", \"FILE_PROVIDER\", \"\\\"com.alexstyl.specialdates.fileprovider\\\"\"\n        manifestPlaceholders = [crashlyticsApiKey: crashlyticsKey,\n                                fileProvider     : \"com.alexstyl.specialdates.fileprovider\"]\n\n        multiDexEnabled true\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled true\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n        debug {\n            minifyEnabled false\n        }\n    }\n\n\n    packagingOptions {\n        exclude 'META-INF/LICENSE.txt'\n        exclude 'META-INF/NOTICE.txt'\n    }\n\n    lintOptions {\n        abortOnError false\n    }\n\n    testOptions {\n        unitTests.returnDefaultValues = true\n    }\n\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', exclude: 'android-support-v4.jar', include: ['*.jar'])\n    implementation project(':android_common')\n\n    implementation \"com.android.support:design:$android_support_version\"\n    implementation \"com.android.support:cardview-v7:$android_support_version\"\n    implementation \"com.android.support:appcompat-v7:$android_support_version\"\n    implementation \"com.android.support:recyclerview-v7:$android_support_version\"\n    implementation \"com.android.support:transition:$android_support_version\"\n    implementation 'com.android.support.constraint:constraint-layout:1.0.2'\n    implementation 'com.android.support:multidex:1.0.3'\n\n    implementation 'com.google.dagger:dagger:2.9'\n    kapt 'com.google.dagger:dagger-compiler:2.9'\n    compileOnly 'javax.annotation:jsr250-api:1.0'\n\n    implementation 'com.novoda:notils:2.2.15'\n    implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'\n    implementation 'com.novoda:simple-chrome-custom-tabs:0.1.6'\n    implementation('com.crashlytics.sdk.android:crashlytics:2.6.7@aar') {\n        transitive = true\n    }\n    implementation \"com.google.android.gms:play-services-wearable:$play_services_version\"\n    implementation 'com.theartofdev.edmodo:android-image-cropper:2.3.1'\n    implementation \"com.google.firebase:firebase-core:$play_services_version\"\n    implementation \"com.google.firebase:firebase-ads:$play_services_version\"\n    implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'\n    implementation 'io.reactivex.rxjava2:rxjava:2.1.0'\n    implementation 'com.evernote:android-job:1.2.4'\n\n    debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.5'\n    debugImplementation 'com.facebook.stetho:stetho:1.3.0'\n    testImplementation 'junit:junit:4.12'\n    testImplementation 'org.easytesting:fest-assert-core:2.0M10'\n    testImplementation 'org.mockito:mockito-core:1.10.19'\n    testImplementation 'joda-time:joda-time:2.9.4'\n    testImplementation 'org.json:json:20140107'\n    androidTestImplementation 'junit:junit:4.12'\n}\n\n\napply from: \"$rootDir/android_mobile/google_services.gradle\"\n\napply plugin: 'com.google.gms.google-services'\n"
  },
  {
    "path": "android_mobile/google_services.gradle",
    "content": "task copyGoogleServicesData() {\n\n    doLast {\n\n        if (!file(\"$rootDir/android_mobile/google-services.json\").exists()) {\n            copy {\n                from \"$rootDir/.circleci/ci-scripts/mock-google-services.json\"\n                into \"$rootDir/android_mobile\"\n\n                rename { String fileName ->\n                    fileName.replace(\"mock-google-services.json\", \"google-services.json\")\n                }\n            }\n        }\n    }\n}\n\n\n\ntasks.whenTaskAdded { task ->\n    if (task.name == 'processDebugGoogleServices' || task.name == 'processReleaseGoogleServices') {\n        task.dependsOn copyGoogleServicesData\n    }\n}\n"
  },
  {
    "path": "android_mobile/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /Users/alexstyl/android/sdk/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Joda Time\n-dontwarn org.joda.convert.**\n-dontwarn org.joda.time.**\n-keep class org.joda.time.** { *; }\n-keep interface org.joda.time.** { *; }\n-keep class com.crashlytics.** { *; }\n-dontwarn com.crashlytics.**\n-keepattributes SourceFile,LineNumberTable,Annotation\n-keep class com.crashlytics.android.**\n-keep class com.android.vending.billing.**\n-keep class com.tozny.crypto.android.AesCbcWithIntegrity$PrngFixes$* { *; }\n\n\n"
  },
  {
    "path": "android_mobile/src/debug/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  package=\"com.alexstyl.specialdates\">\n\n  <application\n    android:name=\"com.alexstyl.specialdates.DebugApplication\"\n    tools:replace=\"android:name\">\n\n    <activity\n      android:name=\"com.alexstyl.specialdates.debug.DebugActivity\"\n      android:icon=\"@drawable/ic_heart\"\n      android:label=\"Memento Debug\"\n      android:taskAffinity=\"com.alexstyl.debug\">\n      <intent-filter>\n        <action android:name=\"android.intent.action.MAIN\" />\n        <category android:name=\"android.intent.category.LAUNCHER\" />\n      </intent-filter>\n    </activity>\n\n  </application>\n\n</manifest>\n"
  },
  {
    "path": "android_mobile/src/debug/assets/mock/facebook-calendar.ics",
    "content": "BEGIN:VCALENDAR\r\nPRODID:-//Facebook//NONSGML Facebook Events V1.0//EN\r\nX-WR-CALNAME:Friends' Birthdays\r\nX-PUBLISHED-TTL:PT12H\r\nX-ORIGINAL-URL:https://www.facebook.com/events/birthdays/\r\nVERSION:2.0\r\nCALSCALE:GREGORIAN\r\nMETHOD:PUBLISH\r\nBEGIN:VEVENT\r\nDTSTART:20171219\r\nSUMMARY:Alexandros Stylianidis's birthday\r\nRRULE:FREQ=YEARLY\r\nDURATION:P1D\r\nUID:b1358181263@facebook.com\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nDTSTART:20171219\r\nSUMMARY:Alex Alex's birthday\r\nRRULE:FREQ=YEARLY\r\nDURATION:P1D\r\nUID:b100010984206219@facebook.com\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"
  },
  {
    "path": "android_mobile/src/debug/java/com/alexstyl/specialdates/DebugAppComponent.java",
    "content": "package com.alexstyl.specialdates;\n\nimport com.alexstyl.resources.ResourcesModule;\nimport com.alexstyl.specialdates.contact.ContactsModule;\nimport com.alexstyl.specialdates.dailyreminder.DailyReminderModule;\nimport com.alexstyl.specialdates.date.DateModule;\nimport com.alexstyl.specialdates.debug.DebugFragment;\nimport com.alexstyl.specialdates.debug.DebugModule;\nimport com.alexstyl.specialdates.donate.DonateModule;\nimport com.alexstyl.specialdates.events.namedays.NamedayModule;\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsModule;\nimport com.alexstyl.specialdates.images.ImageModule;\nimport com.alexstyl.specialdates.person.PersonModule;\nimport com.alexstyl.specialdates.upcoming.UpcomingEventsModule;\n\nimport javax.inject.Singleton;\n\nimport dagger.Component;\n\n@Singleton\n@Component(modules = {\n        AndroidApplicationModule.class,\n        NamedayModule.class,\n        PersonModule.class,\n        ContactsModule.class,\n        PeopleEventsModule.class,\n        DonateModule.class,\n        DebugModule.class,\n        UpcomingEventsModule.class,\n        DailyReminderModule.class,\n        ResourcesModule.class,\n        ImageModule.class,\n        DateModule.class})\npublic interface DebugAppComponent {\n    void inject(DebugFragment fragment);\n}\n"
  },
  {
    "path": "android_mobile/src/debug/java/com/alexstyl/specialdates/DebugApplication.java",
    "content": "package com.alexstyl.specialdates;\n\nimport com.alexstyl.resources.ResourcesModule;\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsModule;\nimport com.alexstyl.specialdates.images.ImageModule;\n\npublic class DebugApplication extends MementoApplication {\n\n    private DebugAppComponent debugAppComponent;\n\n    @Override\n    public void onCreate() {\n        super.onCreate();\n        debugAppComponent =\n                DaggerDebugAppComponent.builder()\n                        .androidApplicationModule(new AndroidApplicationModule(this))\n                        .peopleEventsModule(new PeopleEventsModule(this))\n                        .imageModule(new ImageModule(getResources()))\n                        .resourcesModule(new ResourcesModule(this, getResources()))\n                        .build();\n    }\n\n    @Override\n    protected void initialiseDependencies() {\n        super.initialiseDependencies();\n        new OptionalDependencies(this).initialise();\n    }\n\n    public DebugAppComponent getDebugAppComponent() {\n        return debugAppComponent;\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/debug/java/com/alexstyl/specialdates/OptionalDependencies.java",
    "content": "package com.alexstyl.specialdates;\n\nimport android.app.Application;\nimport android.content.Context;\n\nimport com.facebook.stetho.Stetho;\nimport com.squareup.leakcanary.LeakCanary;\n\nclass OptionalDependencies {\n\n    private final Context context;\n\n    OptionalDependencies(Context context) {\n        this.context = context.getApplicationContext();\n    }\n\n    void initialise() {\n        Stetho.initializeWithDefaults(context);\n        if (!LeakCanary.isInAnalyzerProcess(context)) {\n            LeakCanary.install((Application) context);\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/debug/java/com/alexstyl/specialdates/debug/DebugActivity.java",
    "content": "package com.alexstyl.specialdates.debug;\n\nimport android.os.Bundle;\n\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.ui.base.ThemedMementoActivity;\n\npublic class DebugActivity extends ThemedMementoActivity {\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_debug);\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/debug/java/com/alexstyl/specialdates/debug/DebugFragment.kt",
    "content": "package com.alexstyl.specialdates.debug\n\nimport android.app.Activity\nimport android.app.DatePickerDialog\nimport android.content.ContentUris\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Bundle\nimport android.preference.Preference\nimport android.provider.CalendarContract\nimport android.provider.ContactsContract\nimport android.widget.Toast\nimport com.alexstyl.specialdates.CrashAndErrorTracker\nimport com.alexstyl.specialdates.DebugApplication\nimport com.alexstyl.specialdates.Optional\nimport com.alexstyl.specialdates.R\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.contact.ContactSource.SOURCE_DEVICE\nimport com.alexstyl.specialdates.contact.ContactsProvider\nimport com.alexstyl.specialdates.contact.DisplayName\nimport com.alexstyl.specialdates.dailyreminder.*\nimport com.alexstyl.specialdates.date.ContactEvent\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.DateParser\nimport com.alexstyl.specialdates.donate.DebugDonationPreferences\nimport com.alexstyl.specialdates.donate.DonateMonitor\nimport com.alexstyl.specialdates.events.bankholidays.BankHoliday\nimport com.alexstyl.specialdates.events.namedays.NamedayUserSettings\nimport com.alexstyl.specialdates.events.namedays.NamesInADate\nimport com.alexstyl.specialdates.events.peopleevents.DebugPeopleEventsUpdater\nimport com.alexstyl.specialdates.events.peopleevents.StandardEventType\nimport com.alexstyl.specialdates.events.peopleevents.UpcomingEventsSettings\nimport com.alexstyl.specialdates.events.peopleevents.UpcomingEventsViewRefresher\nimport com.alexstyl.specialdates.facebook.friendimport.FacebookFriendsIntentService\nimport com.alexstyl.specialdates.facebook.login.FacebookLogInActivity\nimport com.alexstyl.specialdates.support.AskForSupport\nimport com.alexstyl.specialdates.ui.base.MementoPreferenceFragment\nimport com.alexstyl.specialdates.upcoming.widget.today.UpcomingWidgetConfigureActivity\nimport com.alexstyl.specialdates.wear.WearSyncUpcomingEventsView\nimport com.evernote.android.job.JobRequest\nimport java.net.URI\nimport java.util.Calendar\nimport javax.inject.Inject\n\nclass DebugFragment : MementoPreferenceFragment() {\n\n    var dailyReminderDebugPreferences: DailyReminderDebugPreferences? = null\n        @Inject set\n    var namedayUserSettings: NamedayUserSettings? = null\n        @Inject set\n    var contactsProvider: ContactsProvider? = null\n        @Inject set\n    var refresher: UpcomingEventsViewRefresher? = null\n        @Inject set\n    var tracker: CrashAndErrorTracker? = null\n        @Inject set\n    var monitor: DonateMonitor? = null\n        @Inject set\n    var upcomingEventsSettings: UpcomingEventsSettings? = null\n        @Inject set\n    var dateParser: DateParser? = null\n        @Inject set\n    var notifier: DailyReminderNotifier? = null\n        @Inject set\n    var peopleEventsUpdater: DebugPeopleEventsUpdater? = null\n        @Inject set\n    var dailyReminderViewModelFactory: DailyReminderViewModelFactory? = null\n        @Inject set\n    var askForSupport: AskForSupport? = null\n        @Inject set\n\n    private val onDailyReminderDateSelectedListener = DatePickerDialog.OnDateSetListener { _, year, month, dayOfMonth ->\n        val month1 = month + 1 // dialog picker months have 0 index\n        dailyReminderDebugPreferences!!.setSelectedDate(dayOfMonth, month1, year)\n    }\n\n    override fun onCreate(paramBundle: Bundle?) {\n        super.onCreate(paramBundle)\n\n        val debugAppComponent = (activity!!.application as DebugApplication).debugAppComponent\n        debugAppComponent.inject(this)\n\n        addPreferencesFromResource(R.xml.preference_debug)\n        dailyReminderDebugPreferences = DailyReminderDebugPreferences.newInstance(activity)\n        findPreference<Preference>(R.string.key_debug_refresh_db)!!.onPreferenceClickListener = Preference.OnPreferenceClickListener {\n            peopleEventsUpdater?.refresh()\n            showToast(\"Refreshing Database\")\n            true\n        }\n        findPreference<Preference>(R.string.key_debug_refresh_widget)!!.onPreferenceClickListener = Preference.OnPreferenceClickListener {\n            refresher!!.refreshViews()\n            showToast(\"Widget(s) refreshed\")\n            true\n        }\n\n        findPreference<Preference>(R.string.key_debug_daily_reminder_date_enable)!!.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue ->\n            dailyReminderDebugPreferences!!.setEnabled(newValue as Boolean)\n            true\n        }\n        findPreference<Preference>(R.string.key_debug_daily_reminder_date)!!.onPreferenceClickListener = Preference.OnPreferenceClickListener {\n            val today = dailyReminderDebugPreferences!!.selectedDate\n            val datePickerDialog = DatePickerDialog(\n                    activity!!, onDailyReminderDateSelectedListener,\n                    today.year, today.month - 1, today.dayOfMonth\n            )\n            datePickerDialog.show()\n            false\n        }\n\n        findPreference<Preference>(R.string.key_debug_daily_reminder)!!.onPreferenceClickListener = Preference.OnPreferenceClickListener {\n            JobRequest.Builder(DailyReminderJob.TAG)\n                    .startNow()\n                    .build()\n                    .schedule()\n\n            showToast(\"Daily Reminder Triggered\")\n            true\n        }\n\n        findPreference<Preference>(R.string.key_debug_start_calendar)!!.onPreferenceClickListener = Preference.OnPreferenceClickListener {\n            startDateIntent()\n            true\n        }\n\n        findPreference<Preference>(R.string.key_debug_trigger_wear_service)!!.onPreferenceClickListener = Preference.OnPreferenceClickListener {\n            WearSyncUpcomingEventsView(activity).reloadUpcomingEventsView()\n            true\n        }\n        findPreference<Preference>(R.string.key_debug_reset_donations)!!.onPreferenceClickListener = Preference.OnPreferenceClickListener { preference ->\n            DebugDonationPreferences.newInstance(preference.context, monitor).reset()\n            Toast.makeText(preference.context, \"Donations reset. You should see ads from now on\", Toast.LENGTH_SHORT).show()\n            true\n        }\n        findPreference<Preference>(R.string.key_debug_trigger_support)!!.onPreferenceClickListener = Preference.OnPreferenceClickListener { preference ->\n            DebugPreferences.newInstance(preference.context, R.string.pref_call_to_rate).wipe()\n            askForSupport!!.requestForRatingSooner()\n            val message = \"Support triggered. You should now see a prompt to rate the app when you launch it\"\n            showToast(message)\n            true\n        }\n        findPreference<Preference>(R.string.key_debug_facebook)!!.onPreferenceClickListener = Preference.OnPreferenceClickListener {\n            val intent = Intent(activity, FacebookLogInActivity::class.java)\n            startActivity(intent)\n            true\n        }\n        findPreference<Preference>(R.string.key_debug_facebook_fetch_friends)!!.onPreferenceClickListener = Preference.OnPreferenceClickListener {\n            val intent = Intent(activity, FacebookFriendsIntentService::class.java)\n            activity!!.startService(intent)\n            true\n        }\n\n        findPreference<Preference>(R.string.key_debug_open_contact)!!.onPreferenceClickListener = Preference.OnPreferenceClickListener {\n            val contactPickerIntent = Intent(\n                    Intent.ACTION_PICK,\n                    ContactsContract.Contacts.CONTENT_URI\n            )\n            startActivityForResult(contactPickerIntent, RESULT_PICK_CONTACT)\n            true\n        }\n        findPreference<Preference>(R.string.key_debug_trigger_daily_reminder_notification_one)!!\n                .onPreferenceClickListener = Preference.OnPreferenceClickListener {\n            notifyForContacts(arrayListOf(\n                    contactEventOn(Date.today().minusDay(365 * 10), Contact(123L, \"Peter\".toDisplayName(), URI.create(\"content://com.android.contacts/contacts/123\"), SOURCE_DEVICE), StandardEventType.BIRTHDAY)\n            ))\n\n            true\n        }\n        findPreference<Preference>(R.string.key_debug_trigger_daily_reminder_notification_many)!!\n                .onPreferenceClickListener = Preference.OnPreferenceClickListener {\n            notifyForContacts(arrayListOf(\n                    contactEventOn(Date.today().minusDay(365 * 10), Contact(336L, \"Peter\".toDisplayName(), URI.create(\"content://com.android.contacts/contacts/336\"), SOURCE_DEVICE), StandardEventType.NAMEDAY),\n                    contactEventOn(Date.today().minusDay(365 * 10), Contact(123L, \"Alex\".toDisplayName(), URI.create(\"content://com.android.contacts/contacts/123\"), SOURCE_DEVICE), StandardEventType.BIRTHDAY),\n                    contactEventOn(Date.today().minusDay(365 * 10), Contact(108L, \"Anna\".toDisplayName(), URI.create(\"content://com.android.contacts/contacts/108\"), SOURCE_DEVICE), StandardEventType.ANNIVERSARY),\n                    contactEventOn(Date.today().minusDay(365 * 10), Contact(108L, \"Anna\".toDisplayName(), URI.create(\"content://com.android.contacts/contacts/108\"), SOURCE_DEVICE), StandardEventType.OTHER)\n            ))\n\n            true\n        }\n\n        findPreference<Preference>(R.string.key_debug_trigger_namedays_notification)!!\n                .onPreferenceClickListener = Preference.OnPreferenceClickListener {\n            notifier!!.notifyFor(\n                    DailyReminderViewModel(\n                            dailyReminderViewModelFactory!!.summaryOf(emptyList()),\n                            emptyList(),\n                            namedaysNotifications(\n                                    arrayListOf(\"NamedayTest\", \"Alex\", \"Bravo\", \"NamedaysRock\"\n                                            , \"Alex\", \"Bravo\", \"NamedaysRock\"\n                                            , \"Alex\", \"Bravo\", \"NamedaysRock\"\n                                            , \"Alex\", \"Bravo\", \"NamedaysRock\")),\n                            Optional.absent()\n                    )\n            )\n            true\n        }\n        findPreference<Preference>(R.string.key_debug_trigger_bank_holiday)!!\n                .onPreferenceClickListener = Preference.OnPreferenceClickListener {\n            notifier!!.notifyFor(\n                    DailyReminderViewModel(\n                            dailyReminderViewModelFactory!!.summaryOf(emptyList()),\n                            emptyList(),\n                            Optional.absent(),\n                            bankholidayNotification()\n                    )\n            )\n            true\n        }\n\n        findPreference<Preference>(R.string.key_debug_configure_widgets)!!\n                .onPreferenceClickListener = Preference.OnPreferenceClickListener {\n            val intent = Intent(activity, UpcomingWidgetConfigureActivity::class.java)\n            activity!!.startActivity(intent)\n            true\n        }\n    }\n\n    private fun notifyForContacts(contacts: ArrayList<ContactEvent>) {\n        val viewModels = contacts\n                .toViewModels()\n\n        notifier!!.notifyFor(\n                DailyReminderViewModel(\n                        dailyReminderViewModelFactory!!.summaryOf(viewModels),\n                        viewModels,\n                        Optional.absent(),\n                        Optional.absent()\n                )\n        )\n    }\n\n    private fun bankholidayNotification() = Optional(dailyReminderViewModelFactory!!.viewModelFor(BankHoliday(\"Test Bank Holiday\", Date.today())))\n\n    private fun namedaysNotifications(arrayList: ArrayList<String>): Optional<NamedaysNotificationViewModel> =\n            Optional(dailyReminderViewModelFactory!!.viewModelFor(NamesInADate(Date.today(),\n                    arrayList\n            )))\n\n    private fun contactEventOn(date: Date, contact: Contact, standardEventType: StandardEventType) = ContactEvent(Optional.absent(), standardEventType,\n            date, contact)\n\n    private fun showToast(message: String) {\n        Toast.makeText(activity, message, Toast.LENGTH_SHORT).show()\n    }\n\n    private fun startDateIntent() {\n        val cal = Calendar.getInstance()\n        val builder = CalendarContract.CONTENT_URI.buildUpon()\n        builder.appendPath(\"time\")\n        ContentUris.appendId(builder, cal.timeInMillis)\n        val intent = Intent(Intent.ACTION_VIEW)\n                .setData(builder.build())\n\n        startActivity(intent)\n    }\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {\n        super.onActivityResult(requestCode, resultCode, data)\n        if (requestCode == RESULT_PICK_CONTACT && resultCode == Activity.RESULT_OK) {\n            val intent = Intent(Intent.ACTION_VIEW)\n            val uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, data.data!!.lastPathSegment.toString())\n            intent.data = uri\n            startActivity(intent)\n        }\n    }\n\n    companion object {\n\n        private const val RESULT_PICK_CONTACT = 4929\n    }\n\n    private fun String.toDisplayName(): DisplayName = DisplayName.from(this)\n\n    private fun ArrayList<ContactEvent>.toViewModels(): ArrayList<ContactEventNotificationViewModel> {\n        val viewmodels = arrayListOf<ContactEventNotificationViewModel>()\n        forEach {\n            viewmodels.add(dailyReminderViewModelFactory!!.viewModelFor(it.contact, listOf(it)))\n        }\n        return viewmodels\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/debug/java/com/alexstyl/specialdates/debug/DebugModule.java",
    "content": "package com.alexstyl.specialdates.debug;\n\nimport android.content.Context;\n\nimport com.alexstyl.specialdates.dailyreminder.DailyReminderDebugPreferences;\nimport com.alexstyl.specialdates.events.namedays.NamedayDatabaseRefresher;\nimport com.alexstyl.specialdates.events.peopleevents.DebugPeopleEventsUpdater;\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsStaticEventsRefresher;\n\nimport dagger.Module;\nimport dagger.Provides;\n\n@Module\npublic class DebugModule {\n\n    @Provides\n    DebugPeopleEventsUpdater debugPeopleEventsUpdater(PeopleEventsStaticEventsRefresher peopleEventsStaticEventsRefresher,\n                                                      NamedayDatabaseRefresher namedayDatabaseRefresher) {\n        return new DebugPeopleEventsUpdater(peopleEventsStaticEventsRefresher, namedayDatabaseRefresher);\n    }\n\n    @Provides\n    DailyReminderDebugPreferences debugPreferences(Context context) {\n        return DailyReminderDebugPreferences.newInstance(context);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/debug/java/com/alexstyl/specialdates/debug/DebugPreferences.java",
    "content": "package com.alexstyl.specialdates.debug;\n\nimport android.content.Context;\nimport android.support.annotation.StringRes;\n\nimport com.alexstyl.specialdates.EasyPreferences;\n\nfinal class DebugPreferences {\n\n    private final EasyPreferences preferences;\n\n    public static DebugPreferences newInstance(Context context, @StringRes int prefKey) {\n        return new DebugPreferences(EasyPreferences.createForPrivatePreferences(context, prefKey));\n    }\n\n    private DebugPreferences(EasyPreferences preferences) {\n        this.preferences = preferences;\n    }\n\n    void wipe() {\n        preferences.clear();\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/debug/java/com/alexstyl/specialdates/donate/DebugDonationPreferences.java",
    "content": "package com.alexstyl.specialdates.donate;\n\nimport android.content.Context;\n\nimport com.alexstyl.specialdates.EasyPreferences;\nimport com.alexstyl.specialdates.R;\n\npublic final class DebugDonationPreferences {\n\n    private final EasyPreferences easyPreferences;\n    private final DonateMonitor donateMonitor;\n\n    public static DebugDonationPreferences newInstance(Context context, DonateMonitor donateMonitor) {\n        return new DebugDonationPreferences(EasyPreferences.createForDefaultPreferences(context), donateMonitor);\n    }\n\n    private DebugDonationPreferences(EasyPreferences easyPreferences, DonateMonitor donateMonitor) {\n        this.easyPreferences = easyPreferences;\n        this.donateMonitor = donateMonitor;\n    }\n\n    public void reset() {\n        easyPreferences.setBoolean(R.string.key_has_donated, false);\n        donateMonitor.onDonationUpdated();\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/debug/java/com/alexstyl/specialdates/events/peopleevents/DebugPeopleEventsUpdater.java",
    "content": "package com.alexstyl.specialdates.events.peopleevents;\n\nimport com.alexstyl.specialdates.events.namedays.NamedayDatabaseRefresher;\n\npublic final class DebugPeopleEventsUpdater {\n\n    private final PeopleEventsStaticEventsRefresher peopleEventsStaticEventsRefresher;\n    private final NamedayDatabaseRefresher namedayDatabaseRefresher;\n\n    public DebugPeopleEventsUpdater(PeopleEventsStaticEventsRefresher peopleEventsStaticEventsRefresher,\n                                    NamedayDatabaseRefresher namedayDatabaseRefresher) {\n        this.peopleEventsStaticEventsRefresher = peopleEventsStaticEventsRefresher;\n        this.namedayDatabaseRefresher = namedayDatabaseRefresher;\n    }\n\n    public void refresh() {\n        peopleEventsStaticEventsRefresher.rebuildEvents();\n        namedayDatabaseRefresher.refreshNamedaysIfEnabled();\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/debug/res/layout/activity_debug.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<fragment xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:id=\"@+id/search_fragment\"\n  android:name=\"com.alexstyl.specialdates.debug.DebugFragment\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"match_parent\" />\n\n"
  },
  {
    "path": "android_mobile/src/debug/res/layout/debug_activity_animations.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\">\n\n  <com.alexstyl.specialdates.addevent.BirthdayLabelView\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"></com.alexstyl.specialdates.addevent.BirthdayLabelView>\n</RelativeLayout>\n\n\n"
  },
  {
    "path": "android_mobile/src/debug/res/layout/debug_activity_mixing_colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"match_parent\"\n  android:orientation=\"vertical\">\n\n  <TextView\n    android:id=\"@+id/text\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"Lorem ipsum and stuff\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "android_mobile/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    package=\"com.alexstyl.specialdates\"\n    android:installLocation=\"internalOnly\">\n\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n    <uses-permission android:name=\"android.permission.GET_ACCOUNTS\" />\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n    <uses-permission android:name=\"android.permission.READ_CONTACTS\" />\n    <uses-permission android:name=\"android.permission.WRITE_CONTACTS\" />\n    <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\" />\n    <uses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\" />\n    <uses-permission android:name=\"android.permission.VIBRATE\" />\n\n    <uses-permission\n        android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"\n        android:maxSdkVersion=\"18\" />\n\n\n    <!-- The BLUETOOTH permission is used for mixpanel-->\n    <uses-permission android:name=\"android.permission.BLUETOOTH\" />\n\n    <uses-permission android:name=\"com.android.vending.BILLING\" />\n\n    <uses-feature\n        android:name=\"android.hardware.camera\"\n        android:required=\"false\" />\n\n    <application\n        android:name=\"com.alexstyl.specialdates.MementoApplication\"\n        android:allowBackup=\"true\"\n        android:exported=\"true\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/localised_app_name\">\n\n        <activity android:name=\"com.alexstyl.specialdates.home.HomeActivity\" />\n\n        <!-- Activity alias used so that we can modify the UpcomingEventsActivity file without worrying about the name -->\n        <activity-alias\n            android:name=\"com.alexstyl.specialdates.ui.activity.MainActivity\"\n            android:targetActivity=\".home.HomeActivity\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity-alias>\n\n        <activity\n            android:name=\"com.alexstyl.specialdates.search.SearchActivity\"\n            android:parentActivityName=\"com.alexstyl.specialdates.home.HomeActivity\"\n            android:windowSoftInputMode=\"stateVisible|adjustResize\">\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\"com.alexstyl.specialdates.home.HomeActivity\" />\n        </activity>\n\n\n        <activity\n            android:name=\".settings.DailyReminderActivity\"\n            android:exported=\"true\"\n            android:label=\"@string/daily_reminder\"\n            android:launchMode=\"singleInstance\"\n            android:parentActivityName=\".home.HomeActivity\">\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".home.HomeActivity\" />\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n                <category android:name=\"android.intent.category.NOTIFICATION_PREFERENCES\" />\n            </intent-filter>\n        </activity>\n\n        <activity\n            android:name=\"com.alexstyl.specialdates.addevent.AddEventActivity\"\n            android:exported=\"true\"\n            android:label=\"@string/add_event_title\"\n            android:parentActivityName=\"com.alexstyl.specialdates.home.HomeActivity\"\n            android:screenOrientation=\"portrait\"\n            android:windowSoftInputMode=\"stateHidden\">\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\"com.alexstyl.specialdates.home.HomeActivity\" />\n        </activity>\n\n\n        <activity\n            android:name=\"com.alexstyl.specialdates.support.RateDialog\"\n            android:label=\"@string/support_app\"\n            android:noHistory=\"true\"\n            android:parentActivityName=\"com.alexstyl.specialdates.home.HomeActivity\"\n            android:theme=\"@style/Theme.Dayslight.DialogNoTitle\">\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\"com.alexstyl.specialdates.home.HomeActivity\" />\n        </activity>\n\n        <activity\n            android:name=\".upcoming.widget.today.UpcomingWidgetConfigureActivity\"\n            android:label=\"@string/Configure_widget\"\n            android:noHistory=\"true\"\n            android:theme=\"@style/Theme.Memento.Wallpaper\">\n            <intent-filter>\n                <action android:name=\"android.appwidget.action.APPWIDGET_CONFIGURE\" />\n            </intent-filter>\n        </activity>\n\n        <activity\n            android:name=\"com.theartofdev.edmodo.cropper.CropImageActivity\"\n            android:theme=\"@style/Base.Theme.AppCompat\" />\n\n\n        <activity android:name=\".permissions.ContactPermissionActivity\" />\n\n        <activity\n            android:name=\".donate.DonateActivity\"\n            android:label=\"@string/donate_welcome\"\n            android:parentActivityName=\".home.HomeActivity\"\n            android:theme=\"@style/Theme.Donate\" />\n\n        <activity\n            android:name=\".facebook.login.FacebookLogInActivity\"\n            android:label=\"@string/title_facebook_log_in\" />\n\n        <activity\n            android:name=\".facebook.FacebookProfileActivity\"\n            android:label=\"@string/title_facebook_profile\" />\n\n        <activity\n            android:name=\".person.PersonActivity\"\n            android:parentActivityName=\".home.HomeActivity\">\n\n            <intent-filter>\n                <action android:name=\"com.android.contacts.action.QUICK_CONTACT\" />\n                <action android:name=\"android.provider.action.QUICK_CONTACT\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n\n                <data android:mimeType=\"vnd.android.cursor.item/contact\" />\n                <data android:mimeType=\"vnd.android.cursor.item/person\" />\n            </intent-filter>\n\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n                <category android:name=\"android.intent.category.DEFAULT\" />\n\n                <data android:mimeType=\"vnd.android.cursor.item/person\" />\n                <data android:mimeType=\"vnd.android.cursor.item/contact\" />\n                <data android:mimeType=\"vnd.android.cursor.item/raw_contact\" />\n            </intent-filter>\n\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".home.HomeActivity\" />\n        </activity>\n\n        <activity\n            android:name=\".events.namedays.activity.NamedaysOnADayActivity\"\n            android:parentActivityName=\".home.HomeActivity\">\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\".home.HomeActivity\" />\n        </activity>\n\n\n        <activity android:name=\".dailyreminder.actions.PersonActionsActivity\" />\n\n        <activity android:name=\".upcoming.widget.list.WidgetRouterActivity\" />\n        <!-- Services -->\n\n        <service\n            android:name=\"com.alexstyl.specialdates.wear.WearSyncService\"\n            android:exported=\"false\" />\n\n        <receiver android:name=\"com.alexstyl.specialdates.DeviceConfigurationUpdatedReceiver\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.LOCALE_CHANGED\" />\n            </intent-filter>\n        </receiver>\n\n        <receiver android:name=\"com.alexstyl.specialdates.receiver.BootCompleteReceiver\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.TIME_SET\" />\n                <action android:name=\"android.intent.action.BOOT_COMPLETED\" />\n            </intent-filter>\n        </receiver>\n\n        <receiver\n            android:name=\".upcoming.widget.today.TodayAppWidgetProvider\"\n            android:label=\"@string/widget_upcoming_title_simple\">\n            <intent-filter>\n                <action android:name=\"android.appwidget.action.APPWIDGET_UPDATE\" />\n            </intent-filter>\n\n            <meta-data\n                android:name=\"android.appwidget.provider\"\n                android:resource=\"@xml/widget_info_upcoming_events_simple\" />\n        </receiver>\n\n        <receiver\n            android:name=\".upcoming.widget.list.UpcomingEventsScrollingAppWidgetProvider\"\n            android:label=\"@string/widget_upcoming_title_list\">\n            <intent-filter>\n                <action android:name=\"android.appwidget.action.APPWIDGET_UPDATE\" />\n            </intent-filter>\n\n            <meta-data\n                android:name=\"android.appwidget.provider\"\n                android:resource=\"@xml/widget_info_upcoming_events_list\" />\n        </receiver>\n\n        <service\n            android:name=\".upcoming.widget.list.UpcomingEventsRemoteViewService\"\n            android:permission=\"android.permission.BIND_REMOTEVIEWS\" />\n\n        <service\n            android:name=\".facebook.friendimport.FacebookFriendsIntentService\"\n            android:label=\"@string/title_facebook_friends_import\" />\n\n        <meta-data\n            android:name=\"io.fabric.ApiKey\"\n            android:value=\"${crashlyticsApiKey}\" />\n\n        <meta-data\n            android:name=\"com.google.android.gms.version\"\n            android:value=\"@integer/google_play_services_version\" />\n\n        <provider\n            android:name=\"android.support.v4.content.FileProvider\"\n            android:authorities=\"${fileProvider}\"\n            android:exported=\"false\"\n            android:grantUriPermissions=\"true\">\n            <meta-data\n                android:name=\"android.support.FILE_PROVIDER_PATHS\"\n                android:resource=\"@xml/file_paths\" />\n        </provider>\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "android_mobile/src/main/aidl/com/android/vending/billing/IInAppBillingService.aidl",
    "content": "/*\n * Copyright (C) 2012 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.android.vending.billing;\n\nimport android.os.Bundle;\n\n/**\n * InAppBillingService is the service that provides in-app billing version 3 and beyond.\n * This service provides the following features:\n * 1. Provides a new API to get details of in-app items published for the app including\n *    price, type, title and description.\n * 2. The purchase flow is synchronous and purchase information is available immediately\n *    after it completes.\n * 3. Purchase information of in-app purchases is maintained within the Google Play system\n *    till the purchase is consumed.\n * 4. An API to consume a purchase of an inapp item. All purchases of one-time\n *    in-app items are consumable and thereafter can be purchased again.\n * 5. An API to get current purchases of the user immediately. This will not contain any\n *    consumed purchases.\n *\n * All calls will give a response code with the following possible values\n * RESULT_OK = 0 - success\n * RESULT_USER_CANCELED = 1 - User pressed back or canceled a dialog\n * RESULT_SERVICE_UNAVAILABLE = 2 - The network connection is down\n * RESULT_BILLING_UNAVAILABLE = 3 - This billing API version is not supported for the type requested\n * RESULT_ITEM_UNAVAILABLE = 4 - Requested SKU is not available for purchase\n * RESULT_DEVELOPER_ERROR = 5 - Invalid arguments provided to the API\n * RESULT_ERROR = 6 - Fatal error during the API action\n * RESULT_ITEM_ALREADY_OWNED = 7 - Failure to purchase since item is already owned\n * RESULT_ITEM_NOT_OWNED = 8 - Failure to consume since item is not owned\n */\ninterface IInAppBillingService {\n    /**\n     * Checks support for the requested billing API version, package and in-app type.\n     * Minimum API version supported by this interface is 3.\n     * @param apiVersion billing API version that the app is using\n     * @param packageName the package name of the calling app\n     * @param type type of the in-app item being purchased (\"inapp\" for one-time purchases\n     *        and \"subs\" for subscriptions)\n     * @return RESULT_OK(0) on success and appropriate response code on failures.\n     */\n    int isBillingSupported(int apiVersion, String packageName, String type);\n\n    /**\n     * Provides details of a list of SKUs\n     * Given a list of SKUs of a valid type in the skusBundle, this returns a bundle\n     * with a list JSON strings containing the productId, price, title and description.\n     * This API can be called with a maximum of 20 SKUs.\n     * @param apiVersion billing API version that the app is using\n     * @param packageName the package name of the calling app\n     * @param type of the in-app items (\"inapp\" for one-time purchases\n     *        and \"subs\" for subscriptions)\n     * @param skusBundle bundle containing a StringArrayList of SKUs with key \"ITEM_ID_LIST\"\n     * @return Bundle containing the following key-value pairs\n     *         \"RESPONSE_CODE\" with int value, RESULT_OK(0) if success, appropriate response codes\n     *                         on failures.\n     *         \"DETAILS_LIST\" with a StringArrayList containing purchase information\n     *                        in JSON format similar to:\n     *                        '{ \"productId\" : \"exampleSku\",\n     *                           \"type\" : \"inapp\",\n     *                           \"price\" : \"$5.00\",\n     *                           \"price_currency\": \"USD\",\n     *                           \"price_amount_micros\": 5000000,\n     *                           \"title : \"Example Title\",\n     *                           \"description\" : \"This is an example description\" }'\n     */\n    Bundle getSkuDetails(int apiVersion, String packageName, String type, in Bundle skusBundle);\n\n    /**\n     * Returns a pending intent to launch the purchase flow for an in-app item by providing a SKU,\n     * the type, a unique purchase token and an optional developer payload.\n     * @param apiVersion billing API version that the app is using\n     * @param packageName package name of the calling app\n     * @param sku the SKU of the in-app item as published in the developer console\n     * @param type of the in-app item being purchased (\"inapp\" for one-time purchases\n     *        and \"subs\" for subscriptions)\n     * @param developerPayload optional argument to be sent back with the purchase information\n     * @return Bundle containing the following key-value pairs\n     *         \"RESPONSE_CODE\" with int value, RESULT_OK(0) if success, appropriate response codes\n     *                         on failures.\n     *         \"BUY_INTENT\" - PendingIntent to start the purchase flow\n     *\n     * The Pending intent should be launched with startIntentSenderForResult. When purchase flow\n     * has completed, the onActivityResult() will give a resultCode of OK or CANCELED.\n     * If the purchase is successful, the result data will contain the following key-value pairs\n     *         \"RESPONSE_CODE\" with int value, RESULT_OK(0) if success, appropriate response\n     *                         codes on failures.\n     *         \"INAPP_PURCHASE_DATA\" - String in JSON format similar to\n     *                                 '{\"orderId\":\"12999763169054705758.1371079406387615\",\n     *                                   \"packageName\":\"com.example.app\",\n     *                                   \"productId\":\"exampleSku\",\n     *                                   \"purchaseTime\":1345678900000,\n     *                                   \"purchaseToken\" : \"122333444455555\",\n     *                                   \"developerPayload\":\"example developer payload\" }'\n     *         \"INAPP_DATA_SIGNATURE\" - String containing the signature of the purchase data that\n     *                                  was signed with the private key of the developer\n     */\n    Bundle getBuyIntent(int apiVersion, String packageName, String sku, String type,\n        String developerPayload);\n\n    /**\n     * Returns the current SKUs owned by the user of the type and package name specified along with\n     * purchase information and a signature of the data to be validated.\n     * This will return all SKUs that have been purchased in V3 and managed items purchased using\n     * V1 and V2 that have not been consumed.\n     * @param apiVersion billing API version that the app is using\n     * @param packageName package name of the calling app\n     * @param type of the in-app items being requested (\"inapp\" for one-time purchases\n     *        and \"subs\" for subscriptions)\n     * @param continuationToken to be set as null for the first call, if the number of owned\n     *        skus are too many, a continuationToken is returned in the response bundle.\n     *        This method can be called again with the continuation token to get the next set of\n     *        owned skus.\n     * @return Bundle containing the following key-value pairs\n     *         \"RESPONSE_CODE\" with int value, RESULT_OK(0) if success, appropriate response codes\n                               on failures.\n     *         \"INAPP_PURCHASE_ITEM_LIST\" - StringArrayList containing the list of SKUs\n     *         \"INAPP_PURCHASE_DATA_LIST\" - StringArrayList containing the purchase information\n     *         \"INAPP_DATA_SIGNATURE_LIST\"- StringArrayList containing the signatures\n     *                                      of the purchase information\n     *         \"INAPP_CONTINUATION_TOKEN\" - String containing a continuation token for the\n     *                                      next set of in-app purchases. Only set if the\n     *                                      user has more owned skus than the current list.\n     */\n    Bundle getPurchases(int apiVersion, String packageName, String type, String continuationToken);\n\n    /**\n     * Consume the last purchase of the given SKU. This will result in this item being removed\n     * from all subsequent responses to getPurchases() and allow re-purchase of this item.\n     * @param apiVersion billing API version that the app is using\n     * @param packageName package name of the calling app\n     * @param purchaseToken token in the purchase information JSON that identifies the purchase\n     *        to be consumed\n     * @return RESULT_OK(0) if consumption succeeded, appropriate response codes on failures.\n     */\n    int consumePurchase(int apiVersion, String packageName, String purchaseToken);\n\n    /**\n     * This API is currently under development.\n     */\n    int stub(int apiVersion, String packageName, String type);\n\n    /**\n     * Returns a pending intent to launch the purchase flow for upgrading or downgrading a\n     * subscription. The existing owned SKU(s) should be provided along with the new SKU that\n     * the user is upgrading or downgrading to.\n     * @param apiVersion billing API version that the app is using, must be 5 or later\n     * @param packageName package name of the calling app\n     * @param oldSkus the SKU(s) that the user is upgrading or downgrading from,\n     *        if null or empty this method will behave like {@link #getBuyIntent}\n     * @param newSku the SKU that the user is upgrading or downgrading to\n     * @param type of the item being purchased, currently must be \"subs\"\n     * @param developerPayload optional argument to be sent back with the purchase information\n     * @return Bundle containing the following key-value pairs\n     *         \"RESPONSE_CODE\" with int value, RESULT_OK(0) if success, appropriate response codes\n     *                         on failures.\n     *         \"BUY_INTENT\" - PendingIntent to start the purchase flow\n     *\n     * The Pending intent should be launched with startIntentSenderForResult. When purchase flow\n     * has completed, the onActivityResult() will give a resultCode of OK or CANCELED.\n     * If the purchase is successful, the result data will contain the following key-value pairs\n     *         \"RESPONSE_CODE\" with int value, RESULT_OK(0) if success, appropriate response\n     *                         codes on failures.\n     *         \"INAPP_PURCHASE_DATA\" - String in JSON format similar to\n     *                                 '{\"orderId\":\"12999763169054705758.1371079406387615\",\n     *                                   \"packageName\":\"com.example.app\",\n     *                                   \"productId\":\"exampleSku\",\n     *                                   \"purchaseTime\":1345678900000,\n     *                                   \"purchaseToken\" : \"122333444455555\",\n     *                                   \"developerPayload\":\"example developer payload\" }'\n     *         \"INAPP_DATA_SIGNATURE\" - String containing the signature of the purchase data that\n     *                                  was signed with the private key of the developer\n     */\n    Bundle getBuyIntentToReplaceSkus(int apiVersion, String packageName,\n        in List<String> oldSkus, String newSku, String type, String developerPayload);\n\n    /**\n     * Returns a pending intent to launch the purchase flow for an in-app item. This method is\n     * a variant of the {@link #getBuyIntent} method and takes an additional {@code extraParams}\n     * parameter. This parameter is a Bundle of optional keys and values that affect the\n     * operation of the method.\n     * @param apiVersion billing API version that the app is using, must be 6 or later\n     * @param packageName package name of the calling app\n     * @param sku the SKU of the in-app item as published in the developer console\n     * @param type of the in-app item being purchased (\"inapp\" for one-time purchases\n     *        and \"subs\" for subscriptions)\n     * @param developerPayload optional argument to be sent back with the purchase information\n     * @extraParams a Bundle with the following optional keys:\n     *        \"skusToReplace\" - List<String> - an optional list of SKUs that the user is\n     *                          upgrading or downgrading from.\n     *                          Pass this field if the purchase is upgrading or downgrading\n     *                          existing subscriptions.\n     *                          The specified SKUs are replaced with the SKUs that the user is\n     *                          purchasing. Google Play replaces the specified SKUs at the start of\n     *                          the next billing cycle.\n     * \"replaceSkusProration\" - Boolean - whether the user should be credited for any unused\n     *                          subscription time on the SKUs they are upgrading or downgrading.\n     *                          If you set this field to true, Google Play swaps out the old SKUs\n     *                          and credits the user with the unused value of their subscription\n     *                          time on a pro-rated basis.\n     *                          Google Play applies this credit to the new subscription, and does\n     *                          not begin billing the user for the new subscription until after\n     *                          the credit is used up.\n     *                          If you set this field to false, the user does not receive credit for\n     *                          any unused subscription time and the recurrence date does not\n     *                          change.\n     *                          Default value is true. Ignored if you do not pass skusToReplace.\n     *            \"accountId\" - String - an optional obfuscated string that is uniquely\n     *                          associated with the user's account in your app.\n     *                          If you pass this value, Google Play can use it to detect irregular\n     *                          activity, such as many devices making purchases on the same\n     *                          account in a short period of time.\n     *                          Do not use the developer ID or the user's Google ID for this field.\n     *                          In addition, this field should not contain the user's ID in\n     *                          cleartext.\n     *                          We recommend that you use a one-way hash to generate a string from\n     *                          the user's ID, and store the hashed string in this field.\n     *                   \"vr\" - Boolean - an optional flag indicating whether the returned intent\n     *                          should start a VR purchase flow. The apiVersion must also be 7 or\n     *                          later to use this flag.\n     */\n    Bundle getBuyIntentExtraParams(int apiVersion, String packageName, String sku,\n        String type, String developerPayload, in Bundle extraParams);\n\n    /**\n     * Returns the most recent purchase made by the user for each SKU, even if that purchase is\n     * expired, canceled, or consumed.\n     * @param apiVersion billing API version that the app is using, must be 6 or later\n     * @param packageName package name of the calling app\n     * @param type of the in-app items being requested (\"inapp\" for one-time purchases\n     *        and \"subs\" for subscriptions)\n     * @param continuationToken to be set as null for the first call, if the number of owned\n     *        skus is too large, a continuationToken is returned in the response bundle.\n     *        This method can be called again with the continuation token to get the next set of\n     *        owned skus.\n     * @param extraParams a Bundle with extra params that would be appended into http request\n     *        query string. Not used at this moment. Reserved for future functionality.\n     * @return Bundle containing the following key-value pairs\n     *         \"RESPONSE_CODE\" with int value: RESULT_OK(0) if success,\n     *         {@link IabHelper#BILLING_RESPONSE_RESULT_*} response codes on failures.\n     *\n     *         \"INAPP_PURCHASE_ITEM_LIST\" - ArrayList<String> containing the list of SKUs\n     *         \"INAPP_PURCHASE_DATA_LIST\" - ArrayList<String> containing the purchase information\n     *         \"INAPP_DATA_SIGNATURE_LIST\"- ArrayList<String> containing the signatures\n     *                                      of the purchase information\n     *         \"INAPP_CONTINUATION_TOKEN\" - String containing a continuation token for the\n     *                                      next set of in-app purchases. Only set if the\n     *                                      user has more owned skus than the current list.\n     */\n    Bundle getPurchaseHistory(int apiVersion, String packageName, String type,\n        String continuationToken, in Bundle extraParams);\n\n    /**\n    * This method is a variant of {@link #isBillingSupported}} that takes an additional\n    * {@code extraParams} parameter.\n    * @param apiVersion billing API version that the app is using, must be 7 or later\n    * @param packageName package name of the calling app\n    * @param type of the in-app item being purchased (\"inapp\" for one-time purchases and \"subs\"\n    *        for subscriptions)\n    * @param extraParams a Bundle with the following optional keys:\n    *        \"vr\" - Boolean - an optional flag to indicate whether {link #getBuyIntentExtraParams}\n    *               supports returning a VR purchase flow.\n    * @return RESULT_OK(0) on success and appropriate response code on failures.\n    */\n    int isBillingSupportedExtraParams(int apiVersion, String packageName, String type,\n        in Bundle extraParams);\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/android/support/v4/preference/PreferenceFragment.java",
    "content": "/*\n * Copyright (C) 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage android.support.v4.preference;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.os.Message;\nimport android.preference.Preference;\nimport android.preference.PreferenceGroup;\nimport android.preference.PreferenceManager;\nimport android.preference.PreferenceScreen;\nimport android.support.v4.app.Fragment;\nimport android.view.KeyEvent;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.View.OnKeyListener;\nimport android.view.ViewGroup;\nimport android.widget.ListView;\n\nimport com.alexstyl.specialdates.R;\n\n@SuppressWarnings(\"all\")\npublic abstract class PreferenceFragment extends Fragment implements\n\t\tPreferenceManagerCompat.OnPreferenceTreeClickListener {\n\n\tprivate static final String PREFERENCES_TAG = \"android:preferences\";\n\n    private PreferenceManager mPreferenceManager;\n    private ListView mList;\n    private boolean mHavePrefs;\n    private boolean mInitDone;\n\n    /**\n     * The starting request code given out to preference framework.\n     */\n    private static final int FIRST_REQUEST_CODE = 100;\n\n    private static final int MSG_BIND_PREFERENCES = 1;\n    private Handler mHandler = new Handler() {\n        @Override\n        public void handleMessage(Message msg) {\n            switch (msg.what) {\n\n                case MSG_BIND_PREFERENCES:\n                    bindPreferences();\n                    break;\n            }\n        }\n    };\n\n    final private Runnable mRequestFocus = new Runnable() {\n        public void run() {\n            mList.focusableViewAvailable(mList);\n        }\n    };\n\n    /**\n     * Interface that PreferenceFragment's containing activity should\n     * implement to be able to process preference items that wish to\n     * switch to a new fragment.\n     */\n    public interface OnPreferenceStartFragmentCallback {\n        /**\n         * Called when the user has clicked on a Preference that has\n         * a fragment class name associated with it.  The implementation\n         * to should instantiate and switch to an instance of the given\n         * fragment.\n         */\n        boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref);\n    }\n\n    @Override\n\tpublic void onCreate(Bundle paramBundle) {\n\t\tsuper.onCreate(paramBundle);\n\t\tmPreferenceManager = PreferenceManagerCompat.newInstance(getActivity(), FIRST_REQUEST_CODE);\n\t\tPreferenceManagerCompat.setFragment(mPreferenceManager, this);\n\t}\n\n    @Override\n    public void onViewCreated(View view, Bundle savedInstanceState) {\n        super.onViewCreated(view, savedInstanceState);\n\n    }\n\n    @Override\n\tpublic View onCreateView(LayoutInflater paramLayoutInflater, ViewGroup paramViewGroup,\n\t\t\tBundle paramBundle) {\n\t\treturn paramLayoutInflater.inflate(\n                R.layout.preference_list_fragment, paramViewGroup,\n\t\t\t\tfalse);\n\t}\n\n    @Override\n    public void onActivityCreated(Bundle savedInstanceState) {\n        super.onActivityCreated(savedInstanceState);\n\n        if (mHavePrefs) {\n            bindPreferences();\n        }\n\n        mInitDone = true;\n\n        if (savedInstanceState != null) {\n            Bundle container = savedInstanceState.getBundle(PREFERENCES_TAG);\n            if (container != null) {\n                final PreferenceScreen preferenceScreen = getPreferenceScreen();\n                if (preferenceScreen != null) {\n                    preferenceScreen.restoreHierarchyState(container);\n                }\n            }\n        }\n    }\n\n    @Override\n    public void onStart() {\n        super.onStart();\n        PreferenceManagerCompat.setOnPreferenceTreeClickListener(mPreferenceManager, this);\n    }\n\n    @Override\n\tpublic void onStop() {\n\t\tsuper.onStop();\n\t\tPreferenceManagerCompat.dispatchActivityStop(mPreferenceManager);\n\t\tPreferenceManagerCompat.setOnPreferenceTreeClickListener(mPreferenceManager, null);\n\t}\n\n    @Override\n\tpublic void onDestroyView() {\n\t\tmList = null;\n\t\tmHandler.removeCallbacks(mRequestFocus);\n\t\tmHandler.removeMessages(MSG_BIND_PREFERENCES);\n\t\tsuper.onDestroyView();\n\t}\n\n    @Override\n\tpublic void onDestroy() {\n\t\tsuper.onDestroy();\n\t\tPreferenceManagerCompat.dispatchActivityDestroy(mPreferenceManager);\n\t}\n\n    @Override\n    public void onSaveInstanceState(Bundle outState) {\n        super.onSaveInstanceState(outState);\n\n        final PreferenceScreen preferenceScreen = getPreferenceScreen();\n        if (preferenceScreen != null) {\n            Bundle container = new Bundle();\n            preferenceScreen.saveHierarchyState(container);\n            outState.putBundle(PREFERENCES_TAG, container);\n        }\n    }\n\n    @Override\n\tpublic void onActivityResult(int requestCode, int resultCode, Intent data) {\n\t\tsuper.onActivityResult(requestCode, resultCode, data);\n\n        PreferenceManagerCompat.dispatchActivityResult(mPreferenceManager, requestCode, resultCode, data);\n\t}\n\n    /**\n     * Returns the {@link PreferenceManager} used by this fragment.\n     * @return The {@link PreferenceManager}.\n     */\n    public PreferenceManager getPreferenceManager() {\n        return mPreferenceManager;\n    }\n\n    /**\n     * Sets the root of the preference hierarchy that this fragment is showing.\n     *\n     * @param preferenceScreen The root {@link PreferenceScreen} of the preference hierarchy.\n     */\n    public void setPreferenceScreen(PreferenceScreen preferenceScreen) {\n        if (PreferenceManagerCompat.setPreferences(mPreferenceManager, preferenceScreen) && preferenceScreen != null) {\n            mHavePrefs = true;\n            if (mInitDone) {\n                postBindPreferences();\n            }\n        }\n    }\n\n    /**\n     * Gets the root of the preference hierarchy that this fragment is showing.\n     *\n     * @return The {@link PreferenceScreen} that is the root of the preference\n     *         hierarchy.\n     */\n    public PreferenceScreen getPreferenceScreen() {\n        return PreferenceManagerCompat.getPreferenceScreen(mPreferenceManager);\n    }\n\n    /**\n     * Adds preferences from activities that match the given {@link Intent}.\n     *\n     * @param intent The {@link Intent} to query activities.\n     */\n    public void addPreferencesFromIntent(Intent intent) {\n        requirePreferenceManager();\n\n        setPreferenceScreen(PreferenceManagerCompat.inflateFromIntent(mPreferenceManager, intent, getPreferenceScreen()));\n    }\n\n    /**\n     * Inflates the given XML resource and adds the preference hierarchy to the current\n     * preference hierarchy.\n     *\n     * @param preferencesResId The XML resource ID to inflate.\n     */\n    public void addPreferencesFromResource(int preferencesResId) {\n        requirePreferenceManager();\n\n        setPreferenceScreen(PreferenceManagerCompat.inflateFromResource(mPreferenceManager, getActivity(),\n        \t\tpreferencesResId, getPreferenceScreen()));\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,\n            Preference preference) {\n        //if (preference.getFragment() != null &&\n    \tif (\n                getActivity() instanceof OnPreferenceStartFragmentCallback) {\n            return ((OnPreferenceStartFragmentCallback)getActivity()).onPreferenceStartFragment(\n                    this, preference);\n        }\n        return false;\n    }\n\n    /**\n     * Finds a {@link Preference} based on its key.\n     *\n     * @param key The key of the preference to retrieve.\n     * @return The {@link Preference} with the key, or null.\n     * @see PreferenceGroup#findPreference(CharSequence)\n     */\n    public Preference findPreference(CharSequence key) {\n        if (mPreferenceManager == null) {\n            return null;\n        }\n        return mPreferenceManager.findPreference(key);\n    }\n\n    private void requirePreferenceManager() {\n        if (mPreferenceManager == null) {\n            throw new RuntimeException(\"This should be called after super.onCreate.\");\n        }\n    }\n\n    private void postBindPreferences() {\n        if (mHandler.hasMessages(MSG_BIND_PREFERENCES)) return;\n        mHandler.obtainMessage(MSG_BIND_PREFERENCES).sendToTarget();\n    }\n\n    private void bindPreferences() {\n        final PreferenceScreen preferenceScreen = getPreferenceScreen();\n        if (preferenceScreen != null) {\n            preferenceScreen.bind(getListView());\n        }\n    }\n\n    public ListView getListView() {\n        ensureList();\n        return mList;\n    }\n\n    private void ensureList() {\n        if (mList != null) {\n            return;\n        }\n        View root = getView();\n        if (root == null) {\n            throw new IllegalStateException(\"Content view not yet created\");\n        }\n        View rawListView = root.findViewById(android.R.id.list);\n        if (!(rawListView instanceof ListView)) {\n            throw new RuntimeException(\n                    \"Content has view with id attribute 'android.R.id.list' \"\n                    + \"that is not a ListView class\");\n        }\n        mList = (ListView)rawListView;\n        if (mList == null) {\n            throw new RuntimeException(\n                    \"Your content must have a ListView whose id attribute is \" +\n                    \"'android.R.id.list'\");\n        }\n        mList.setOnKeyListener(mListOnKeyListener);\n        mHandler.post(mRequestFocus);\n    }\n\n    private OnKeyListener mListOnKeyListener = new OnKeyListener() {\n\n        @Override\n        public boolean onKey(View v, int keyCode, KeyEvent event) {\n            Object selectedItem = mList.getSelectedItem();\n            if (selectedItem instanceof Preference) {\n                @SuppressWarnings(\"unused\")\n\t\t\t\tView selectedView = mList.getSelectedView();\n                //return ((Preference)selectedItem).onKey(\n                //        selectedView, keyCode, event);\n                return false;\n            }\n            return false;\n        }\n\n    };\n\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/android/support/v4/preference/PreferenceManagerCompat.java",
    "content": "/*\n * Copyright (C) 2013 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage android.support.v4.preference;\n\nimport java.lang.reflect.Constructor;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.InvocationHandler;\nimport java.lang.reflect.Method;\nimport java.lang.reflect.Proxy;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.preference.Preference;\nimport android.preference.PreferenceManager;\nimport android.preference.PreferenceScreen;\nimport android.util.Log;\n\npublic class PreferenceManagerCompat {\n\t\n\tprivate static final String TAG = PreferenceManagerCompat.class.getSimpleName();\n\t\n    /**\n     * Interface definition for a callback to be invoked when a\n     * {@link Preference} in the hierarchy rooted at this {@link PreferenceScreen} is\n     * clicked.\n     */\n    interface OnPreferenceTreeClickListener {\n        /**\n         * Called when a preference in the tree rooted at this\n         * {@link PreferenceScreen} has been clicked.\n         * \n         * @param preferenceScreen The {@link PreferenceScreen} that the\n         *        preference is located in.\n         * @param preference The preference that was clicked.\n         * @return Whether the click was handled.\n         */\n        boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference);\n    }\n    \n\tstatic PreferenceManager newInstance(Activity activity, int firstRequestCode) {\n\t\ttry {\n\t\t\tConstructor<PreferenceManager> c = PreferenceManager.class.getDeclaredConstructor(Activity.class, int.class);\n\t\t\tc.setAccessible(true);\n\t\t\treturn c.newInstance(activity, firstRequestCode);\n\t\t} catch (Exception e) {\n\t\t\tLog.w(TAG, \"Couldn't call constructor PreferenceManager by reflection\", e);\n\t\t}\n\t\treturn null;\n\t}\n\t\n\t/**\n     * Sets the owning preference fragment\n     */\n    static void setFragment(PreferenceManager manager, PreferenceFragment fragment) {\n    \t// stub\n    }\n\n    /**\n     * Sets the callback to be invoked when a {@link Preference} in the\n     * hierarchy rooted at this {@link PreferenceManager} is clicked.\n     * \n     * @param listener The callback to be invoked.\n     */\n\tstatic void setOnPreferenceTreeClickListener(PreferenceManager manager, final OnPreferenceTreeClickListener listener) {\n\t\ttry {\n\t\t\tField onPreferenceTreeClickListener = PreferenceManager.class.getDeclaredField(\"mOnPreferenceTreeClickListener\");\n\t\t\tonPreferenceTreeClickListener.setAccessible(true);\n\t\t\tif (listener != null) {\n\t\t\t\tObject proxy = Proxy.newProxyInstance(\n\t\t\t\t\t\tonPreferenceTreeClickListener.getType().getClassLoader(),\n\t\t\t\t\t\tnew Class[] { onPreferenceTreeClickListener.getType() },\n\t\t\t\t\t\tnew InvocationHandler() {\n\t\t\t\t\tpublic Object invoke(Object proxy, Method method, Object[] args) {\n\t\t\t\t\t\tif (method.getName().equals(\"onPreferenceTreeClick\")) {\n\t\t\t\t\t\t\treturn Boolean.valueOf(listener.onPreferenceTreeClick((PreferenceScreen) args[0], (Preference) args[1]));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tonPreferenceTreeClickListener.set(manager, proxy);\n\t\t\t} else {\n\t\t\t\tonPreferenceTreeClickListener.set(manager, null);\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\tLog.w(TAG, \"Couldn't set PreferenceManager.mOnPreferenceTreeClickListener by reflection\", e);\n\t\t}\n\t}\n\t\n\t/**\n     * Inflates a preference hierarchy from the preference hierarchies of\n     * {@link Activity Activities} that match the given {@link Intent}. An\n     * {@link Activity} defines its preference hierarchy with meta-data using\n     * the {@link #METADATA_KEY_PREFERENCES} key.\n     * <p>\n     * If a preference hierarchy is given, the new preference hierarchies will\n     * be merged in.\n     * \n     * @param queryIntent The intent to match activities.\n     * @param rootPreferences Optional existing hierarchy to merge the new\n     *            hierarchies into.\n     * @return The root hierarchy (if one was not provided, the new hierarchy's\n     *         root).\n     */\n\tstatic PreferenceScreen inflateFromIntent(PreferenceManager manager, Intent intent, PreferenceScreen screen) {\n\t\ttry {\n            Method m = PreferenceManager.class.getDeclaredMethod(\"inflateFromIntent\", Intent.class, PreferenceScreen.class);\n            m.setAccessible(true);\n            PreferenceScreen prefScreen = (PreferenceScreen) m.invoke(manager, intent, screen);\n            return prefScreen;\n        } catch (Exception e) {\n\t\t\tLog.w(TAG, \"Couldn't call PreferenceManager.inflateFromIntent by reflection\", e);\n\t\t}\n\t\treturn null;\n\t}\n\t\n\t/**\n     * Inflates a preference hierarchy from XML. If a preference hierarchy is\n     * given, the new preference hierarchies will be merged in.\n     * \n     * @param context The context of the resource.\n     * @param resId The resource ID of the XML to inflate.\n     * @param rootPreferences Optional existing hierarchy to merge the new\n     *            hierarchies into.\n     * @return The root hierarchy (if one was not provided, the new hierarchy's\n     *         root).\n     * @hide\n     */\n\tstatic PreferenceScreen inflateFromResource(PreferenceManager manager, Activity activity, int resId, PreferenceScreen screen) {\n\t\ttry {\n            Method m = PreferenceManager.class.getDeclaredMethod(\"inflateFromResource\", Context.class, int.class, PreferenceScreen.class);\n            m.setAccessible(true);\n            PreferenceScreen prefScreen = (PreferenceScreen) m.invoke(manager, activity, resId, screen);\n            return prefScreen;\n        } catch (Exception e) {\n\t\t\tLog.w(TAG, \"Couldn't call PreferenceManager.inflateFromResource by reflection\", e);\n\t\t}\n\t\treturn null;\n\t}\n\t\n\t/**\n     * Returns the root of the preference hierarchy managed by this class.\n     *  \n     * @return The {@link PreferenceScreen} object that is at the root of the hierarchy.\n     */\n\tstatic PreferenceScreen getPreferenceScreen(PreferenceManager manager) {\n\t\ttry {\n            Method m = PreferenceManager.class.getDeclaredMethod(\"getPreferenceScreen\");\n            m.setAccessible(true);\n            return (PreferenceScreen) m.invoke(manager);\n        } catch (Exception e) {\n\t\t\tLog.w(TAG, \"Couldn't call PreferenceManager.getPreferenceScreen by reflection\", e);\n\t\t}\n\t\treturn null;\n\t}\n\t\n\t/**\n     * Called by the {@link PreferenceManager} to dispatch a subactivity result.\n     */\n\tstatic void dispatchActivityResult(PreferenceManager manager, int requestCode, int resultCode, Intent data) {\n\t\ttry {\n            Method m = PreferenceManager.class.getDeclaredMethod(\"dispatchActivityResult\", int.class, int.class, Intent.class);\n            m.setAccessible(true);\n            m.invoke(manager, requestCode, resultCode, data);\n        } catch (Exception e) {\n\t\t\tLog.w(TAG, \"Couldn't call PreferenceManager.dispatchActivityResult by reflection\", e);\n\t\t}\n\t}\n\t\n\t/**\n     * Called by the {@link PreferenceManager} to dispatch the activity stop\n     * event.\n     */\n\tstatic void dispatchActivityStop(PreferenceManager manager) {\n\t\ttry {\n            Method m = PreferenceManager.class.getDeclaredMethod(\"dispatchActivityStop\");\n            m.setAccessible(true);\n            m.invoke(manager);\n        } catch (Exception e) {\n\t\t\tLog.w(TAG, \"Couldn't call PreferenceManager.dispatchActivityStop by reflection\", e);\n\t\t}\n\t}\n\t\n\t/**\n     * Called by the {@link PreferenceManager} to dispatch the activity destroy\n     * event.\n     */\n\tstatic void dispatchActivityDestroy(PreferenceManager manager) {\n\t\ttry {\n\t\t\tMethod m = PreferenceManager.class.getDeclaredMethod(\"dispatchActivityDestroy\");\n\t\t\tm.setAccessible(true);\n\t\t\tm.invoke(manager);\n\t\t} catch (Exception e) {\n\t\t\tLog.w(TAG, \"Couldn't call PreferenceManager.dispatchActivityDestroy by reflection\", e);\n\t\t}\n\t}\n\n\t/**\n     * Sets the root of the preference hierarchy.\n     * \n     * @param preferenceScreen The root {@link PreferenceScreen} of the preference hierarchy.\n     * @return Whether the {@link PreferenceScreen} given is different than the previous. \n     */\n\tstatic boolean setPreferences(PreferenceManager manager, PreferenceScreen screen) {\n\t\ttry {\n\t\t\tMethod m = PreferenceManager.class.getDeclaredMethod(\"setPreferences\", PreferenceScreen.class);\n\t\t\tm.setAccessible(true);\n\t\t\treturn ((Boolean) m.invoke(manager, screen));\n\t\t} catch (Exception e) {\n\t\t\tLog.w(TAG, \"Couldn't call PreferenceManager.setPreferences by reflection\", e);\n\t\t}\n\t\treturn false;\n\t}\n\t\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/android/Bitmap.kt",
    "content": "package com.alexstyl.android\n\nimport android.graphics.Bitmap\nimport android.graphics.Canvas\nimport android.graphics.drawable.BitmapDrawable\nimport android.graphics.drawable.Drawable\nimport android.net.Uri\nimport java.net.URI\n\nfun Drawable.toBitmap(): Bitmap {\n    if (this is BitmapDrawable) {\n        return bitmap\n    }\n\n    val width = if (bounds.isEmpty) intrinsicWidth else bounds.width()\n    val height = if (bounds.isEmpty) intrinsicHeight else bounds.height()\n\n    return Bitmap.createBitmap(width.nonZero(), height.nonZero(), Bitmap.Config.ARGB_8888).also {\n        val canvas = Canvas(it)\n        setBounds(0, 0, canvas.width, canvas.height)\n        draw(canvas)\n    }\n}\n\nprivate fun Int.nonZero() = if (this <= 0) 1 else this\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/android/SimpleAnimatorListener.java",
    "content": "package com.alexstyl.android;\n\nimport android.animation.Animator;\n\npublic class SimpleAnimatorListener implements Animator.AnimatorListener {\n    @Override\n    public void onAnimationStart(Animator animator) {\n        // do nothing\n    }\n\n    @Override\n    public void onAnimationEnd(Animator animator) {\n        // do nothing\n    }\n\n    @Override\n    public void onAnimationCancel(Animator animator) {\n        // do nothing\n    }\n\n    @Override\n    public void onAnimationRepeat(Animator animator) {\n        // do nothing\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/android/Uri.kt",
    "content": "package com.alexstyl.android\n\nimport android.net.Uri\nimport java.net.URI\n\nfun URI.toUri(): Uri = Uri.parse(this.toString())\n\nfun Uri.toURI(): URI = URI.create(this.toString())\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/android/preferences/PreferenceKeyId.java",
    "content": "package com.alexstyl.android.preferences;\n\npublic @interface PreferenceKeyId {\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/resources/AndroidColors.kt",
    "content": "package com.alexstyl.resources\n\nimport android.content.Context\nimport android.support.v4.content.ContextCompat\nimport com.alexstyl.specialdates.R\nimport com.alexstyl.specialdates.events.database.EventTypeId\nimport com.alexstyl.specialdates.events.peopleevents.EventType\n\nclass AndroidColors(private val context: Context) : Colors {\n    override fun getColorFor(eventType: EventType) = when (eventType.id) {\n        EventTypeId.TYPE_BIRTHDAY -> ContextCompat.getColor(context, R.color.birthday_red)\n        EventTypeId.TYPE_NAMEDAY -> ContextCompat.getColor(context, R.color.nameday_blue)\n        EventTypeId.TYPE_ANNIVERSARY -> ContextCompat.getColor(context, R.color.anniversary_yellow)\n        EventTypeId.TYPE_CUSTOM -> ContextCompat.getColor(context, R.color.purple_custom_event)\n        EventTypeId.TYPE_OTHER -> ContextCompat.getColor(context, R.color.purple_custom_event)\n        else -> {\n            throw IllegalStateException(\"No color matching for $eventType\")\n        }\n    }\n\n    override fun getDateHeaderTextColor(): Int = ContextCompat.getColor(context, R.color.upcoming_header_text_color)\n\n    override fun getTodayHeaderTextColor(): Int = ContextCompat.getColor(context, R.color.upcoming_header_today_text_color)\n\n    override fun getDailyReminderColor(): Int = ContextCompat.getColor(context, R.color.main_red)\n\n    override fun getNamedaysColor(): Int = ContextCompat.getColor(context, R.color.nameday_blue)\n\n    override fun getBankholidaysColor(): Int = ContextCompat.getColor(context, R.color.bankholiday_green)\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/resources/ResourcesModule.java",
    "content": "package com.alexstyl.resources;\n\nimport android.content.Context;\nimport android.content.res.Resources;\n\nimport com.alexstyl.specialdates.AndroidStrings;\nimport com.alexstyl.specialdates.Strings;\n\nimport javax.inject.Singleton;\n\nimport dagger.Module;\nimport dagger.Provides;\n\n@Module\n@Singleton\npublic class ResourcesModule {\n\n    private final Resources resources;\n    private final Context context;\n\n    public ResourcesModule(Context context, Resources resources) {\n        this.context = context;\n        this.resources = resources;\n    }\n\n    @Provides\n    @Singleton\n    Strings providesString() {\n        return new AndroidStrings(resources);\n    }\n\n    @Provides\n    @Singleton\n    DimensionResources providesDimensionResources() {\n        return new AndroidDimensionResources(resources);\n    }\n\n    @Provides\n    @Singleton\n    Colors providesColorResources() {\n        return new AndroidColors(context);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/AndroidApplicationModule.java",
    "content": "package com.alexstyl.specialdates;\n\nimport android.app.AlarmManager;\nimport android.app.NotificationManager;\nimport android.appwidget.AppWidgetManager;\nimport android.content.ContentResolver;\nimport android.content.Context;\nimport android.content.pm.PackageManager;\nimport android.content.res.Resources;\n\nimport com.alexstyl.Logger;\nimport com.alexstyl.android.AndroidLogger;\nimport com.alexstyl.specialdates.dailyreminder.AlarmManagerCompat;\nimport com.alexstyl.specialdates.events.database.EventSQLiteOpenHelper;\nimport com.alexstyl.specialdates.permissions.AndroidPermissions;\nimport com.alexstyl.specialdates.permissions.MementoPermissions;\nimport com.evernote.android.job.JobManager;\n\nimport javax.inject.Singleton;\n\nimport dagger.Module;\nimport dagger.Provides;\n\n@Module\nclass AndroidApplicationModule {\n\n    private final Context context;\n\n    AndroidApplicationModule(Context appContext) {\n        this.context = appContext;\n    }\n\n    @Provides\n    Context appContext() {\n        return context;\n    }\n\n    @Provides\n    Resources resources() {\n        return context.getResources();\n    }\n\n    @Provides\n    PackageManager pkgManager() {\n        return context.getPackageManager();\n    }\n\n    @Provides\n    ContentResolver contentResolver() {\n        return context.getContentResolver();\n    }\n\n    @Provides\n    AppWidgetManager appWidgetManager() {\n        return AppWidgetManager.getInstance(context);\n    }\n\n    @Provides\n    @Singleton\n    EventSQLiteOpenHelper sqLiteOpenHelper() {\n        return new EventSQLiteOpenHelper(context);\n    }\n\n    @Provides\n    MementoPermissions permissionChecker(CrashAndErrorTracker tracker) {\n        return new AndroidPermissions(tracker, context);\n    }\n\n    @Provides\n    CrashAndErrorTracker tracker() {\n        return new FabricTracker(context);\n    }\n\n    @Provides\n    @Singleton\n    JobManager jobManager() {\n        return JobManager.create(context);\n    }\n\n    @Provides\n    NotificationManager notificationManager() {\n        return (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);\n    }\n\n    @Provides\n    Logger logger() {\n        return new AndroidLogger();\n    }\n\n    @Provides\n    AlarmManagerCompat alarmManagerCompat() {\n        return new AlarmManagerCompat((AlarmManager) context.getSystemService(Context.ALARM_SERVICE));\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/AppComponent.java",
    "content": "package com.alexstyl.specialdates;\n\nimport com.alexstyl.resources.ResourcesModule;\nimport com.alexstyl.specialdates.addevent.AddEventActivity;\nimport com.alexstyl.specialdates.addevent.AddEventModule;\nimport com.alexstyl.specialdates.addevent.EventDatePickerDialogFragment;\nimport com.alexstyl.specialdates.addevent.ui.ContactSuggestionView;\nimport com.alexstyl.specialdates.analytics.AnalyticsModule;\nimport com.alexstyl.specialdates.contact.ContactsModule;\nimport com.alexstyl.specialdates.dailyreminder.actions.PersonActionsActivity;\nimport com.alexstyl.specialdates.dailyreminder.DailyReminderModule;\nimport com.alexstyl.specialdates.dailyreminder.actions.ContactActionsModule;\nimport com.alexstyl.specialdates.date.DateModule;\nimport com.alexstyl.specialdates.donate.DonateActivity;\nimport com.alexstyl.specialdates.donate.DonateModule;\nimport com.alexstyl.specialdates.events.bankholidays.BankHolidaysModule;\nimport com.alexstyl.specialdates.events.namedays.NamedayModule;\nimport com.alexstyl.specialdates.events.namedays.activity.NamedaysOnADayActivity;\nimport com.alexstyl.specialdates.events.namedays.activity.NamedaysInADayModule;\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsModule;\nimport com.alexstyl.specialdates.facebook.FacebookModule;\nimport com.alexstyl.specialdates.facebook.FacebookProfileActivity;\nimport com.alexstyl.specialdates.facebook.friendimport.FacebookFriendsIntentService;\nimport com.alexstyl.specialdates.facebook.login.FacebookLogInActivity;\nimport com.alexstyl.specialdates.facebook.login.FacebookWebView;\nimport com.alexstyl.specialdates.home.HomeActivity;\nimport com.alexstyl.specialdates.images.ImageModule;\nimport com.alexstyl.specialdates.people.PeopleFragment;\nimport com.alexstyl.specialdates.people.PeopleModule;\nimport com.alexstyl.specialdates.permissions.ContactPermissionActivity;\nimport com.alexstyl.specialdates.person.PersonActivity;\nimport com.alexstyl.specialdates.person.PersonModule;\nimport com.alexstyl.specialdates.receiver.BootCompleteReceiver;\nimport com.alexstyl.specialdates.search.SearchActivity;\nimport com.alexstyl.specialdates.search.SearchModule;\nimport com.alexstyl.specialdates.settings.DailyReminderFragment;\nimport com.alexstyl.specialdates.settings.UserSettingsFragment;\nimport com.alexstyl.specialdates.settings.NamedayListPreference;\nimport com.alexstyl.specialdates.support.RateDialog;\nimport com.alexstyl.specialdates.theming.ThemingModule;\nimport com.alexstyl.specialdates.ui.base.ThemedMementoActivity;\nimport com.alexstyl.specialdates.ui.widget.ColorImageView;\nimport com.alexstyl.specialdates.ui.widget.ViewModule;\nimport com.alexstyl.specialdates.upcoming.UpcomingEventsFragment;\nimport com.alexstyl.specialdates.upcoming.UpcomingEventsModule;\nimport com.alexstyl.specialdates.upcoming.widget.RecentUpcomingPeopleEventsModule;\nimport com.alexstyl.specialdates.upcoming.widget.list.UpcomingEventsRemoteViewService;\nimport com.alexstyl.specialdates.upcoming.widget.list.UpcomingEventsScrollingAppWidgetProvider;\nimport com.alexstyl.specialdates.upcoming.widget.list.WidgetRouterActivity;\nimport com.alexstyl.specialdates.upcoming.widget.today.TodayAppWidgetProvider;\nimport com.alexstyl.specialdates.upcoming.widget.today.UpcomingWidgetConfigureActivity;\nimport com.alexstyl.specialdates.wear.WearSyncService;\n\nimport javax.inject.Singleton;\n\nimport org.jetbrains.annotations.NotNull;\n\nimport dagger.Component;\n\n@Singleton\n@Component(modules = {\n        AndroidApplicationModule.class,\n        AnalyticsModule.class,\n        ContactActionsModule.class,\n        ResourcesModule.class,\n        ContactsModule.class,\n        DateModule.class,\n        ImageModule.class,\n        ViewModule.class,\n        NamedayModule.class,\n        UpcomingEventsModule.class,\n        NamedaysInADayModule.class,\n        DailyReminderModule.class,\n        DonateModule.class,\n        SearchModule.class,\n        PeopleEventsModule.class,\n        BankHolidaysModule.class,\n        AddEventModule.class,\n        FacebookModule.class,\n        PeopleModule.class,\n        BankHolidaysModule.class,\n        ThemingModule.class,\n        RecentUpcomingPeopleEventsModule.class,\n        PersonModule.class\n})\npublic interface AppComponent {\n    void inject(MementoApplication application);\n\n    void inject(HomeActivity activity);\n\n    void inject(UpcomingEventsFragment fragment);\n\n    void inject(AddEventActivity activity);\n\n    void inject(SearchActivity activity);\n\n    void inject(FacebookProfileActivity activity);\n\n    void inject(FacebookLogInActivity activity);\n\n    void inject(RateDialog activity);\n\n    void inject(UserSettingsFragment fragment);\n\n    void inject(DailyReminderFragment fragment);\n\n    void inject(DonateActivity activity);\n\n    void inject(UpcomingEventsScrollingAppWidgetProvider widgetProvider);\n\n    void inject(TodayAppWidgetProvider widgetProvider);\n\n    void inject(PersonActivity activity);\n\n    void inject(NamedaysOnADayActivity activity);\n\n    void inject(EventDatePickerDialogFragment fragment);\n\n    void inject(UpcomingEventsRemoteViewService viewService);\n\n    void inject(ContactSuggestionView view);\n\n    void inject(NamedayListPreference preference);\n\n    void inject(WearSyncService service);\n\n    void inject(ColorImageView view);\n\n    void inject(UpcomingWidgetConfigureActivity activity);\n\n    void inject(WidgetRouterActivity widgetRouterActivity);\n\n    void inject(DeviceConfigurationUpdatedReceiver receiver);\n\n    void inject(FacebookFriendsIntentService service);\n\n    void inject(ContactPermissionActivity activity);\n\n    void inject(BootCompleteReceiver receiver);\n\n    void inject(PeopleFragment peopleFragment);\n\n    void inject(FacebookWebView peopleFragment);\n\n    void inject(@NotNull ThemedMementoActivity themedMementoActivity);\n\n    void inject(@NotNull PersonActionsActivity personActionsActivity);\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/DeviceConfigurationUpdatedReceiver.java",
    "content": "package com.alexstyl.specialdates;\n\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport android.content.Intent;\n\nimport com.alexstyl.specialdates.events.peopleevents.UpcomingEventsViewRefresher;\n\nimport javax.inject.Inject;\n\n/**\n * A {@linkplain BroadcastReceiver} that keeps track whether the user has updated some option on their device\n * external to Memento which can affect the app.\n */\npublic class DeviceConfigurationUpdatedReceiver extends BroadcastReceiver {\n\n    @Inject UpcomingEventsViewRefresher viewRefresher;\n    @Inject CrashAndErrorTracker tracker;\n\n    @Override\n    public void onReceive(Context context, Intent intent) {\n        ((MementoApplication) context.getApplicationContext()).getApplicationModule().inject(this);\n\n        String action = intent.getAction();\n        if (Intent.ACTION_LOCALE_CHANGED.equals(action)) {\n            tracker.updateLocaleUsed();\n            viewRefresher.refreshViews();\n        } else if (Intent.ACTION_DATE_CHANGED.equals(action)) {\n            viewRefresher.refreshViews();\n        }\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/EasyPreferences.java",
    "content": "package com.alexstyl.specialdates;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.content.res.Resources;\nimport android.preference.PreferenceManager;\nimport android.support.annotation.BoolRes;\nimport android.support.annotation.StringRes;\nimport android.support.v4.util.Pair;\n\npublic final class EasyPreferences {\n\n    private final SharedPreferences prefs;\n    private final Resources res;\n\n    public static EasyPreferences createForDefaultPreferences(Context context) {\n        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);\n        Resources resources = context.getResources();\n        return new EasyPreferences(preferences, resources);\n    }\n\n    public static EasyPreferences createForPrivatePreferences(Context context, @StringRes int fileName) {\n        SharedPreferences preferences = context.getSharedPreferences(context.getString(fileName), Context.MODE_PRIVATE);\n        Resources resources = context.getResources();\n        return new EasyPreferences(preferences, resources);\n    }\n\n    private EasyPreferences(SharedPreferences preferences, Resources resources) {\n        this.prefs = preferences;\n        this.res = resources;\n    }\n\n    private String key(int key) {\n        return res.getString(key);\n    }\n\n    public boolean getBoolean(@StringRes int bool, boolean defValue) {\n        return prefs.getBoolean(key(bool), defValue);\n    }\n\n    public boolean getBoolean(@StringRes int bool, @BoolRes int fallbackDefaultValue) {\n        boolean contains = prefs.contains(key(bool));\n        if (contains) {\n            return prefs.getBoolean(key(bool), false);\n        }\n        return res.getBoolean(fallbackDefaultValue);\n    }\n\n    public void setBoolean(@StringRes int key, boolean value) {\n        prefs.edit().putBoolean(key(key), value).apply();\n    }\n\n    public void setString(@StringRes int key, String value) {\n        prefs.edit().putString(key(key), value).apply();\n    }\n\n    public void setInteger(@StringRes int key, int value) {\n        prefs.edit().putInt(key(key), value).apply();\n    }\n\n    public int getInt(@StringRes int key, int defValue) {\n        return prefs.getInt(key(key), defValue);\n    }\n\n    public long getLong(@StringRes int key, long defValue) {\n        return prefs.getLong(key(key), defValue);\n    }\n\n    public String getString(@StringRes int key, String defValue) {\n        return prefs.getString(key(key), defValue);\n    }\n\n    public float getFloat(@StringRes int key, float defValue) {\n        return prefs.getFloat(key(key), defValue);\n    }\n\n    public void setLong(@StringRes int key, long value) {\n        prefs.edit().putLong(key(key), value).apply();\n    }\n\n    public void clear() {\n        prefs.edit().clear().apply();\n    }\n\n    public void setFloat(@StringRes int key, float value) {\n        prefs.edit().putFloat(key(key), value).apply();\n    }\n\n    public void setIntegers(Pair<Integer, Integer> firstPair, Pair<Integer, Integer>... otherPairs) {\n        SharedPreferences.Editor edit = prefs.edit();\n        edit.putInt(key(firstPair.first), firstPair.second);\n        for (Pair<Integer, Integer> pair : otherPairs) {\n            edit.putInt(key(pair.first), pair.second);\n        }\n        edit.apply();\n    }\n\n    public void addOnPreferenceChangedListener(SharedPreferences.OnSharedPreferenceChangeListener listener) {\n        prefs.registerOnSharedPreferenceChangeListener(listener);\n    }\n\n    public void removeOnPreferenceChagnedListener(SharedPreferences.OnSharedPreferenceChangeListener listener) {\n        prefs.unregisterOnSharedPreferenceChangeListener(listener);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/ExternalNavigator.java",
    "content": "package com.alexstyl.specialdates;\n\nimport android.app.Activity;\nimport android.content.ActivityNotFoundException;\nimport android.content.Intent;\nimport android.content.pm.PackageManager;\nimport android.content.pm.ResolveInfo;\nimport android.net.Uri;\nimport android.provider.ContactsContract.Contacts;\nimport android.widget.Toast;\n\nimport com.alexstyl.specialdates.analytics.Analytics;\nimport com.alexstyl.specialdates.analytics.Screen;\nimport com.alexstyl.specialdates.contact.Contact;\nimport com.alexstyl.specialdates.contact.ContactSource;\nimport com.alexstyl.specialdates.person.BottomSheetIntentDialog;\nimport com.alexstyl.specialdates.ui.base.MementoActivity;\nimport com.novoda.simplechromecustomtabs.SimpleChromeCustomTabs;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class ExternalNavigator {\n\n    private final MementoActivity activity;\n    private final Analytics analytics;\n    private final CrashAndErrorTracker tracker;\n\n    public ExternalNavigator(MementoActivity activity, Analytics analytics, CrashAndErrorTracker tracker) {\n        this.activity = activity;\n        this.analytics = analytics;\n        this.tracker = tracker;\n        SimpleChromeCustomTabs.initialize(activity);\n    }\n\n    private Uri createPlayStoreUri() {\n        String packageName = activity.getPackageName();\n        return Uri.parse(\"market://details?id=\" + packageName);\n    }\n\n    public void toPlayStore() {\n        try {\n            Intent intent = new Intent(Intent.ACTION_VIEW, createPlayStoreUri());\n            activity.startActivity(intent);\n            analytics.trackScreen(Screen.PLAY_STORE);\n        } catch (ActivityNotFoundException e) {\n            tracker.track(e);\n        }\n    }\n\n    public void connectTo(Activity activity) {\n        SimpleChromeCustomTabs.getInstance().connectTo(activity);\n    }\n\n    public void disconnectTo(Activity activity) {\n        SimpleChromeCustomTabs.getInstance().disconnectFrom(activity);\n    }\n\n    public void toContactDetails(Contact contact) {\n        if (contact.getSource() == ContactSource.SOURCE_FACEBOOK) {\n            toFacebookContactDetails(contact);\n        } else if (contact.getSource() == ContactSource.SOURCE_DEVICE) {\n            toDeviceContactDetails(contact);\n        } else {\n            throw new IllegalStateException(\"Invalid contact source \" + contact.getSource());\n        }\n    }\n\n    private void toFacebookContactDetails(Contact contact) {\n        try {\n            Intent intent = new Intent(Intent.ACTION_VIEW);\n            intent.setData(Uri.parse(\"https://www.facebook.com/\" + contact.getContactID()));\n            activity.startActivity(intent);\n        } catch (ActivityNotFoundException ex) {\n            Toast.makeText(activity, R.string.no_app_found, Toast.LENGTH_SHORT).show();\n        }\n    }\n\n    private void toDeviceContactDetails(Contact contact) {\n        try {\n            ArrayList<Intent> intents = viewContactIntentsFromOtherApps(contact);\n            if (intents.size() == 1) {\n                activity.startActivity(intents.get(0));\n            } else if (intents.size() > 1) {\n                // show bottom sheet with options\n                BottomSheetIntentDialog bottomSheetPicturesDialog =\n                        BottomSheetIntentDialog.Companion.newIntent(\n                                activity.getString(R.string.View_contact),\n                                intents);\n                bottomSheetPicturesDialog.show(activity.getSupportFragmentManager(), \"CONTACT\");\n            }\n        } catch (ActivityNotFoundException ex) {\n            Toast.makeText(activity,\n                    R.string.no_app_found,\n                    Toast.LENGTH_SHORT).show();\n        }\n    }\n\n    private ArrayList<Intent> viewContactIntentsFromOtherApps(Contact contact) {\n        PackageManager packageManager = activity.getPackageManager();\n\n        Intent intent = viewContact(contact);\n        List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);\n        String myPackage = activity.getPackageName();\n        ArrayList<Intent> targetIntents = new ArrayList<>();\n        for (ResolveInfo currentInfo : activities) {\n            String packageName = currentInfo.activityInfo.packageName;\n            if (!myPackage.equals(packageName)) {\n                Intent targetIntent = viewContact(contact);\n                intent.setPackage(packageName);\n                targetIntent.setClassName(packageName, currentInfo.activityInfo.name);\n                targetIntents.add(targetIntent);\n            }\n        }\n        return targetIntents;\n    }\n\n    private Intent viewContact(Contact contact) {\n        Intent intent = new Intent(Intent.ACTION_VIEW);\n        Uri uri = Uri.withAppendedPath(Contacts.CONTENT_URI, String.valueOf(contact.getContactID()));\n        intent.setData(uri);\n        return intent;\n    }\n\n    public void toFacebookPage() {\n        try {\n            Intent intent = new Intent(Intent.ACTION_VIEW);\n            intent.setData(Uri.parse(\"https://www.facebook.com/memento.calendar/\"));\n            activity.startActivity(intent);\n        } catch (ActivityNotFoundException ex) {\n            Toast.makeText(activity,\n                    R.string.no_app_found,\n                    Toast.LENGTH_SHORT)\n                    .show();\n        }\n        analytics.trackScreen(Screen.FACEBOOK_PAGE);\n    }\n}\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/FabricTracker.java",
    "content": "package com.alexstyl.specialdates;\n\nimport android.content.Context;\nimport android.support.annotation.NonNull;\n\nimport com.alexstyl.specialdates.events.namedays.NamedayLocale;\nimport com.crashlytics.android.Crashlytics;\nimport com.novoda.notils.logger.simple.Log;\n\nimport java.util.Locale;\n\nimport io.fabric.sdk.android.Fabric;\n\npublic final class FabricTracker implements CrashAndErrorTracker {\n\n    private static final String TAG = FabricTracker.class.getSimpleName();\n    private static final String KEY_LOCALE = \"user_locale\";\n    private static final String KEY_NAMEDAY_LOCALE = \"nameday_locale\";\n    private static final String NONE = \"no_locale\";\n\n    private static boolean hasBeenInitialised = false;\n\n    private final Context context;\n\n    FabricTracker(Context context) {\n        this.context = context;\n    }\n\n    @Override\n    public void startTracking() {\n        if (BuildConfig.DEBUG) {\n            Log.d(TAG, \"Ignoring Crash Tracking in DEBUG builds\");\n            return;\n        }\n\n        Fabric.with(context, new Crashlytics());\n\n        Log.i(TAG, \"Crashlytics tracking started \");\n        hasBeenInitialised = true;\n        Crashlytics.setString(KEY_LOCALE, String.valueOf(Locale.getDefault()));\n    }\n\n    @Override\n    public void track(@NonNull Throwable e) {\n        if (hasBeenInitialised) {\n            Crashlytics.logException(e);\n        }\n        Log.w(e);\n    }\n\n    @Override\n    public void onNamedayLocaleChanged(NamedayLocale locale) {\n        if (hasBeenInitialised) {\n            Crashlytics.setString(KEY_NAMEDAY_LOCALE, locale == null ? NONE : locale.name());\n        }\n    }\n\n    @Override\n    public void updateLocaleUsed() {\n        if (hasBeenInitialised) {\n            Crashlytics.setString(KEY_LOCALE, String.valueOf(Locale.getDefault()));\n        }\n    }\n\n    @Override\n    public void log(String message) {\n        if (hasBeenInitialised) {\n            Crashlytics.log(message);\n        }\n    }\n}\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/JobsCreator.kt",
    "content": "package com.alexstyl.specialdates\n\nimport com.alexstyl.specialdates.dailyreminder.DailyReminderJob\nimport com.alexstyl.specialdates.dailyreminder.DailyReminderNotifier\nimport com.alexstyl.specialdates.dailyreminder.DailyReminderPresenter\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsUpdater\nimport com.alexstyl.specialdates.upcoming.PeopleEventsRefreshJob\nimport com.evernote.android.job.Job\nimport com.evernote.android.job.JobCreator\n\nclass JobsCreator(private val peopleEventsUpdater: PeopleEventsUpdater,\n                  private val presenter: DailyReminderPresenter,\n                  private val notifier: DailyReminderNotifier) : JobCreator {\n\n    override fun create(tag: String): Job? =\n            when (tag) {\n                PeopleEventsRefreshJob.TAG -> PeopleEventsRefreshJob(peopleEventsUpdater)\n                DailyReminderJob.TAG -> DailyReminderJob(presenter, notifier)\n                else -> {\n                    null\n                }\n            }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/MementoApplication.java",
    "content": "package com.alexstyl.specialdates;\n\nimport android.app.AlarmManager;\nimport android.content.Context;\nimport android.support.multidex.MultiDexApplication;\n\nimport com.alexstyl.resources.ResourcesModule;\nimport com.alexstyl.specialdates.dailyreminder.DailyReminderScheduler;\nimport com.alexstyl.specialdates.dailyreminder.DailyReminderUserSettings;\nimport com.alexstyl.specialdates.events.namedays.activity.NamedaysInADayModule;\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsModule;\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsUpdater;\nimport com.alexstyl.specialdates.events.peopleevents.UpcomingEventsSettings;\nimport com.alexstyl.specialdates.facebook.FacebookModule;\nimport com.alexstyl.specialdates.facebook.FacebookUserSettings;\nimport com.alexstyl.specialdates.facebook.friendimport.FacebookFriendsScheduler;\nimport com.alexstyl.specialdates.images.AndroidContactsImageDownloader;\nimport com.alexstyl.specialdates.images.ImageModule;\nimport com.alexstyl.specialdates.images.NutraBaseImageDecoder;\nimport com.alexstyl.specialdates.permissions.MementoPermissions;\nimport com.alexstyl.specialdates.theming.ThemingModule;\nimport com.alexstyl.specialdates.ui.widget.ViewModule;\nimport com.alexstyl.specialdates.upcoming.PeopleEventsRefreshJob;\nimport com.evernote.android.job.DailyJob;\nimport com.evernote.android.job.JobManager;\nimport com.evernote.android.job.JobRequest;\nimport com.nostra13.universalimageloader.core.ImageLoaderConfiguration;\nimport com.nostra13.universalimageloader.core.assist.QueueProcessingType;\nimport com.nostra13.universalimageloader.utils.L;\nimport com.novoda.notils.logger.simple.Log;\n\nimport javax.inject.Inject;\nimport java.util.concurrent.TimeUnit;\n\nimport net.danlew.android.joda.JodaTimeAndroid;\n\npublic class MementoApplication extends MultiDexApplication {\n\n    private AppComponent appComponent;\n\n    @Inject CrashAndErrorTracker tracker;\n    @Inject FacebookUserSettings facebookSettings;\n    @Inject JobsCreator jobCreator;\n    @Inject PeopleEventsUpdater peopleEventsUpdater;\n    @Inject MementoPermissions permissions;\n    @Inject UpcomingEventsSettings settings;\n    @Inject DailyReminderUserSettings dailyReminderUserSettings;\n    @Inject DailyReminderScheduler androidDailyReminderScheduler;\n\n    @Override\n    public void onCreate() {\n        super.onCreate();\n\n        appComponent =\n                DaggerAppComponent.builder()\n                        .androidApplicationModule(new AndroidApplicationModule(this))\n                        .resourcesModule(new ResourcesModule(this, getResources()))\n                        .imageModule(new ImageModule(getResources()))\n                        .peopleEventsModule(new PeopleEventsModule(this))\n                        .themingModule(new ThemingModule())\n                        .viewModule(new ViewModule(getResources()))\n                        .facebookModule(new FacebookModule(this))\n                        .namedaysInADayModule(new NamedaysInADayModule())\n                        .build();\n\n        appComponent.inject(this);\n\n        initialiseDependencies();\n        tracker.startTracking();\n\n        JobManager.create(this).addJobCreator(jobCreator);\n\n        if (dailyReminderUserSettings.isEnabled()) {\n            androidDailyReminderScheduler.scheduleReminderFor(dailyReminderUserSettings.getTimeSet());\n        }\n\n        if (facebookSettings.isLoggedIn()) {\n            AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);\n            new FacebookFriendsScheduler(this, alarmManager).scheduleNext();// TODO use job schedulerAndroid\n        }\n\n        if (needsToInitialiseEvents()) {\n            peopleEventsUpdater\n                    .updateEvents()\n                    .subscribe();\n        }\n\n        schedulePeopleEventJob();\n    }\n\n    private boolean needsToInitialiseEvents() {\n        return permissions.canReadAndWriteContacts() && !settings.hasBeenInitialised();\n    }\n\n    private void schedulePeopleEventJob() {\n        DailyJob.schedule(\n                new JobRequest.Builder(PeopleEventsRefreshJob.TAG),\n                TimeUnit.HOURS.toMillis(1),\n                TimeUnit.HOURS.toMillis(3)\n        );\n\n    }\n\n    protected void initialiseDependencies() {\n        Log.setShowLogs(BuildConfig.DEBUG);\n        JodaTimeAndroid.init(this);\n        initImageLoader(this);\n    }\n\n    @SuppressWarnings(\"MagicNumber\")\n    public static void initImageLoader(Context context) {\n        ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder(context)\n                .threadPriority(Thread.MIN_PRIORITY)\n                .threadPoolSize(10)\n                .tasksProcessingOrder(QueueProcessingType.LIFO)\n                .imageDecoder(new NutraBaseImageDecoder(BuildConfig.DEBUG))\n                .imageDownloader(new AndroidContactsImageDownloader(context));\n        L.writeLogs(BuildConfig.DEBUG);\n\n        com.nostra13.universalimageloader.core.ImageLoader.getInstance().init(config.build());\n    }\n\n    public AppComponent getApplicationModule() {\n        return appComponent;\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/MementoConstants.kt",
    "content": "package com.alexstyl.specialdates\n\nobject MementoConstants {\n    var PACKAGE = BuildConfig.APPLICATION_ID\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/SQLArgumentBuilder.java",
    "content": "package com.alexstyl.specialdates;\n\nimport com.alexstyl.specialdates.date.Date;\n\npublic final class SQLArgumentBuilder {\n\n    private static final int TEN = 10;\n\n    private SQLArgumentBuilder() {\n        // hide this\n    }\n\n    public static String dateWithoutYear(Date date) {\n        StringBuilder stringBuilder = new StringBuilder();\n        int month = date.getMonth();\n        addWithLeadingZeroIfNeeded(stringBuilder, month);\n        stringBuilder.append(\"-\");\n        addWithLeadingZeroIfNeeded(stringBuilder, date.getDayOfMonth());\n        return stringBuilder.toString();\n    }\n\n    private static void addWithLeadingZeroIfNeeded(StringBuilder stringBuilder, int value) {\n        if (value < TEN) {\n            stringBuilder.append(\"0\");\n        }\n        stringBuilder.append(value);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/ShareAppIntentCreator.java",
    "content": "package com.alexstyl.specialdates;\n\nimport android.content.Intent;\n\npublic class ShareAppIntentCreator {\n\n    private static final String MARKET_LINK_SHORT = \"http://goo.gl/ZQiAsi\";\n\n    private final Strings strings;\n\n    public ShareAppIntentCreator(Strings strings) {\n        this.strings = strings;\n    }\n\n    public Intent buildIntent() {\n        Intent intent = new Intent(Intent.ACTION_SEND);\n        intent.setType(\"text/plain\");\n        intent.putExtra(Intent.EXTRA_TEXT, createShareText());\n        return intent;\n    }\n\n    private String createShareText() {\n        return String.format(strings.shareText(), strings.appName(), MARKET_LINK_SHORT);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/AccountData.java",
    "content": "package com.alexstyl.specialdates.addevent;\n\nimport android.graphics.drawable.Drawable;\n\npublic class AccountData {\n\n    static final AccountData NO_ACCOUNT = new AccountData(null, null, null);\n\n    private final String name;\n    private final String type;\n    private final Drawable icon;\n\n    AccountData(String name, String type, Drawable icon) {\n        this.name = name;\n        this.type = type;\n        this.icon = icon;\n    }\n\n    String getAccountName() {\n        return name;\n    }\n\n    String getAccountType() {\n        return type;\n    }\n\n    Drawable getIcon() {\n        return icon;\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/AddEventActivity.kt",
    "content": "package com.alexstyl.specialdates.addevent\n\nimport android.Manifest\nimport android.annotation.TargetApi\nimport android.app.Activity\nimport android.content.ContentResolver\nimport android.content.Context\nimport android.content.Intent\nimport android.content.pm.PackageManager\nimport android.net.Uri\nimport android.os.Build\nimport android.os.Bundle\nimport android.provider.ContactsContract\nimport android.support.v7.widget.LinearLayoutManager\nimport android.support.v7.widget.RecyclerView\nimport android.view.MenuItem\nimport android.view.View\nimport com.alexstyl.android.toURI\nimport com.alexstyl.specialdates.CrashAndErrorTracker\nimport com.alexstyl.specialdates.MementoApplication\nimport com.alexstyl.specialdates.R\nimport com.alexstyl.specialdates.addevent.EventDatePickerDialogFragment.OnEventDatePickedListener\nimport com.alexstyl.specialdates.addevent.bottomsheet.BottomSheetPicturesDialog\nimport com.alexstyl.specialdates.addevent.bottomsheet.BottomSheetPicturesDialog.Listener\nimport com.alexstyl.specialdates.addevent.bottomsheet.PhotoPickerViewModel\nimport com.alexstyl.specialdates.addevent.ui.AvatarPickerView\nimport com.alexstyl.specialdates.analytics.Analytics\nimport com.alexstyl.specialdates.analytics.Screen\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.events.peopleevents.EventType\nimport com.alexstyl.specialdates.events.peopleevents.ShortDateLabelCreator\nimport com.alexstyl.specialdates.images.ImageLoader\nimport com.alexstyl.specialdates.permissions.MementoPermissions\nimport com.alexstyl.specialdates.ui.base.ThemedMementoActivity\nimport com.alexstyl.specialdates.ui.widget.MementoToolbar\nimport com.theartofdev.edmodo.cropper.CropImage\nimport com.theartofdev.edmodo.cropper.CropImageView\nimport java.net.URI\nimport javax.inject.Inject\n\nclass AddEventActivity : ThemedMementoActivity(), Listener, OnEventDatePickedListener, DiscardPromptDialog.Listener {\n\n    lateinit var presenter: AddEventsPresenter\n        @Inject set\n    lateinit var permissionChecker: MementoPermissions\n        @Inject set\n    lateinit var uriFilePathProvider: UriFilePathProvider\n        @Inject set\n    lateinit var analytics: Analytics\n        @Inject set\n    lateinit var imageLoader: ImageLoader\n        @Inject set\n    lateinit var tracker: CrashAndErrorTracker\n        @Inject set\n    lateinit var shortDateLabelCreator: ShortDateLabelCreator\n        @Inject set\n\n    lateinit var view: AddEventView\n\n    public override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        overridePendingTransition(R.anim.slide_in_from_below, R.anim.stay)\n        setContentView(R.layout.activity_add_event)\n\n        val applicationModule = (application as MementoApplication).applicationModule\n        applicationModule.inject(this)\n        analytics.trackScreen(Screen.ADD_EVENT)\n        val toolbar = findViewById<MementoToolbar>(R.id.memento_toolbar)\n        setSupportActionBar(toolbar)\n        toolbar.displayNavigationIconAsClose()\n\n        val avatarView = findViewById<AvatarPickerView>(R.id.add_event_avatar)\n        val eventsView = findViewById<RecyclerView>(R.id.add_event_events)\n\n        eventsView.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)\n        eventsView.setHasFixedSize(true)\n        val adapter = ContactEventsAdapter(contactDetailsListener)\n        eventsView.adapter = adapter\n\n        avatarView.setOnClickListener {\n            if (avatarView.isDisplayingAvatar) {\n                if (permissionChecker.canReadExternalStorage()) {\n                    BottomSheetPicturesDialog\n                            .includeClearImageOption()\n                            .show(supportFragmentManager, \"picture_pick\")\n                } else {\n                    requestExternalStoragePermission()\n                }\n            } else {\n                if (permissionChecker.canReadExternalStorage()) {\n                    BottomSheetPicturesDialog.newInstance()\n                            .show(supportFragmentManager, \"picture_pick\")\n                } else {\n                    requestExternalStoragePermission()\n                }\n            }\n        }\n\n        val saveButton = findViewById<View>(R.id.add_event_save)\n        saveButton.setOnClickListener {\n            presenter.saveChanges()\n            finishActivitySuccessfully()\n        }\n        view = AndroidAddEventView(avatarView, adapter, imageLoader, createToolbarAnimator(toolbar), saveButton)\n        presenter.startPresentingInto(view)\n    }\n\n\n    @TargetApi(Build.VERSION_CODES.M)\n    private fun requestExternalStoragePermission() {\n        requestPermissions(\n                arrayOf(\n                        Manifest.permission.READ_EXTERNAL_STORAGE, // read any images from disk to use as avatar\n                        Manifest.permission.WRITE_EXTERNAL_STORAGE // save to disk any picture taken by camera\n                ),\n                CODE_PERMISSION_EXTERNAL_STORAGE)\n    }\n\n    private fun createToolbarAnimator(toolbar: MementoToolbar): ToolbarBackgroundAnimator {\n        return if (resources.getBoolean(R.bool.isLandscape)) {\n            ToolbarBackgroundStubAnimator()\n        } else {\n            ToolbarBackgroundFadingAnimator.setupOn(toolbar)\n        }\n    }\n\n    private val contactDetailsListener = object : ContactDetailsListener {\n        override fun onContactCleared() {\n            presenter.removeContact()\n        }\n\n        override fun onAddEventClicked(viewModel: AddEventContactEventViewModel) {\n            val eventType = viewModel.eventType\n            val initialDate = viewModel.date\n\n            val dialog = EventDatePickerDialogFragment.newInstance(eventType, initialDate, shortDateLabelCreator)\n            dialog.show(supportFragmentManager, \"pick_event\")\n        }\n\n        override fun onRemoveEventClicked(eventType: EventType) {\n            presenter.removeEvent(eventType)\n        }\n\n        override fun onContactSelected(contact: Contact) {\n            presenter.presentContact(contact)\n        }\n\n        override fun onNameModified(newName: String) {\n            presenter.removeContact()\n            presenter.presentName(newName)\n        }\n    }\n\n    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n        if (requestCode == CODE_PERMISSION_EXTERNAL_STORAGE && grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {\n            findViewById<View>(android.R.id.content).post(Runnable {\n                if (isFinishing) {\n                    return@Runnable\n                }\n                if (presenter.isDisplayingAvatar()) {\n                    BottomSheetPicturesDialog\n                            .includeClearImageOption()\n                            .show(supportFragmentManager, \"picture_pick\")\n                } else {\n                    BottomSheetPicturesDialog\n                            .newInstance()\n                            .show(supportFragmentManager, \"picture_pick\")\n                }\n            })\n        }\n    }\n\n\n    var viewModel: PhotoPickerViewModel? = null\n\n    override fun onImagePickerOptionSelected(viewModel: PhotoPickerViewModel) {\n        this.viewModel = viewModel\n        startActivityForResult(viewModel.intent, getRequestCodeFor(viewModel.intent))\n    }\n\n\n    private fun getRequestCodeFor(intent: Intent): Int {\n        val action = intent.action\n        return when (action) {\n            ImageIntentFactory.ACTION_IMAGE_CAPTURE -> CODE_TAKE_PICTURE\n            ImageIntentFactory.ACTION_IMAGE_PICK -> CODE_PICK_A_FILE\n            else -> throw IllegalArgumentException(\"Don't know how to handle $action\")\n        }\n    }\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n        super.onActivityResult(requestCode, resultCode, data)\n        if (requestCode == CODE_TAKE_PICTURE && resultCode == Activity.RESULT_OK) {\n            analytics.trackImageCaptured()\n            startCropIntent(viewModel!!.absolutePath)\n        } else if (requestCode == CODE_PICK_A_FILE && resultCode == Activity.RESULT_OK) {\n            analytics.trackExistingImagePicked()\n            val imageUri = BottomSheetPicturesDialog.getImagePickResultUri(data!!)\n            startCropIntent(imageUri)\n        } else if (requestCode == CODE_CROP_IMAGE) {\n            val result = CropImage.getActivityResult(data)\n            if (resultCode == Activity.RESULT_OK) {\n                analytics.trackAvatarSelected()\n                presenter.present(result.uri.toURI())\n            } else if (resultCode == Activity.RESULT_CANCELED && result != null) {\n                tracker.track(result.error)\n            }\n        }\n    }\n\n    private fun startCropIntent(imageToCrop: URI) {\n\n        val prefix = if (imageToCrop.scheme == null) {\n            \"file://\"\n        } else {\n            \"\"\n        }\n\n        val size = queryCropSize(contentResolver)\n        CropImage.activity(Uri.parse(prefix + imageToCrop.toString()))\n                .setGuidelines(CropImageView.Guidelines.ON)\n                .setAspectRatio(1, 1)\n                .setRequestedSize(size, size)\n                .start(this)\n    }\n\n    override fun onDatePicked(eventType: EventType, date: Date) {\n        presenter.onEventDatePicked(eventType, date)\n    }\n\n    private fun queryCropSize(resolver: ContentResolver): Int {\n        resolver.query(\n                ContactsContract.DisplayPhoto.CONTENT_MAX_DIMENSIONS_URI,\n                arrayOf(ContactsContract.DisplayPhoto.DISPLAY_MAX_DIM), null, null, null\n        )?.use { cursor ->\n            if (cursor.moveToFirst()) {\n                return cursor.getInt(0)\n            }\n        }\n        return MAX_RESOLUTION\n    }\n\n    override fun onClearAvatarSelected() {\n        view.clearAvatar()\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        return when (item.itemId) {\n            android.R.id.home -> {\n                if (presenter.isHoldingModifiedData) {\n                    promptToDiscardBeforeExiting()\n                } else {\n                    cancelActivity()\n                }\n                true\n            }\n            else -> super.onOptionsItemSelected(item)\n        }\n    }\n\n    private fun promptToDiscardBeforeExiting() {\n        DiscardPromptDialog()\n                .show(supportFragmentManager, \"discard_prompt\")\n    }\n\n    private fun finishActivitySuccessfully() {\n        analytics.trackEventAddedSuccessfully()\n        setResult(Activity.RESULT_OK)\n        finish()\n    }\n\n    private fun cancelActivity() {\n        analytics.trackAddEventsCancelled()\n        setResult(Activity.RESULT_CANCELED)\n        navigateUpToParent()\n    }\n\n    override fun finish() {\n        super.finish()\n        overridePendingTransition(R.anim.stay, R.anim.slide_out_from_below)\n    }\n\n    override fun onBackPressed() {\n        if (presenter.isHoldingModifiedData) {\n            promptToDiscardBeforeExiting()\n        } else {\n            super.onBackPressed()\n        }\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        presenter.stopPresenting()\n    }\n\n    override fun onDiscardChangesSelected() {\n        cancelActivity()\n    }\n\n    companion object {\n\n        private const val CODE_TAKE_PICTURE = 404\n        private const val CODE_PICK_A_FILE = 405\n        private const val CODE_CROP_IMAGE = CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE\n        private const val CODE_PERMISSION_EXTERNAL_STORAGE = 406\n\n        private const val MAX_RESOLUTION = 720\n\n        fun buildIntent(context: Context): Intent {\n            return Intent(context, AddEventActivity::class.java)\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/AddEventModule.kt",
    "content": "package com.alexstyl.specialdates.addevent\n\nimport android.content.ContentResolver\nimport android.content.Context\nimport com.alexstyl.specialdates.CrashAndErrorTracker\nimport com.alexstyl.specialdates.Strings\nimport com.alexstyl.specialdates.analytics.Analytics\nimport com.alexstyl.specialdates.date.DateLabelCreator\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsProvider\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsUpdater\nimport com.alexstyl.specialdates.events.peopleevents.ShortDateLabelCreator\nimport com.alexstyl.specialdates.images.ImageDecoder\nimport com.alexstyl.specialdates.images.ImageLoader\nimport dagger.Module\nimport dagger.Provides\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.schedulers.Schedulers\n\n@Module\nclass AddEventModule {\n\n    @Provides\n    fun presenter(analytics: Analytics,\n                  contactOperations: ContactOperations,\n                  messageDisplayer: MessageDisplayer,\n                  operationsExecutorAndroid: ContactOperationsExecutor,\n                  strings: Strings,\n                  peopleEventsProvider: PeopleEventsProvider,\n                  peopleUpdater: PeopleEventsUpdater,\n                  factory: AddEventViewModelFactory) = AddEventsPresenter(\n            analytics,\n            contactOperations,\n            messageDisplayer,\n            operationsExecutorAndroid,\n            strings,\n            peopleEventsProvider,\n            factory,\n            peopleUpdater,\n            Schedulers.io(),\n            AndroidSchedulers.mainThread()\n    )\n\n    @Provides\n    fun factory(dateLabelCreator: DateLabelCreator, strings: Strings) = AddEventViewModelFactory(\n            dateLabelCreator, strings, AndroidEventIcons)\n\n    @Provides\n    fun messageDisplayer(context: Context): MessageDisplayer = ToastDisplayer(context)\n\n\n    @Provides\n    fun accountsProvider(context: Context) = WriteableAccountsProvider.from(context)\n\n\n    @Provides\n    fun operations() = ContactOperations()\n\n    @Provides\n    fun operationsExectutor(contentResolver: ContentResolver,\n                            tracker: CrashAndErrorTracker,\n                            peopleEventsProvider: PeopleEventsProvider,\n                            accountsProvider: WriteableAccountsProvider,\n                            imageDecoder: ImageDecoder): ContactOperationsExecutor {\n        return AndroidContactOperationsExecutor(contentResolver,\n                tracker,\n                ShortDateLabelCreator(),\n                peopleEventsProvider,\n                accountsProvider,\n                imageDecoder)\n    }\n\n\n    @Provides\n    fun filePathProvider(context: Context) = UriFilePathProvider(context)\n\n    @Provides\n    fun imageDecoder(imageLoader: ImageLoader): ImageDecoder {\n        return ImageDecoder(imageLoader)\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/AndroidAddEventView.kt",
    "content": "package com.alexstyl.specialdates.addevent\n\nimport android.graphics.Bitmap\nimport android.view.View\nimport com.alexstyl.specialdates.Optional\nimport com.alexstyl.specialdates.addevent.ui.AvatarPickerView\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.images.ImageLoadedConsumer\nimport com.alexstyl.specialdates.images.ImageLoader\nimport com.novoda.notils.meta.AndroidUtils\nimport java.net.URI\n\nclass AndroidAddEventView(private val avatarView: AvatarPickerView,\n                          private val eventsAdapter: ContactEventsAdapter,\n                          private val imageLoader: ImageLoader,\n                          private val toolbarAnimator: ToolbarBackgroundAnimator,\n                          private val saveButton: View) : AddEventView {\n\n    override fun allowImagePick() {\n        avatarView.isEnabled = true\n    }\n\n    override fun preventImagePick() {\n        avatarView.isEnabled = false\n    }\n\n    override fun allowSave() {\n        saveButton.isEnabled = true\n    }\n\n    override fun preventSave() {\n        saveButton.isEnabled = false\n    }\n\n    private var currentImageLoaded = Optional.absent<Bitmap>()\n\n    override fun displayContact(contact: Contact) {\n        display(contact.imagePath)\n        AndroidUtils.requestHideKeyboard(avatarView.context, avatarView)\n    }\n\n    override fun display(viewModels: List<AddEventContactEventViewModel>) {\n        eventsAdapter.display(viewModels)\n    }\n\n    override fun display(uri: URI) {\n        imageLoader\n                .load(uri)\n                .withSize(avatarView.width, avatarView.height)\n                .into(object : ImageLoadedConsumer {\n                    override fun onImageLoaded(loadedImage: Bitmap?) {\n                        avatarView.setImageBitmap(loadedImage)\n                        toolbarAnimator.fadeOut()\n                    }\n\n                    override fun onLoadingFailed() {\n                        clearAvatar()\n                    }\n                })\n    }\n\n    override fun clearAvatar() {\n        avatarView.setImageBitmap(null)\n        currentImageLoaded = Optional.absent()\n        toolbarAnimator.fadeIn()\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/AndroidContactOperationsExecutor.kt",
    "content": "package com.alexstyl.specialdates.addevent\n\nimport android.content.ContentProviderOperation\nimport android.content.ContentResolver\nimport android.content.OperationApplicationException\nimport android.database.Cursor\nimport android.os.RemoteException\nimport android.provider.ContactsContract\nimport com.alexstyl.specialdates.CrashAndErrorTracker\nimport com.alexstyl.specialdates.addevent.operations.ContactOperation\nimport com.alexstyl.specialdates.addevent.operations.InsertContact\nimport com.alexstyl.specialdates.addevent.operations.UpdateContact\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsProvider\nimport com.alexstyl.specialdates.events.peopleevents.ShortDateLabelCreator\nimport com.alexstyl.specialdates.images.ImageDecoder\nimport com.novoda.notils.exception.DeveloperError\nimport java.util.ArrayList\n\nclass AndroidContactOperationsExecutor(\n        private val contentResolver: ContentResolver,\n        private val tracker: CrashAndErrorTracker,\n        private val displayStringCreator: ShortDateLabelCreator,\n        private val peopleEventsProvider: PeopleEventsProvider,\n        private val accountsProvider: WriteableAccountsProvider,\n        private val imageDecoder: ImageDecoder)\n    : ContactOperationsExecutor {\n\n    override fun execute(operations: List<ContactOperation>): Boolean {\n        val operationsFactory = makeFactoryFor(operations[0])\n\n        try {\n            val contentProviderOperations = ArrayList(operations.fold(emptyList<ContentProviderOperation>(), { list, contactOperation ->\n                list + operationsFactory.createOperationsFor(contactOperation)\n            }))\n            contentResolver.applyBatch(ContactsContract.AUTHORITY, contentProviderOperations)\n            return true\n        } catch (e: RemoteException) {\n            tracker.track(e)\n        } catch (e: OperationApplicationException) {\n            tracker.track(e)\n        }\n        return false\n    }\n\n    private fun makeFactoryFor(contactOperation: ContactOperation): OperationsFactory {\n        if (contactOperation is InsertContact) {\n            return OperationsFactory.forNewContact(displayStringCreator, peopleEventsProvider, accountsProvider, imageDecoder)\n        } else if (contactOperation is UpdateContact) {\n            val rawContactID = rawContactID(contactOperation.contact)\n            return OperationsFactory(rawContactID, displayStringCreator, peopleEventsProvider, accountsProvider, imageDecoder)\n        }\n        throw IllegalArgumentException(\"Cannot make factory for $contactOperation\")\n    }\n\n\n    private fun rawContactID(contact: Contact): Int {\n        val projection = arrayOf(ContactsContract.CommonDataKinds.Event.RAW_CONTACT_ID)\n        val selection = ContactsContract.CommonDataKinds.Event.CONTACT_ID + \" = ?\"\n        val selectionArgs = arrayOf(contact.contactID.toString())\n        val cursor = contentResolver.query(ContactsContract.Data.CONTENT_URI, projection, selection, selectionArgs, null)\n\n        throwIfInvalid(cursor)\n\n        try {\n            if (cursor!!.moveToFirst()) {\n                return cursor.getInt(0)\n            }\n        } finally {\n            cursor!!.close()\n        }\n        return 0\n    }\n\n    private fun throwIfInvalid(cursor: Cursor?) {\n        if (cursor == null || cursor.isClosed) {\n            throw DeveloperError(\"Cursor was invalid\")\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/AndroidEventIcons.kt",
    "content": "package com.alexstyl.specialdates.addevent\n\nimport com.alexstyl.specialdates.R\nimport com.alexstyl.specialdates.events.database.EventTypeId\nimport com.alexstyl.specialdates.events.peopleevents.EventType\n\nobject AndroidEventIcons : EventIcons {\n    override fun iconOf(eventType: EventType): Int = when (eventType.id) {\n        EventTypeId.TYPE_BIRTHDAY -> R.drawable.ic_cake\n        EventTypeId.TYPE_NAMEDAY -> R.drawable.ic_face\n        EventTypeId.TYPE_ANNIVERSARY -> R.drawable.ic_anniversary\n        EventTypeId.TYPE_OTHER -> R.drawable.ic_other\n        EventTypeId.TYPE_CUSTOM -> R.drawable.ic_custom\n        else -> {\n            throw IllegalStateException(\"No icon for type $eventType\")\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/ContactDetailsListener.java",
    "content": "package com.alexstyl.specialdates.addevent;\n\nimport com.alexstyl.specialdates.contact.Contact;\nimport com.alexstyl.specialdates.events.peopleevents.EventType;\n\ninterface ContactDetailsListener {\n    void onAddEventClicked(AddEventContactEventViewModel viewModel);\n    void onRemoveEventClicked(EventType eventType);\n    void onContactSelected(Contact contact);\n    void onNameModified(String newName);\n    void onContactCleared();\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/ContactEventViewHolder.java",
    "content": "package com.alexstyl.specialdates.addevent;\n\nimport android.support.v7.widget.RecyclerView;\nimport android.view.View;\nimport android.widget.ImageButton;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nfinal class ContactEventViewHolder extends RecyclerView.ViewHolder {\n    private final ImageView icon;\n    private final TextView datePicker;\n    private final ImageButton removeEvent;\n\n    ContactEventViewHolder(View view, ImageView icon, TextView datePicker, ImageButton removeEvent) {\n        super(view);\n        this.icon = icon;\n        this.datePicker = datePicker;\n        this.removeEvent = removeEvent;\n    }\n\n    public void bind(final AddEventContactEventViewModel viewModel, final ContactDetailsListener contactDetailsListener) {\n        icon.setImageResource(viewModel.getEventIconRes());\n        datePicker.setHint(viewModel.getHintText());\n        datePicker.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                contactDetailsListener.onAddEventClicked(viewModel);\n            }\n        });\n        boolean clearVisibility = viewModel.getClearVisibility();\n        removeEvent.setVisibility(clearVisibility ? View.VISIBLE : View.GONE);\n        removeEvent.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                contactDetailsListener.onRemoveEventClicked(viewModel.getEventType());\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/ContactEventsAdapter.java",
    "content": "package com.alexstyl.specialdates.addevent;\n\nimport android.support.v7.widget.RecyclerView;\nimport android.support.v7.widget.RecyclerView.ViewHolder;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageButton;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.addevent.ui.ContactSuggestionView;\nimport com.novoda.notils.caster.Views;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic final class ContactEventsAdapter extends RecyclerView.Adapter<ViewHolder> {\n\n    private static final int HEADER_COUNT = 1;\n    private static final int TYPE_CONTACT_SUGGESTION = 0;\n    private static final int TYPE_EVENT = 1;\n\n    private final List<AddEventContactEventViewModel> viewModels = new ArrayList<>();\n    private final ContactDetailsListener contactDetailsListener;\n\n    ContactEventsAdapter(ContactDetailsListener contactDetailsListener) {\n        this.contactDetailsListener = contactDetailsListener;\n    }\n\n    @Override\n    public int getItemViewType(int position) {\n        return position == 0 ? TYPE_CONTACT_SUGGESTION : TYPE_EVENT;\n    }\n\n    @Override\n    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        if (viewType == TYPE_CONTACT_SUGGESTION) {\n            LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());\n            View view = layoutInflater.inflate(R.layout.row_add_event_contact_suggestion, parent, false);\n            ContactSuggestionView suggestionView = Views.findById(view, R.id.add_event_contact_autocomplete);\n            return new ContactSuggestionViewHolder(suggestionView);\n        } else if (viewType == TYPE_EVENT) {\n            LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());\n            View view = layoutInflater.inflate(R.layout.row_add_event_contact_event, parent, false);\n            ImageView icon = Views.findById(view, R.id.add_event_event_icon);\n            TextView datePicker = Views.findById(view, R.id.add_event_date_picker);\n            ImageButton clear = Views.findById(view, R.id.add_event_remove_event);\n            return new ContactEventViewHolder(view, icon, datePicker, clear);\n        } else {\n            throw new IllegalStateException(\"Received viewType \" + viewType);\n        }\n    }\n\n    @Override\n    public void onBindViewHolder(ViewHolder holder, int position) {\n        int viewType = getItemViewType(position);\n        if (viewType == TYPE_CONTACT_SUGGESTION) {\n            ((ContactSuggestionViewHolder) holder).bind(contactDetailsListener);\n        } else if (viewType == TYPE_EVENT) {\n            AddEventContactEventViewModel addEventContactEventViewModel = viewModels.get(position - HEADER_COUNT);\n            ((ContactEventViewHolder) holder).bind(addEventContactEventViewModel, contactDetailsListener);\n        } else {\n            throw new IllegalStateException(\"Unable to bind view type \" + viewType);\n        }\n    }\n\n    @Override\n    public int getItemCount() {\n        return viewModels.size() + HEADER_COUNT;\n    }\n\n    void display(List<AddEventContactEventViewModel> viewModels) {\n        this.viewModels.clear();\n        this.viewModels.addAll(viewModels);\n        notifyItemRangeChanged(1, getItemCount() - 1);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/ContactSuggestionViewHolder.java",
    "content": "package com.alexstyl.specialdates.addevent;\n\nimport android.support.v7.widget.RecyclerView;\nimport android.text.Editable;\n\nimport com.alexstyl.specialdates.addevent.ui.ContactSuggestionView;\nimport com.alexstyl.specialdates.contact.Contact;\nimport com.novoda.notils.text.SimpleTextWatcher;\n\nfinal class ContactSuggestionViewHolder extends RecyclerView.ViewHolder {\n\n    private ContactSuggestionView contactSuggestionView;\n\n    ContactSuggestionViewHolder(ContactSuggestionView contactSuggestionView) {\n        super(contactSuggestionView);\n        this.contactSuggestionView = contactSuggestionView;\n    }\n\n    public void bind(final ContactDetailsListener listener) {\n        contactSuggestionView.setOnContactSelectedListener(new ContactSuggestionView.OnContactSelectedListener() {\n            @Override\n            public void onContactSelected(Contact contact) {\n                listener.onContactSelected(contact);\n            }\n\n            @Override\n            public void onContactCleared() {\n                listener.onContactCleared();\n            }\n        });\n        contactSuggestionView.addTextChangedListener(new SimpleTextWatcher() {\n            @Override\n            public void afterTextChanged(Editable text) {\n                listener.onNameModified(text.toString());\n            }\n        });\n\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/DiscardPromptDialog.java",
    "content": "package com.alexstyl.specialdates.addevent;\n\nimport android.app.Activity;\nimport android.app.Dialog;\nimport android.content.DialogInterface;\nimport android.os.Bundle;\nimport android.support.annotation.NonNull;\nimport android.support.v7.app.AlertDialog;\n\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.ui.base.MementoDialog;\nimport com.novoda.notils.caster.Classes;\n\npublic class DiscardPromptDialog extends MementoDialog {\n\n    interface Listener {\n        void onDiscardChangesSelected();\n    }\n\n    private Listener listener;\n\n    @Override\n    public void onAttach(Activity activity) {\n        super.onAttach(activity);\n        listener = Classes.from(activity);\n    }\n\n    @NonNull\n    @Override\n    public Dialog onCreateDialog(Bundle savedInstanceState) {\n        return new AlertDialog.Builder(getActivity())\n                .setTitle(R.string.add_event_discard_changes_title)\n                .setPositiveButton(R.string.add_event_discard_changes_accept, new DialogInterface.OnClickListener() {\n                    @Override\n                    public void onClick(DialogInterface dialog, int which) {\n                        listener.onDiscardChangesSelected();\n                    }\n                })\n                .setNegativeButton(android.R.string.no, null)\n                .create();\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/EventDatePickerDialogFragment.java",
    "content": "package com.alexstyl.specialdates.addevent;\n\nimport android.app.Activity;\nimport android.app.Dialog;\nimport android.content.DialogInterface;\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.v7.app.AlertDialog;\nimport android.view.LayoutInflater;\nimport android.view.View;\n\nimport com.alexstyl.specialdates.Strings;\nimport com.alexstyl.specialdates.AppComponent;\nimport com.alexstyl.specialdates.Optional;\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.addevent.ui.EventDatePicker;\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.date.DateParseException;\nimport com.alexstyl.specialdates.events.database.EventTypeId;\nimport com.alexstyl.specialdates.events.peopleevents.EventType;\nimport com.alexstyl.specialdates.events.peopleevents.ShortDateLabelCreator;\nimport com.alexstyl.specialdates.events.peopleevents.StandardEventType;\nimport com.alexstyl.specialdates.ui.base.MementoDialog;\nimport com.alexstyl.specialdates.date.DateParser;\nimport com.novoda.notils.caster.Classes;\nimport com.novoda.notils.caster.Views;\n\nimport javax.inject.Inject;\n\npublic class EventDatePickerDialogFragment extends MementoDialog {\n\n    private static final String KEY_DATE = \"key:date\";\n    private static final String ARG_EVENT_TYPE_ID = \"arg:event_type_id\";\n\n    private OnEventDatePickedListener listener;\n    private EventDatePicker datePicker;\n\n    private Optional<Date> initialDate;\n    @Inject Strings strings;\n    @Inject DateParser dateParser;\n\n    public static EventDatePickerDialogFragment newInstance(EventType eventType, Optional<Date> date, ShortDateLabelCreator shortDateLabelCreator) {\n        EventDatePickerDialogFragment dialogFragment = new EventDatePickerDialogFragment();\n        Bundle args = new Bundle(2);\n        args.putInt(ARG_EVENT_TYPE_ID, eventType.getId());\n        if (date.isPresent()) {\n            String label = shortDateLabelCreator.createLabelWithYearPreferredFor(date.get());\n            args.putString(KEY_DATE, label);\n        }\n        dialogFragment.setArguments(args);\n        return dialogFragment;\n    }\n\n    @Override\n    public void onAttach(Activity activity) {\n        super.onAttach(activity);\n        this.listener = Classes.from(activity);\n    }\n\n    @Override\n    public void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        AppComponent applicationModule = getApplication().getApplicationModule();\n        applicationModule.inject(this);\n        initialDate = getDate();\n    }\n\n    private Optional<Date> getDate() {\n        Bundle arguments = getArguments();\n        if (arguments.containsKey(KEY_DATE)) {\n            String birthday = arguments.getString(KEY_DATE);\n            return parseFrom(birthday);\n        } else {\n            return Optional.Companion.absent();\n        }\n    }\n\n    private Optional<Date> parseFrom(String birthday) {\n        try {\n            Date parsedDate = dateParser.parse(birthday);\n            return new Optional<>(parsedDate);\n        } catch (DateParseException e) {\n            e.printStackTrace();\n            return Optional.Companion.absent();\n        }\n    }\n\n    @Override\n    public Dialog onCreateDialog(Bundle savedInstanceState) {\n        View view = LayoutInflater.from(getThemedContext()).inflate(R.layout.dialog_birthday_picker, null, false);\n        datePicker = Views.findById(view, R.id.dialog_birthday_picker);\n        final EventType eventType = getEventType();\n\n        if (initialDate.isPresent()) {\n            datePicker.setDisplayingDate(initialDate.get());\n        }\n\n        return new AlertDialog.Builder(getActivity())\n                .setTitle(eventType.getEventName(strings))\n                .setView(view)\n                .setPositiveButton(R.string.birthday_picker_dialog_positive, new DialogInterface.OnClickListener() {\n                    @Override\n                    public void onClick(DialogInterface dialog, int which) {\n                        Date date = datePicker.getDisplayingDate();\n                        listener.onDatePicked(eventType, date);\n                    }\n                })\n                .create();\n    }\n\n    public EventType getEventType() {\n        @EventTypeId int eventTypeId = getArguments().getInt(ARG_EVENT_TYPE_ID);\n        return StandardEventType.fromId(eventTypeId);\n    }\n\n    public interface OnEventDatePickedListener {\n        void onDatePicked(EventType eventType, Date date);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/ImageIntentFactory.java",
    "content": "package com.alexstyl.specialdates.addevent;\n\nimport android.content.Intent;\nimport android.net.Uri;\nimport android.provider.MediaStore;\n\npublic final class ImageIntentFactory {\n\n    static final String ACTION_IMAGE_PICK = Intent.ACTION_PICK;\n    static final String ACTION_IMAGE_CAPTURE = MediaStore.ACTION_IMAGE_CAPTURE;\n\n    public Intent pickExistingImage() {\n        Intent intent = new Intent(ACTION_IMAGE_PICK);\n        intent.setType(\"image/*\");\n        intent.addFlags(\n                Intent.FLAG_GRANT_WRITE_URI_PERMISSION\n                        | Intent.FLAG_GRANT_READ_URI_PERMISSION\n        );\n        return intent;\n    }\n\n    public Intent captureNewPhoto(Uri outputUri) {\n        Intent takePictureIntent = new Intent(ACTION_IMAGE_CAPTURE);\n        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);\n        return takePictureIntent;\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/OnCameraClickedListener.java",
    "content": "package com.alexstyl.specialdates.addevent;\n\ninterface OnCameraClickedListener {\n    void onPictureRetakenRequested();\n    void onNewPictureTakenRequested();\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/OperationsFactory.kt",
    "content": "package com.alexstyl.specialdates.addevent\n\nimport android.content.ContentProviderOperation\nimport android.provider.ContactsContract\nimport android.provider.ContactsContract.CommonDataKinds.Event\nimport android.provider.ContactsContract.CommonDataKinds.Photo\nimport android.provider.ContactsContract.CommonDataKinds.StructuredName\nimport android.provider.ContactsContract.Data\nimport com.alexstyl.specialdates.addevent.operations.ContactOperation\nimport com.alexstyl.specialdates.addevent.operations.InsertContact\nimport com.alexstyl.specialdates.addevent.operations.InsertEvent\nimport com.alexstyl.specialdates.addevent.operations.InsertImage\nimport com.alexstyl.specialdates.addevent.operations.UpdateContact\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.date.ContactEvent\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.TimePeriod\nimport com.alexstyl.specialdates.events.database.EventTypeId\nimport com.alexstyl.specialdates.events.peopleevents.EventType\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsProvider\nimport com.alexstyl.specialdates.events.peopleevents.ShortDateLabelCreator\nimport com.alexstyl.specialdates.events.peopleevents.StandardEventType\nimport com.alexstyl.specialdates.images.ImageDecoder\nimport java.net.URI\n\nclass OperationsFactory(private val rawContactID: Int,\n                        private val displayStringCreator: ShortDateLabelCreator,\n                        private val peopleEventsProvider: PeopleEventsProvider,\n                        private val accountsProvider: WriteableAccountsProvider,\n                        private val imageDecoder: ImageDecoder) {\n\n    fun createOperationsFor(contactOperation: ContactOperation): List<ContentProviderOperation> {\n        when (contactOperation) {\n            is InsertContact -> return createContactIn(accountToStoreContact, contactOperation.contactName)\n            is UpdateContact -> return updateExistingContact(contactOperation.contact)\n            is InsertEvent -> return newInsertFor(contactOperation.eventType, contactOperation.date)\n            is InsertImage -> return insertImageFor(contactOperation.imageUri)\n        }\n        throw IllegalArgumentException(\"Unable to create operation for $contactOperation\")\n    }\n\n    private fun insertImageFor(imageUri: URI): List<ContentProviderOperation> {\n        val decodeFrom = imageDecoder.decodeFrom(imageUri)\n        if (decodeFrom != null) {\n            val builder = ContentProviderOperation.newInsert(Data.CONTENT_URI)\n                    .withValue(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE)\n                    .withValue(Photo.PHOTO, decodeFrom.bytes)\n            addRawContactID(builder)\n            return listOf(builder.build())\n        } else {\n            return emptyList()\n        }\n    }\n\n\n    private fun newInsertFor(eventType: EventType, date: Date): List<ContentProviderOperation> {\n        val builder = ContentProviderOperation\n                .newInsert(Data.CONTENT_URI)\n                .withValue(Data.MIMETYPE, Event.CONTENT_ITEM_TYPE)\n                .withValue(Event.TYPE, androidIdOf(eventType))\n                .withValue(Event.START_DATE, displayStringCreator.createLabelWithYearPreferredFor(date))\n        addRawContactID(builder)\n        return listOf(builder.build())\n    }\n\n    private fun androidIdOf(eventType: EventType): Int = when (eventType.id) {\n        EventTypeId.TYPE_BIRTHDAY -> Event.TYPE_BIRTHDAY\n        EventTypeId.TYPE_ANNIVERSARY -> Event.TYPE_ANNIVERSARY\n        EventTypeId.TYPE_CUSTOM -> Event.TYPE_CUSTOM\n        EventTypeId.TYPE_OTHER -> Event.TYPE_OTHER\n        else -> {\n            throw IllegalStateException(\"There is no Android type of $eventType\")\n        }\n    }\n\n    private fun addRawContactID(builder: ContentProviderOperation.Builder) {\n        if (rawContactID == NO_RAW_CONTACT_ID) {\n            builder.withValueBackReference(Data.RAW_CONTACT_ID, rawContactID)\n        } else {\n            builder.withValue(Data.RAW_CONTACT_ID, rawContactID)\n\n        }\n    }\n\n    private fun deleteEvents(contactEvents: List<ContactEvent>): ArrayList<ContentProviderOperation> {\n        val ops = ArrayList<ContentProviderOperation>()\n        for (contactEvent in contactEvents) {\n            val eventId = contactEvent.deviceEventId.get()\n            ops.add(\n                    ContentProviderOperation\n                            .newDelete(Data.CONTENT_URI)\n                            .withSelection(Event._ID + \"= \" + eventId, null)\n                            .build())\n        }\n        return ops\n    }\n\n    private fun createContactIn(account: AccountData, contactName: String): ArrayList<ContentProviderOperation> {\n        val ops = ArrayList<ContentProviderOperation>(2)\n        ops.add(\n                ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)\n                        .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, account.accountName)\n                        .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, account.accountType)\n                        .build())\n        ops.add(\n                ContentProviderOperation.newInsert(Data.CONTENT_URI)\n                        .withValueBackReference(Data.RAW_CONTACT_ID, rawContactID)\n                        .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)\n                        .withValue(StructuredName.DISPLAY_NAME, contactName)\n                        .build())\n\n        return ops\n    }\n\n\n    private val accountToStoreContact: AccountData\n        get() {\n            val availableAccounts = accountsProvider.availableAccounts\n            return if (availableAccounts.size == 0) {\n                AccountData.NO_ACCOUNT\n            } else {\n                availableAccounts[0]\n            }\n        }\n\n    private fun updateExistingContact(contact: Contact): List<ContentProviderOperation> {\n        val contactEvents = getAllDeviceEventsFor(contact)\n        return deleteEvents(contactEvents)\n    }\n\n    private fun getAllDeviceEventsFor(contact: Contact): List<ContactEvent> {\n        val contactEvents = ArrayList<ContactEvent>()\n        val contactEventsOnDate = peopleEventsProvider.fetchEventsBetween(TimePeriod.aYearFromNow())\n        for (contactEvent in contactEventsOnDate) {\n            val (contactID) = contactEvent.contact\n            if (contactID == contact.contactID && contactEvent.type !== StandardEventType.NAMEDAY) {\n                contactEvents.add(contactEvent)\n            }\n        }\n        return contactEvents\n    }\n\n    companion object {\n\n        private const val NO_RAW_CONTACT_ID = 0\n\n        fun forNewContact(displayStringCreator: ShortDateLabelCreator,\n                          peopleEventsProvider: PeopleEventsProvider,\n                          accountsProvider: WriteableAccountsProvider,\n                          imageDecoder: ImageDecoder): OperationsFactory {\n            return OperationsFactory(NO_RAW_CONTACT_ID, displayStringCreator, peopleEventsProvider, accountsProvider,\n                    imageDecoder)\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/ToastDisplayer.kt",
    "content": "package com.alexstyl.specialdates.addevent\n\nimport android.content.Context\nimport android.widget.Toast\n\nclass ToastDisplayer(private val context: Context) : MessageDisplayer {\n\n    override fun showMessage(string: String) {\n        Toast.makeText(context, string, Toast.LENGTH_SHORT).show()\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/ToolbarBackgroundAnimator.java",
    "content": "package com.alexstyl.specialdates.addevent;\n\npublic interface ToolbarBackgroundAnimator {\n    void fadeOut();\n\n    void fadeIn();\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/ToolbarBackgroundFadingAnimator.java",
    "content": "package com.alexstyl.specialdates.addevent;\n\nimport android.graphics.drawable.ColorDrawable;\nimport android.graphics.drawable.Drawable;\nimport android.graphics.drawable.TransitionDrawable;\nimport android.support.v7.widget.Toolbar;\n\nfinal class ToolbarBackgroundFadingAnimator implements ToolbarBackgroundAnimator {\n\n    private static final int FADING_DURATION = 400;\n    private TransitionDrawable transitionDrawable;\n    private boolean visible = true;\n\n    static ToolbarBackgroundFadingAnimator setupOn(Toolbar toolbar) {\n        ColorDrawable colorDrawable = new ColorDrawable(toolbar.getResources().getColor(android.R.color.transparent));\n        TransitionDrawable transitionDrawable = new TransitionDrawable(layersFrom(toolbar.getBackground(), colorDrawable));\n        transitionDrawable.setCrossFadeEnabled(true);\n        toolbar.setBackground(transitionDrawable);\n        return new ToolbarBackgroundFadingAnimator(transitionDrawable);\n    }\n\n    private ToolbarBackgroundFadingAnimator(TransitionDrawable transitionDrawable) {\n        this.transitionDrawable = transitionDrawable;\n    }\n\n    @Override\n    public void fadeOut() {\n        if (visible) {\n            transitionDrawable.startTransition(FADING_DURATION);\n            visible = false;\n        }\n    }\n\n    private static Drawable[] layersFrom(Drawable from, Drawable to) {\n        Drawable[] layers = new Drawable[2];\n        layers[0] = from;\n        layers[1] = to;\n        return layers;\n    }\n\n    @Override\n    public void fadeIn() {\n        if (!visible) {\n            transitionDrawable.reverseTransition(FADING_DURATION);\n            visible = true;\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/ToolbarBackgroundStubAnimator.java",
    "content": "package com.alexstyl.specialdates.addevent;\n\nfinal class ToolbarBackgroundStubAnimator implements ToolbarBackgroundAnimator {\n\n    @Override\n    public void fadeOut() {\n        // does nothing\n    }\n\n    @Override\n    public void fadeIn() {\n        // does nothing\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/UriFilePathProvider.kt",
    "content": "package com.alexstyl.specialdates.addevent\n\nimport android.content.Context\nimport android.net.Uri\nimport android.os.Environment\nimport android.support.v4.content.FileProvider\nimport com.alexstyl.specialdates.BuildConfig\n\nimport java.io.File\nimport java.io.IOException\nimport java.text.SimpleDateFormat\nimport java.util.Date\n\nclass UriFilePathProvider(private val context: Context) {\n\n    fun uriFor(file: File): Uri {\n        return FileProvider.getUriForFile(\n                context,\n                BuildConfig.FILE_PROVIDER,\n                file\n        )\n    }\n\n    @Throws(IOException::class)\n    fun createImageFile(): File {\n        val timeStamp = SimpleDateFormat(\"yyyyMMdd_HHmmss\").format(Date())\n        val imageFileName = \"JPEG_\" + timeStamp + \"_\"\n        val storageDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)\n        val image = File.createTempFile(\n                imageFileName,\n                \".jpg\",\n                storageDir\n        )\n        return image\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/WriteableAccountsProvider.java",
    "content": "package com.alexstyl.specialdates.addevent;\n\nimport android.accounts.Account;\nimport android.accounts.AccountManager;\nimport android.accounts.AuthenticatorDescription;\nimport android.content.Context;\nimport android.content.pm.PackageManager;\nimport android.graphics.drawable.Drawable;\n\nimport java.util.ArrayList;\n\npublic final class WriteableAccountsProvider {\n\n    private static final String GOOGLE_ACCOUNT = \"com.google\";\n\n    private final AccountManager accountManager;\n    private final PackageManager packageManager;\n\n    public static WriteableAccountsProvider from(Context context) {\n        AccountManager manager = (AccountManager) context.getSystemService(Context.ACCOUNT_SERVICE);\n        PackageManager packageManager = context.getPackageManager();\n\n        return new WriteableAccountsProvider(manager, packageManager);\n    }\n\n    private WriteableAccountsProvider(AccountManager accountManager, PackageManager packageManager) {\n        this.accountManager = accountManager;\n        this.packageManager = packageManager;\n    }\n\n    ArrayList<AccountData> getAvailableAccounts() {\n        ArrayList<AccountData> accounts = new ArrayList<>();\n\n        AuthenticatorDescription[] accountTypes = accountManager.getAuthenticatorTypes();\n        for (Account account : accountManager.getAccounts()) {\n            String accountType = account.type;\n            if (accountIsWritable(accountType)) {\n                AuthenticatorDescription description = getAuthenticatorDescription(accountType, accountTypes);\n                Drawable icon = packageManager.getDrawable(description.packageName, description.iconId, null);\n                accounts.add(new AccountData(account.name, description.type, icon));\n            }\n        }\n        return accounts;\n    }\n\n    private static boolean accountIsWritable(String accountType) {\n        return GOOGLE_ACCOUNT.equals(accountType);\n    }\n\n    private static AuthenticatorDescription getAuthenticatorDescription(String type,\n                                                                        AuthenticatorDescription[] dictionary) {\n        for (int i = 0; i < dictionary.length; i++) {\n            if (dictionary[i].type.equals(type)) {\n                return dictionary[i];\n            }\n        }\n        throw new RuntimeException(\"Unable to find matching authenticator\");\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/bottomsheet/BottomSheetPicturesDialog.kt",
    "content": "package com.alexstyl.specialdates.addevent.bottomsheet\n\nimport android.app.Activity\nimport android.app.Dialog\nimport android.content.Intent\nimport android.os.Bundle\nimport android.support.design.widget.BottomSheetDialog\nimport android.support.v7.widget.GridLayoutManager\nimport android.support.v7.widget.RecyclerView\nimport android.view.LayoutInflater\nimport com.alexstyl.specialdates.R\nimport com.alexstyl.specialdates.addevent.ImageIntentFactory\nimport com.alexstyl.specialdates.addevent.UriFilePathProvider\nimport com.alexstyl.specialdates.ui.base.MementoDialog\nimport com.alexstyl.specialdates.ui.widget.SpacesItemDecoration\nimport com.novoda.notils.caster.Classes\nimport com.novoda.notils.caster.Views\nimport io.reactivex.Observable\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.disposables.Disposable\nimport io.reactivex.schedulers.Schedulers\nimport java.net.URI\n\nclass BottomSheetPicturesDialog : MementoDialog() {\n\n    private var parentListener: Listener? = null\n\n    private lateinit var adapter: ImagePickerOptionsAdapter\n    private lateinit var photoPickerViewModelFactory: PhotoPickerViewModelFactory\n    private var disposable: Disposable? = null\n\n    private val includeClear: Boolean\n        get() = arguments != null && arguments!!.getBoolean(KEY_INCLUDE_CLEAR, false)\n\n    private val internalListener = object : Listener {\n        override fun onImagePickerOptionSelected(viewModel: PhotoPickerViewModel) {\n            dismiss()\n            parentListener?.onImagePickerOptionSelected(viewModel)\n        }\n\n        override fun onClearAvatarSelected() {\n            dismiss()\n            parentListener?.onClearAvatarSelected()\n        }\n    }\n\n    override fun onAttach(activity: Activity) {\n        super.onAttach(activity)\n        parentListener = Classes.from<Listener>(activity)\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        photoPickerViewModelFactory = PhotoPickerViewModelFactory(\n                UriFilePathProvider(activity!!),\n                IntentResolver(activity!!.packageManager),\n                ImageIntentFactory(),\n                activity!!.packageManager\n        )\n    }\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val dialog = BottomSheetDialog(activity!!)\n        val layoutInflater = LayoutInflater.from(activity!!)\n        val view = layoutInflater.inflate(R.layout.dialog_pick_image, null, false)\n\n        val grid = Views.findById<RecyclerView>(view, R.id.pick_image_grid)\n        val resources = resources\n        val gridLayoutManager = GridLayoutManager(activity!!, resources.getInteger(R.integer.bottom_sheet_span_count))\n        grid.addItemDecoration(SpacesItemDecoration(\n                resources.getDimensionPixelSize(R.dimen.add_event_image_option_vertical),\n                gridLayoutManager.spanCount\n        ))\n        grid.layoutManager = gridLayoutManager\n        adapter = if (includeClear)\n            ImagePickerOptionsAdapter.createWithClear(internalListener)\n        else\n            ImagePickerOptionsAdapter.newInstance(internalListener)\n        grid.adapter = adapter\n        dialog.setContentView(view)\n        return dialog\n    }\n\n    override fun onActivityCreated(savedInstanceState: Bundle?) {\n        super.onActivityCreated(savedInstanceState)\n\n\n        disposable = Observable.fromCallable {\n            photoPickerViewModelFactory.createViewModels()\n        }.doOnError {\n            it.printStackTrace()\n        }\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe { viewModels -> adapter.updateWith(viewModels) }\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        disposable?.dispose()\n    }\n\n    interface Listener {\n        /**\n         * Called when the user selects the option to select an picture as an avatar, via the [BottomSheetPicturesDialog]\n         *\n         */\n        fun onImagePickerOptionSelected(viewModel: PhotoPickerViewModel)\n\n        /**\n         * Called when the user selects the option to clear the existing avatar, via the [BottomSheetPicturesDialog]\n         */\n        fun onClearAvatarSelected()\n    }\n\n    companion object {\n\n        private const val KEY_INCLUDE_CLEAR = \"key_include_clear\"\n\n        fun newInstance(): BottomSheetPicturesDialog {\n            return BottomSheetPicturesDialog()\n        }\n\n        fun includeClearImageOption(): BottomSheetPicturesDialog {\n            val args = Bundle(1)\n            args.putBoolean(KEY_INCLUDE_CLEAR, true)\n            val fragment = BottomSheetPicturesDialog()\n            fragment.arguments = args\n            return fragment\n        }\n\n        fun getImagePickResultUri(data: Intent): URI {\n            return URI.create(data.data.toString())\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/bottomsheet/ClearImageViewHolder.java",
    "content": "package com.alexstyl.specialdates.addevent.bottomsheet;\n\nimport android.support.v7.widget.RecyclerView;\nimport android.view.View;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport com.alexstyl.specialdates.R;\n\nfinal class ClearImageViewHolder extends RecyclerView.ViewHolder {\n\n    private final ImageView imageView;\n    private final TextView textView;\n\n    ClearImageViewHolder(View itemView, ImageView imageView, TextView textView) {\n        super(itemView);\n        this.imageView = imageView;\n        this.textView = textView;\n    }\n\n    void bind(final BottomSheetPicturesDialog.Listener listener) {\n        imageView.setImageResource(R.drawable.ic_clear);\n        textView.setText(R.string.add_event_remove_photo);\n        itemView.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                listener.onClearAvatarSelected();\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/bottomsheet/ImagePickerOptionViewHolder.kt",
    "content": "package com.alexstyl.specialdates.addevent.bottomsheet\n\nimport android.support.v7.widget.RecyclerView\nimport android.view.View\nimport android.widget.ImageView\nimport android.widget.TextView\n\nimport com.alexstyl.specialdates.addevent.bottomsheet.BottomSheetPicturesDialog.Listener\n\nclass ImagePickerOptionViewHolder(view: View,\n                                  private val iconView: ImageView,\n                                  private val labelView: TextView\n) : RecyclerView.ViewHolder(view) {\n\n    fun bind(viewModel: PhotoPickerViewModel, listener: Listener) {\n        iconView.setImageDrawable(viewModel.activityIcon)\n        labelView.text = viewModel.label\n        itemView.setOnClickListener { listener.onImagePickerOptionSelected(viewModel) }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/bottomsheet/ImagePickerOptionsAdapter.java",
    "content": "package com.alexstyl.specialdates.addevent.bottomsheet;\n\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.addevent.bottomsheet.BottomSheetPicturesDialog.Listener;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nfinal class ImagePickerOptionsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {\n\n    private static final int TYPE_CLEAR = 0;\n    private static final int TYPE_OPTION = 1;\n\n    private final List<PhotoPickerViewModel> viewModels;\n    private final Listener listener;\n    private boolean includeClear;\n    private final int includeClearCount;\n\n    public static ImagePickerOptionsAdapter newInstance(Listener listener) {\n        return new ImagePickerOptionsAdapter(listener, false);\n    }\n\n    static ImagePickerOptionsAdapter createWithClear(Listener listener) {\n        return new ImagePickerOptionsAdapter(listener, true);\n    }\n\n    private ImagePickerOptionsAdapter(Listener listener, boolean includeClear) {\n        this.includeClear = includeClear;\n        this.viewModels = new ArrayList<>();\n        this.listener = listener;\n        this.includeClearCount = includeClear ? 1 : 0;\n    }\n\n    @Override\n    public int getItemViewType(int position) {\n        if (includeClear && position == 0) {\n            return TYPE_CLEAR;\n        }\n        return TYPE_OPTION;\n    }\n\n    @Override\n    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_image_option, parent, false);\n        ImageView iconView = view.findViewById(R.id.pick_image_activity_icon);\n        TextView labelView = view.findViewById(R.id.pick_image_activity_label);\n        if (viewType == TYPE_CLEAR) {\n            return new ClearImageViewHolder(view, iconView, labelView);\n        } else if (viewType == TYPE_OPTION) {\n            return new ImagePickerOptionViewHolder(view, iconView, labelView);\n        } else {\n            throw new IllegalStateException(\"Illegal view type \" + viewType);\n        }\n    }\n\n    @Override\n    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {\n        int itemViewType = getItemViewType(position);\n        if (itemViewType == TYPE_CLEAR) {\n            ((ClearImageViewHolder) holder).bind(listener);\n        } else if (itemViewType == TYPE_OPTION) {\n            PhotoPickerViewModel viewModel = viewModels.get(position - includeClearCount);\n            ((ImagePickerOptionViewHolder) holder).bind(viewModel, listener);\n        } else {\n            throw new IllegalStateException(\"Illegal view type \" + itemViewType);\n        }\n    }\n\n    @Override\n    public int getItemCount() {\n        return viewModels.size() + includeClearCount;\n    }\n\n    void updateWith(List<PhotoPickerViewModel> viewModels) {\n        this.viewModels.clear();\n        this.viewModels.addAll(viewModels);\n        notifyDataSetChanged();\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/bottomsheet/IntentResolver.kt",
    "content": "package com.alexstyl.specialdates.addevent.bottomsheet\n\nimport android.content.Intent\nimport android.content.pm.PackageManager\nimport java.net.URI\n\nclass IntentResolver(private val packageManager: PackageManager) {\n\n    internal fun createViewModelsFor(intent: Intent, absolutePath: String): List<PhotoPickerViewModel> {\n        return packageManager.queryIntentActivities(intent, 0)\n                .map { resolveInfo ->\n                    val icon = resolveInfo.loadIcon(packageManager)\n                    val label = resolveInfo.loadLabel(packageManager).toString()\n                    val launchingIntent = Intent(intent)\n                    launchingIntent.setClassName(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name)\n                    PhotoPickerViewModel(icon, label, launchingIntent, URI.create(absolutePath))\n                }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/bottomsheet/PhotoPickerViewModel.kt",
    "content": "package com.alexstyl.specialdates.addevent.bottomsheet\n\nimport android.content.Intent\nimport android.graphics.drawable.Drawable\nimport java.net.URI\n\ndata class PhotoPickerViewModel(\n        val activityIcon: Drawable,\n        val label: String,\n        val intent: Intent,\n        val absolutePath: URI)\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/bottomsheet/PhotoPickerViewModelFactory.kt",
    "content": "package com.alexstyl.specialdates.addevent.bottomsheet\n\nimport android.content.Intent\nimport android.content.pm.PackageManager\nimport android.provider.MediaStore\n\nimport com.alexstyl.specialdates.addevent.ImageIntentFactory\nimport com.alexstyl.specialdates.addevent.UriFilePathProvider\n\nclass PhotoPickerViewModelFactory(private val uriFilePathProvider: UriFilePathProvider,\n                                  private val intentResolver: IntentResolver,\n                                  private val intentCreator: ImageIntentFactory,\n                                  private val packageManager: PackageManager) {\n\n    fun createViewModels(): List<PhotoPickerViewModel> {\n        return capturePhotoViewModels() + pickPhotoViewModels()\n    }\n\n    private fun capturePhotoViewModels(): List<PhotoPickerViewModel> {\n        val file = uriFilePathProvider.createImageFile()\n        val outputUri = uriFilePathProvider.uriFor(file)\n        val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)\n        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri)\n\n        return if (takePictureIntent.resolveActivity(packageManager) != null) {\n            intentResolver.createViewModelsFor(takePictureIntent, file.absolutePath)\n        } else {\n            emptyList()\n        }\n    }\n\n    private fun pickPhotoViewModels(): List<PhotoPickerViewModel> {\n        val pickAnImage = intentCreator.pickExistingImage()\n        return intentResolver.createViewModelsFor(pickAnImage, \"\")\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/ui/AvatarPickerView.java",
    "content": "package com.alexstyl.specialdates.addevent.ui;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.graphics.drawable.Drawable;\nimport android.util.AttributeSet;\nimport android.view.View;\nimport android.widget.ImageView;\nimport android.widget.RelativeLayout;\n\nimport com.alexstyl.specialdates.R;\nimport com.nostra13.universalimageloader.core.assist.ViewScaleType;\nimport com.nostra13.universalimageloader.core.imageaware.ImageAware;\nimport com.novoda.notils.caster.Views;\n\npublic final class AvatarPickerView extends RelativeLayout implements ImageAware {\n\n    private ImageView imageView;\n    private ImageView gradientTopView;\n    private ImageView gradientBottomView;\n    private View icon;\n\n    public AvatarPickerView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    @Override\n    protected void onFinishInflate() {\n        super.onFinishInflate();\n        inflate(getContext(), R.layout.merge_avatar_picker_view, this);\n\n        icon = findViewById(R.id.avatar_picker_icon);\n        imageView = Views.findById(this, R.id.avatar_picker_image);\n        gradientTopView = Views.findById(this, R.id.avatar_picker_gradient__top);\n        gradientBottomView = Views.findById(this, R.id.avatar_picker_gradient__bottom);\n    }\n\n    @Override\n    public ViewScaleType getScaleType() {\n        return ViewScaleType.fromImageView(imageView);\n    }\n\n    @Override\n    public View getWrappedView() {\n        return imageView;\n    }\n\n    @Override\n    public boolean isCollected() {\n        return false;\n    }\n\n    @Override\n    public boolean setImageDrawable(Drawable drawable) {\n        if (drawable == null) {\n            hideGradient();\n        } else {\n            showGradient();\n        }\n        imageView.setImageDrawable(drawable);\n        return true;\n    }\n\n    private void hideGradient() {\n        gradientTopView.setVisibility(GONE);\n        gradientBottomView.setVisibility(GONE);\n    }\n\n    @Override\n    public boolean setImageBitmap(Bitmap imageBitmap) {\n        if (imageBitmap == null) {\n            setImageDrawable(null);\n            hideGradient();\n        } else {\n            imageView.setImageBitmap(imageBitmap);\n            showGradient();\n        }\n        return true;\n    }\n\n    private void showGradient() {\n        gradientTopView.setVisibility(VISIBLE);\n        gradientBottomView.setVisibility(VISIBLE);\n    }\n\n    public boolean isDisplayingAvatar() {\n        return imageView.getDrawable() != null;\n    }\n\n    @Override\n    public void setEnabled(boolean enabled) {\n        if (enabled) {\n            icon.setVisibility(VISIBLE);\n        } else {\n            icon.setVisibility(GONE);\n        }\n        super.setEnabled(enabled);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/ui/ContactSuggestionView.java",
    "content": "package com.alexstyl.specialdates.addevent.ui;\n\nimport android.content.Context;\nimport android.support.transition.TransitionManager;\nimport android.text.TextWatcher;\nimport android.util.AttributeSet;\nimport android.view.View;\nimport android.widget.AdapterView;\nimport android.widget.AutoCompleteTextView;\nimport android.widget.LinearLayout;\n\nimport com.alexstyl.specialdates.AppComponent;\nimport com.alexstyl.specialdates.MementoApplication;\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.addevent.ContactsSearch;\nimport com.alexstyl.specialdates.contact.Contact;\nimport com.alexstyl.specialdates.contact.ContactsProvider;\nimport com.alexstyl.specialdates.images.ImageLoader;\nimport com.alexstyl.specialdates.search.NameMatcher;\nimport com.novoda.notils.caster.Views;\nimport com.novoda.notils.logger.simple.Log;\nimport com.novoda.notils.meta.AndroidUtils;\n\nimport javax.inject.Inject;\n\npublic class ContactSuggestionView extends LinearLayout {\n\n    private OnContactSelectedListener listener = OnContactSelectedListener.NO_CALLBACKS;\n    private AutoCompleteTextView autoCompleteView;\n    @Inject ImageLoader imageLoader;\n    @Inject ContactsProvider contactsProvider;\n\n    public ContactSuggestionView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n\n        if (!isInEditMode()) {\n            AppComponent applicationModule = ((MementoApplication) context.getApplicationContext()).getApplicationModule();\n            applicationModule.inject(this);\n        }\n    }\n\n    @Override\n    protected void onFinishInflate() {\n        super.onFinishInflate();\n        super.setOrientation(HORIZONTAL);\n        inflate(getContext(), R.layout.merge_contact_suggestion_view, this);\n        autoCompleteView = Views.findById(this, R.id.contact_suggestion_autocomplete);\n\n        if (isInEditMode()) {\n            return;\n        }\n\n        final View clearContact = findViewById(R.id.add_event_remove_contact);\n        clearContact.setOnClickListener(new OnClickListener() {\n            @Override\n            public void onClick(View view) {\n                autoCompleteView.setText(\"\");\n                clearContact.setVisibility(GONE);\n                listener.onContactCleared();\n                autoCompleteView.setEnabled(true);\n                autoCompleteView.getBackground().setAlpha(255);\n                autoCompleteView.requestFocus();\n            }\n        });\n\n        ContactsSearch contactsSearch = new ContactsSearch(contactsProvider, NameMatcher.INSTANCE);\n        final ContactsAdapter adapter = new ContactsAdapter(contactsSearch, imageLoader);\n        autoCompleteView.setAdapter(adapter);\n        autoCompleteView.setOnItemClickListener(new AdapterView.OnItemClickListener() {\n            @Override\n            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {\n                listener.onContactSelected(adapter.getItem(position));\n                AndroidUtils.requestHideKeyboard(view.getContext(), view);\n\n                TransitionManager.beginDelayedTransition(ContactSuggestionView.this);\n                clearContact.setVisibility(VISIBLE);\n                autoCompleteView.setEnabled(false);\n                autoCompleteView.getBackground().setAlpha(0);\n\n            }\n        });\n    }\n\n    public void addTextChangedListener(TextWatcher textWatcher) {\n        autoCompleteView.addTextChangedListener(textWatcher);\n    }\n\n    public void setOnContactSelectedListener(OnContactSelectedListener listener) {\n        this.listener = listener;\n    }\n\n    public interface OnContactSelectedListener {\n        void onContactSelected(Contact contact);\n\n        OnContactSelectedListener NO_CALLBACKS = new OnContactSelectedListener() {\n            @Override\n            public void onContactSelected(Contact contact) {\n                Log.w(\"onContactSelected called with no callbacks\");\n            }\n\n            @Override\n            public void onContactCleared() {\n                Log.w(\"onContactCleared without a listener\");\n            }\n\n        };\n\n        void onContactCleared();\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/ui/ContactsAdapter.java",
    "content": "package com.alexstyl.specialdates.addevent.ui;\n\nimport android.support.annotation.NonNull;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.BaseAdapter;\nimport android.widget.Filter;\nimport android.widget.Filterable;\nimport android.widget.TextView;\n\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.addevent.ContactsSearch;\nimport com.alexstyl.specialdates.contact.Contact;\nimport com.alexstyl.specialdates.images.ImageLoader;\nimport com.alexstyl.specialdates.ui.widget.ColorImageView;\nimport com.novoda.notils.caster.Views;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nclass ContactsAdapter extends BaseAdapter implements Filterable {\n\n    private final ImageLoader imageLoader;\n    private final ArrayList<Contact> contacts = new ArrayList<>();\n\n    private final Filter filter;\n\n    ContactsAdapter(ContactsSearch contactsSearch, ImageLoader imageLoader) {\n        this.imageLoader = imageLoader;\n        this.filter = new DeviceContactsFilter(contactsSearch) {\n\n            @Override\n            public void onContactsFiltered(@NonNull List<Contact> contacts) {\n                setSuggestions(contacts);\n            }\n        };\n    }\n\n    @Override\n    public int getCount() {\n        return contacts.size();\n    }\n\n    @Override\n    public Contact getItem(int position) {\n        return contacts.get(position);\n    }\n\n    @Override\n    public long getItemId(int position) {\n        return position;\n    }\n\n    @Override\n    public View getView(int position, View view, ViewGroup parent) {\n        ContactViewHolder vh;\n        if (view == null) {\n            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_contact, parent, false);\n            vh = new ContactViewHolder();\n            vh.contactName = Views.findById(view, R.id.display_name);\n            vh.avatar = Views.findById(view, R.id.search_result_avatar);\n            view.setTag(vh);\n        } else {\n            vh = (ContactViewHolder) view.getTag();\n        }\n\n        Contact contact = getItem(position);\n        String displayName = contact.toString();\n        vh.contactName.setText(displayName);\n        vh.avatar.setCircleColorVariant((int) contact.getContactID());\n        vh.avatar.setLetter(displayName);\n\n        imageLoader\n                .load(contact.getImagePath())\n                .asCircle()\n                .into(vh.avatar.getImageView());\n\n        return view;\n    }\n\n    private static class ContactViewHolder {\n        private ColorImageView avatar;\n        private TextView contactName;\n    }\n\n    private void setSuggestions(List<Contact> contacts) {\n        this.contacts.clear();\n        this.contacts.addAll(contacts);\n\n        notifyDataSetChanged();\n    }\n\n    @Override\n    public Filter getFilter() {\n        return filter;\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/ui/DeviceContactsFilter.kt",
    "content": "package com.alexstyl.specialdates.addevent.ui\n\nimport android.widget.Filter\n\nimport com.alexstyl.specialdates.addevent.ContactsSearch\nimport com.alexstyl.specialdates.contact.Contact\n\nimport java.util.ArrayList\n\ninternal abstract class DeviceContactsFilter(private val contactsSearch: ContactsSearch) : Filter() {\n\n    override fun performFiltering(constraint: CharSequence?): Filter.FilterResults {\n        if (constraint == null || constraint.isEmpty()) {\n            return emptyResults()\n        }\n        val searchQuery = constraint.trim { it <= ' ' }.toString()\n        val contacts = contactsSearch.searchForContacts(searchQuery, LOAD_A_SINGLE_CONTACT)\n\n        val filterResults = Filter.FilterResults()\n        filterResults.values = contacts\n        filterResults.count = contacts.size\n        return filterResults\n    }\n\n    private fun emptyResults(): Filter.FilterResults {\n        val filterResults = Filter.FilterResults()\n        filterResults.values = ArrayList<Any>()\n        filterResults.count = 0\n        return filterResults\n    }\n\n    override fun publishResults(constraint: CharSequence?, results: Filter.FilterResults) {\n        onContactsFiltered(results.values as List<Contact>)\n    }\n\n    abstract fun onContactsFiltered(contacts: List<Contact>)\n\n    companion object {\n        private const val LOAD_A_SINGLE_CONTACT = 1\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/addevent/ui/EventDatePicker.java",
    "content": "package com.alexstyl.specialdates.addevent.ui;\n\nimport android.content.Context;\nimport android.support.transition.TransitionManager;\nimport android.util.AttributeSet;\nimport android.view.View;\nimport android.widget.CheckedTextView;\nimport android.widget.LinearLayout;\nimport android.widget.NumberPicker;\n\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.date.MonthInt;\nimport com.alexstyl.specialdates.upcoming.MonthLabels;\nimport com.novoda.notils.caster.Views;\n\nimport java.util.Locale;\n\npublic class EventDatePicker extends LinearLayout {\n\n    private static final int FIRST_DAY_OF_MONTH = 1;\n\n    private final MonthLabels labels;\n\n    private final NumberPicker dayPicker;\n    private final NumberPicker monthPicker;\n    private final NumberPicker yearPicker;\n\n    private final CheckedTextView includesYearCheckbox;\n\n    private final Date today;\n    private static final int FIRST_MONTH = 1;\n    private static final int LAST_MONTH = 12;\n    private static final int FIRST_YEAR = 1900;\n\n    public EventDatePicker(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        super.setOrientation(HORIZONTAL);\n        labels = MonthLabels.forLocale(Locale.getDefault());\n        today = Date.Companion.today();\n        inflate(getContext(), R.layout.merge_birthday_picker, this);\n\n        dayPicker = Views.findById(this, R.id.day_picker);\n        setupDayPicker();\n\n        monthPicker = Views.findById(this, R.id.month_picker);\n        setupMonthPicker();\n\n        yearPicker = Views.findById(this, R.id.year_picker);\n        setupYearPicker();\n\n        includesYearCheckbox = Views.findById(this, R.id.include_year_checkbox);\n        includesYearCheckbox.setOnClickListener(new OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                boolean checked = includesYearCheckbox.isChecked();\n                includesYearCheckbox.setChecked(!checked);\n\n                if (includesYearCheckbox.isChecked()) {\n                    showYearPicker();\n                } else {\n                    hideYearPicker();\n                }\n                updateMaximumDaysInCurrentMonth();\n            }\n\n            private void hideYearPicker() {\n                TransitionManager.beginDelayedTransition(EventDatePicker.this);\n                yearPicker.setVisibility(GONE);\n            }\n\n            private void showYearPicker() {\n                TransitionManager.beginDelayedTransition(EventDatePicker.this);\n                yearPicker.setVisibility(VISIBLE);\n            }\n        });\n    }\n\n    private void setupDayPicker() {\n        dayPicker.setMinValue(FIRST_DAY_OF_MONTH);\n        dayPicker.setMaxValue(today.getDaysInCurrentMonth());\n\n        dayPicker.setValue(today.getDayOfMonth());\n\n    }\n\n    private void setupMonthPicker() {\n        monthPicker.setMinValue(FIRST_MONTH);\n        monthPicker.setMaxValue(LAST_MONTH);\n\n        monthPicker.setDisplayedValues(labels.getMonthsOfYear());\n\n        monthPicker.setValue(today.getMonth());\n        monthPicker.setOnValueChangedListener(dateValidator);\n    }\n\n    private void setupYearPicker() {\n        yearPicker.setMinValue(FIRST_YEAR);\n        yearPicker.setMaxValue(currentYear());\n\n        yearPicker.setValue(currentYear());\n        yearPicker.setOnValueChangedListener(dateValidator);\n    }\n\n    private Integer currentYear() {\n        return today.getYear();\n    }\n\n    public void setDisplayingDate(Date dateToDisplay) {\n        if (dateToDisplay.hasYear()) {\n            dayPicker.setValue(dateToDisplay.getDayOfMonth());\n            monthPicker.setValue(dateToDisplay.getMonth());\n            yearPicker.setValue(dateToDisplay.getYear());\n            yearPicker.setVisibility(VISIBLE);\n            includesYearCheckbox.setChecked(true);\n        } else {\n            dayPicker.setValue(dateToDisplay.getDayOfMonth());\n            monthPicker.setValue(dateToDisplay.getMonth());\n            yearPicker.setValue(currentYear());\n            yearPicker.setVisibility(GONE);\n            includesYearCheckbox.setChecked(false);\n        }\n    }\n\n    public Date getDisplayingDate() {\n        int dayOfMonth = getDayOfMonth();\n        int month = getMonth();\n        if (isDisplayingYear()) {\n            int year = getYear();\n            return Date.Companion.on(dayOfMonth, month, year);\n        } else {\n            return Date.Companion.on(dayOfMonth, month);\n        }\n    }\n\n    private boolean isDisplayingYear() {\n        return includesYearCheckbox.isChecked();\n    }\n\n    private int getDayOfMonth() {\n        return dayPicker.getValue();\n    }\n\n    @MonthInt\n    private int getMonth() {\n        @MonthInt int value = monthPicker.getValue();\n        return value;\n    }\n\n    private int getYear() {\n        return yearPicker.getValue();\n    }\n\n    private final NumberPicker.OnValueChangeListener dateValidator = new NumberPicker.OnValueChangeListener() {\n\n        @Override\n        public void onValueChange(NumberPicker picker, int oldVal, int newVal) {\n            updateMaximumDaysInCurrentMonth();\n        }\n\n    };\n\n    private void updateMaximumDaysInCurrentMonth() {\n        int maxDays;\n        if (isDisplayingYear()){\n            maxDays = Date.Companion.on(FIRST_DAY_OF_MONTH, getMonth(), getYear()).getDaysInCurrentMonth();\n        } else {\n            maxDays = Date.Companion.on(FIRST_DAY_OF_MONTH, getMonth()).getDaysInCurrentMonth();\n        }\n\n        dayPicker.setMaxValue(maxDays);\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/analytics/Action.java",
    "content": "package com.alexstyl.specialdates.analytics;\n\npublic enum Action {\n    ADD_BIRTHDAY(\"add_bday\"),\n    DAILY_REMINDER(\"reminder\"),\n    DONATION(\"donate\"),\n    INTERACT_CONTACT(\"contact\"),\n    SELECT_THEME(\"theme\"),\n    SELECT_DATE(\"select_date\"),\n    COMPLICATION(\"complication: contacts events\");\n\n    private final String name;\n\n    Action(String name) {\n        this.name = name;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/analytics/ActionWithParameters.java",
    "content": "package com.alexstyl.specialdates.analytics;\n\npublic final class ActionWithParameters {\n\n    private final Action actionName;\n    private final String label;\n    private final String value;\n\n    public ActionWithParameters(Action actionName, String label, String value) {\n        this.actionName = actionName;\n        this.label = label;\n        this.value = value;\n    }\n\n    public String getName() {\n        return actionName.getName();\n    }\n\n    public String getLabel() {\n        return label;\n    }\n\n    public String getValue() {\n        return value;\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/analytics/AnalyticsModule.kt",
    "content": "package com.alexstyl.specialdates.analytics\n\nimport android.content.Context\n\nimport com.alexstyl.specialdates.common.BuildConfig\nimport com.google.firebase.analytics.FirebaseAnalytics\nimport com.mixpanel.android.mpmetrics.MixpanelAPI\n\nimport javax.inject.Singleton\n\nimport dagger.Module\nimport dagger.Provides\n\n@Module\n@Singleton\nclass AnalyticsModule {\n\n    @Provides\n    @Singleton\n    internal fun providesAnalytics(context: Context): Analytics {\n        return CompositeAnalytics(buildMixPanel(context), buildFirebase(context))\n    }\n\n    private fun buildFirebase(context: Context) =\n            FirebaseAnalyticsImpl(FirebaseAnalytics.getInstance(context))\n\n    private fun buildMixPanel(context: Context): MixPanel {\n        val projectToken = BuildConfig.MIXPANEL_TOKEN\n        val mixpanel = MixpanelAPI.getInstance(context, projectToken)\n        val analytics = MixPanel(mixpanel)\n        return analytics\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/analytics/CompositeAnalytics.kt",
    "content": "package com.alexstyl.specialdates.analytics\n\nimport com.alexstyl.specialdates.TimeOfDay\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.donate.Donation\nimport com.alexstyl.specialdates.events.peopleevents.EventType\n\nclass CompositeAnalytics(private vararg val analytics: Analytics) : Analytics {\n    override fun trackThemeSelected(string: String) {\n        analytics.forEach {\n            it.trackThemeSelected(string)\n        }\n    }\n\n    override fun trackScreen(screen: Screen) {\n        analytics.forEach {\n            it.trackScreen(screen)\n        }\n    }\n\n    override fun trackAddEventsCancelled() {\n        analytics.forEach {\n            it.trackAddEventsCancelled()\n        }\n    }\n\n    override fun trackEventAddedSuccessfully() {\n        analytics.forEach {\n            it.trackEventAddedSuccessfully()\n        }\n    }\n\n    override fun trackContactSelected() {\n        analytics.forEach {\n            it.trackContactSelected()\n        }\n    }\n\n    override fun trackEventDatePicked(eventType: EventType) {\n        analytics.forEach {\n            it.trackEventDatePicked(eventType)\n        }\n    }\n\n    override fun trackEventRemoved(eventType: EventType) {\n        analytics.forEach {\n            it.trackEventRemoved(eventType)\n        }\n    }\n\n    override fun trackImageCaptured() {\n        analytics.forEach {\n            it.trackImageCaptured()\n        }\n    }\n\n    override fun trackExistingImagePicked() {\n        analytics.forEach {\n            it.trackExistingImagePicked()\n        }\n    }\n\n    override fun trackAvatarSelected() {\n        analytics.forEach {\n            it.trackAvatarSelected()\n        }\n    }\n\n    override fun trackContactUpdated() {\n        analytics.forEach {\n            it.trackContactUpdated()\n        }\n    }\n\n    override fun trackContactCreated() {\n        analytics.forEach {\n            it.trackContactCreated()\n        }\n    }\n\n    override fun trackDailyReminderEnabled() {\n        analytics.forEach {\n            it.trackDailyReminderEnabled()\n        }\n    }\n\n    override fun trackDailyReminderDisabled() {\n        analytics.forEach {\n            it.trackDailyReminderDisabled()\n        }\n    }\n\n    override fun trackDailyReminderTimeUpdated(timeOfDay: TimeOfDay) {\n        analytics.forEach {\n            it.trackDailyReminderTimeUpdated(timeOfDay)\n        }\n    }\n\n    override fun trackWidgetAdded(widget: Widget) {\n        analytics.forEach {\n            it.trackWidgetAdded(widget)\n        }\n    }\n\n    override fun trackWidgetRemoved(widget: Widget) {\n        analytics.forEach {\n            it.trackWidgetRemoved(widget)\n        }\n    }\n\n    override fun trackDonationStarted(donation: Donation) {\n        analytics.forEach {\n            it.trackDonationStarted(donation)\n        }\n    }\n\n    override fun trackAppInviteRequested() {\n        analytics.forEach {\n            it.trackAppInviteRequested()\n        }\n    }\n\n    override fun trackDonationRestored() {\n        analytics.forEach {\n            it.trackDonationRestored()\n        }\n    }\n\n    override fun trackDonationPlaced(donation: Donation) {\n        analytics.forEach {\n            it.trackDonationPlaced(donation)\n        }\n    }\n\n    override fun trackFacebookLoggedIn() {\n        analytics.forEach {\n            it.trackFacebookLoggedIn()\n        }\n    }\n\n    override fun trackOnAvatarBounce() {\n        analytics.forEach {\n            it.trackOnAvatarBounce()\n        }\n    }\n\n    override fun trackFacebookLoggedOut() {\n        analytics.forEach {\n            it.trackFacebookLoggedOut()\n        }\n    }\n\n    override fun trackVisitGithub() {\n        analytics.forEach {\n            it.trackVisitGithub()\n        }\n    }\n\n    override fun trackContactDetailsViewed(contact: Contact) {\n        analytics.forEach {\n            it.trackContactDetailsViewed(contact)\n        }\n    }\n\n    override fun trackNamedaysScreen() {\n        analytics.forEach {\n            it.trackNamedaysScreen()\n        }\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/analytics/FirebaseAnalyticsImpl.kt",
    "content": "package com.alexstyl.specialdates.analytics\n\nimport android.os.Bundle\nimport android.support.annotation.NonNull\nimport android.support.annotation.Size\nimport com.alexstyl.specialdates.TimeOfDay\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.donate.Donation\nimport com.alexstyl.specialdates.events.peopleevents.EventType\nimport com.google.firebase.analytics.FirebaseAnalytics\n\nclass FirebaseAnalyticsImpl(private val firebase: FirebaseAnalytics) : Analytics {\n\n    override fun trackThemeSelected(string: String) {\n        firebase.logEvent(Action.SELECT_THEME.name, Bundle().apply {\n            putString(\"theme name\", string)\n        })\n    }\n\n    override fun trackScreen(screen: Screen) {\n        val bundle = Bundle()\n        bundle.putString(\"screen_name\", screen.screenName())\n        firebase.logEvent(\"screen_view\", bundle)\n    }\n\n    override fun trackAddEventsCancelled() {\n        firebase.logEvent(\"add_events_cancelled\")\n    }\n\n    override fun trackEventAddedSuccessfully() {\n        firebase.logEvent(\"add_events_success\")\n    }\n\n    override fun trackContactSelected() {\n        firebase.logEvent(\"contact_selected\")\n    }\n\n    override fun trackEventDatePicked(eventType: EventType) {\n        val properties = createPropertyFor(eventType)\n        firebase.logEvent(\"event_date_picked\", properties)\n    }\n\n    override fun trackEventRemoved(eventType: EventType) {\n        val properties = createPropertyFor(eventType)\n        firebase.logEvent(\"event_removed\", properties)\n    }\n\n    override fun trackImageCaptured() {\n        firebase.logEvent(\"image_captured\")\n    }\n\n    override fun trackExistingImagePicked() {\n        firebase.logEvent(\"existing_image_picked\")\n    }\n\n    override fun trackAvatarSelected() {\n        firebase.logEvent(\"avatar_selected\")\n    }\n\n    override fun trackContactUpdated() {\n        firebase.logEvent(\"contact_updated\")\n    }\n\n    override fun trackContactCreated() {\n        firebase.logEvent(\"contact_created\")\n    }\n\n    override fun trackDailyReminderEnabled() {\n        firebase.logEvent(\"daily_reminder_enabled\")\n    }\n\n    override fun trackDailyReminderDisabled() {\n        firebase.logEvent(\"daily_reminder_disabled\")\n    }\n\n    override fun trackDailyReminderTimeUpdated(timeOfDay: TimeOfDay) {\n        val properties = createPropertyFor(timeOfDay)\n        firebase.logEvent(\"daily_reminder_time_updated\", properties)\n    }\n\n    override fun trackWidgetAdded(widget: Widget) {\n        firebase.logEvent(\"widget_added\", widgetNameOf(widget))\n    }\n\n    private fun widgetNameOf(widget: Widget): Bundle {\n        return Bundle().apply {\n            putString(\"widget_name\", widget.widgetName)\n        }\n    }\n\n    override fun trackWidgetRemoved(widget: Widget) {\n        firebase.logEvent(\"widget_removed\", widgetNameOf(widget))\n    }\n\n    override fun trackDonationStarted(donation: Donation) {\n        val properties = Bundle().apply {\n            putString(FirebaseAnalytics.Param.ITEM_ID, donation.identifier)\n            putString(FirebaseAnalytics.Param.PRICE, donation.amount)\n        }\n        firebase.logEvent(\"donation_started\", properties)\n    }\n\n    override fun trackAppInviteRequested() {\n        firebase.logEvent(\"app_invite_requested\")\n    }\n\n    override fun trackDonationRestored() {\n        firebase.logEvent(\"donation_restored\")\n    }\n\n    override fun trackDonationPlaced(donation: Donation) {\n        val properties = Bundle().apply {\n            putString(FirebaseAnalytics.Param.ITEM_ID, donation.identifier)\n            putString(FirebaseAnalytics.Param.PRICE, donation.amount)\n        }\n        firebase.logEvent(FirebaseAnalytics.Event.ECOMMERCE_PURCHASE, properties)\n    }\n\n    override fun trackFacebookLoggedIn() {\n        firebase.logEvent(\"facebook_log_in\")\n    }\n\n    override fun trackOnAvatarBounce() {\n        firebase.logEvent(\"avatar_bounce\")\n    }\n\n    override fun trackFacebookLoggedOut() {\n        firebase.logEvent(\"facebook_log_out\")\n    }\n\n    override fun trackVisitGithub() {\n        firebase.logEvent(\"visit_github\")\n    }\n\n    override fun trackContactDetailsViewed(contact: Contact) {\n        firebase.logEvent(\"view_contact_details\")\n    }\n\n    override fun trackNamedaysScreen() {\n        firebase.logEvent(\"namedays_screen\")\n    }\n\n    private fun createPropertyFor(eventType: EventType): Bundle {\n        val properties = Bundle()\n        properties.putInt(\"event_type\", eventType.id)\n        return properties\n    }\n\n    private fun createPropertyFor(timeOfDay: TimeOfDay): Bundle {\n        return Bundle().apply {\n            putString(\"time\", timeOfDay.toString())\n        }\n    }\n\n    private fun FirebaseAnalytics.logEvent(@NonNull @Size(min = 1L, max = 40L) eventName: String) {\n        return logEvent(eventName, Bundle.EMPTY)\n    }\n}\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/analytics/MixPanel.kt",
    "content": "package com.alexstyl.specialdates.analytics\n\nimport com.alexstyl.specialdates.TimeOfDay\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.donate.Donation\nimport com.alexstyl.specialdates.events.peopleevents.EventType\nimport com.mixpanel.android.mpmetrics.MixpanelAPI\n\nimport org.json.JSONException\nimport org.json.JSONObject\n\nclass MixPanel(private val mixpanel: MixpanelAPI) : Analytics {\n    override fun trackThemeSelected(string: String) {\n        mixpanel.track(Action.SELECT_THEME.name, JSONObject().apply {\n            put(\"theme name\", string)\n        })\n    }\n\n    override fun trackScreen(screen: Screen) {\n        mixpanel.track(\"ScreenView: \" + screen.screenName())\n    }\n\n    override fun trackAddEventsCancelled() {\n        mixpanel.track(\"add events cancelled\")\n    }\n\n    override fun trackEventAddedSuccessfully() {\n        mixpanel.track(\"add events success\")\n    }\n\n    override fun trackContactSelected() {\n        mixpanel.track(\"contact selected\")\n    }\n\n    override fun trackEventDatePicked(eventType: EventType) {\n        val properties = createPropertyFor(eventType)\n        mixpanel.track(\"event date picked \", properties)\n    }\n\n    override fun trackEventRemoved(eventType: EventType) {\n        val properties = createPropertyFor(eventType)\n        mixpanel.track(\"event removed\", properties)\n    }\n\n    override fun trackImageCaptured() {\n        mixpanel.track(\"image captured\")\n    }\n\n    override fun trackExistingImagePicked() {\n        mixpanel.track(\"existing image picked\")\n    }\n\n    override fun trackAvatarSelected() {\n        mixpanel.track(\"avatar selected\")\n    }\n\n    override fun trackContactUpdated() {\n        mixpanel.track(\"contact updated\")\n    }\n\n    override fun trackContactCreated() {\n        mixpanel.track(\"contact created\")\n    }\n\n    override fun trackDailyReminderEnabled() {\n        mixpanel.track(\"daily reminder enabled\")\n    }\n\n    override fun trackDailyReminderDisabled() {\n        mixpanel.track(\"daily reminder disabled\")\n    }\n\n    override fun trackDailyReminderTimeUpdated(timeOfDay: TimeOfDay) {\n        val properties = createPropertyFor(timeOfDay)\n        mixpanel.track(\"daily reminder time updated\", properties)\n    }\n\n    override fun trackWidgetAdded(widget: Widget) {\n        mixpanel.track(\"widget_added\", widgetNameOf(widget))\n    }\n\n    private fun widgetNameOf(widget: Widget): JSONObject {\n        val properties = JSONObject()\n        try {\n            properties.put(\"widget_name\", widget.widgetName)\n            return properties\n        } catch (e: JSONException) {\n            e.printStackTrace()\n        }\n\n        return properties\n    }\n\n    override fun trackWidgetRemoved(widget: Widget) {\n        mixpanel.track(\"widget_removed\", widgetNameOf(widget))\n    }\n\n    override fun trackDonationStarted(donation: Donation) {\n        val properties = JSONObject()\n        try {\n            properties.put(\"id\", donation.identifier)\n            properties.put(\"amount\", donation.amount)\n        } catch (e: JSONException) {\n            e.printStackTrace()\n        }\n\n        mixpanel.track(\"donation started\", properties)\n    }\n\n    override fun trackAppInviteRequested() {\n        mixpanel.track(\"app_invite_requested\")\n    }\n\n    override fun trackDonationRestored() {\n        mixpanel.track(\"donation_restored\")\n    }\n\n    override fun trackDonationPlaced(donation: Donation) {\n        val properties = JSONObject()\n        try {\n            properties.put(\"amount\", donation.amount)\n            properties.put(\"identifier\", donation.identifier)\n        } catch (e: JSONException) {\n            e.printStackTrace()\n        }\n\n        mixpanel.track(\"donation_placed\", properties)\n    }\n\n    override fun trackFacebookLoggedIn() {\n        mixpanel.track(\"facebook_log_in\")\n    }\n\n    override fun trackOnAvatarBounce() {\n        mixpanel.track(\"avatar bounce\")\n    }\n\n    override fun trackFacebookLoggedOut() {\n        mixpanel.track(\"facebook_log_out\")\n    }\n\n    override fun trackVisitGithub() {\n        mixpanel.track(\"visit_github\")\n    }\n\n    override fun trackContactDetailsViewed(contact: Contact) {\n        mixpanel.track(\"view_contact_details\")\n    }\n\n    override fun trackNamedaysScreen() {\n        mixpanel.track(\"namedays_screen\")\n    }\n\n    private fun createPropertyFor(eventType: EventType): JSONObject {\n        val properties = JSONObject()\n        try {\n            properties.put(\"event type\", eventType.id)\n        } catch (e: JSONException) {\n            e.printStackTrace()\n        }\n\n        return properties\n    }\n\n    private fun createPropertyFor(timeOfDay: TimeOfDay): JSONObject {\n        val properties = JSONObject()\n        try {\n            properties.put(\"time\", timeOfDay.toString())\n        } catch (e: JSONException) {\n            e.printStackTrace()\n        }\n\n        return properties\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/contact/AndroidContactFactory.kt",
    "content": "package com.alexstyl.specialdates.contact\n\nimport android.content.ContentResolver\nimport android.content.ContentUris\nimport android.database.Cursor\nimport android.provider.ContactsContract\nimport com.alexstyl.specialdates.CrashAndErrorTracker\nimport com.alexstyl.specialdates.contact.AndroidContactsQuery.SORT_ORDER\nimport com.alexstyl.specialdates.contact.ContactSource.SOURCE_DEVICE\nimport java.net.URI\n\nclass AndroidContactFactory(private val resolver: ContentResolver, private val tracker: CrashAndErrorTracker) {\n\n    fun getAllContacts(): Contacts {\n        val cursor: Cursor?\n        try {\n            cursor = resolver.query(\n                    AndroidContactsQuery.CONTENT_URI,\n                    AndroidContactsQuery.PROJECTION,\n                    WHERE, null,\n                    AndroidContactsQuery.SORT_ORDER\n            )\n        } catch (e: Exception) {\n            tracker.track(e)\n            return Contacts(SOURCE_DEVICE, emptyList())\n        }\n        return cursor.use {\n            return@use Contacts(SOURCE_DEVICE, List(it.count, { index ->\n                it.moveToPosition(index)\n                createContactFrom(it)\n            }))\n        }\n    }\n\n    @Throws(ContactNotFoundException::class)\n    fun createContactWithId(contactID: Long): Contact {\n        val cursor = queryContactsWithContactId(contactID)\n        if (isInvalid(cursor)) {\n            throw RuntimeException(\"Cursor was invalid\")\n        }\n        cursor.use {\n            if (it.moveToFirst()) {\n                return createContactFrom(it)\n            }\n        }\n        throw ContactNotFoundException(contactID)\n    }\n\n\n    fun queryContacts(ids: List<Long>): Contacts {\n        val cursor = queryContactsWithContactId(ids)\n\n        return cursor.use {\n            return@use Contacts(SOURCE_DEVICE, List(it.count) { index ->\n                it.moveToPosition(index)\n                createContactFrom(it)\n            })\n        }\n    }\n\n    private fun queryContactsWithContactId(ids: List<Long>): Cursor {\n        return resolver.query(\n                AndroidContactsQuery.CONTENT_URI,\n                AndroidContactsQuery.PROJECTION,\n                \"${AndroidContactsQuery._ID} IN (${ids.joinToString(\",\")})\",\n                null,\n                SORT_ORDER\n        )\n    }\n\n    private fun createContactFrom(cursor: Cursor): Contact {\n        val contactID = getContactIdFrom(cursor)\n        val displayName = getDisplayNameFrom(cursor)\n        val imagePath = URI.create(ContentUris.withAppendedId(AndroidContactsQuery.CONTENT_URI, contactID).toString())\n        return Contact(contactID, displayName, imagePath, SOURCE_DEVICE)\n    }\n\n    private fun queryContactsWithContactId(contactID: Long): Cursor {\n        return resolver.query(\n                AndroidContactsQuery.CONTENT_URI,\n                AndroidContactsQuery.PROJECTION,\n                SELECTION_CONTACT_WITH_ID,\n                makeSelectionArgumentsFor(contactID),\n                SORT_ORDER + \" LIMIT 1\"\n        )\n    }\n\n    private fun makeSelectionArgumentsFor(contactID: Long): Array<String> =\n            arrayOf(contactID.toString())\n\n    companion object {\n\n        private val WHERE = ContactsContract.Data.IN_VISIBLE_GROUP + \"=1\"\n        private val SELECTION_CONTACT_WITH_ID = AndroidContactsQuery._ID + \" = ?\"\n\n        private fun isInvalid(cursor: Cursor?): Boolean = cursor == null || cursor.isClosed\n\n        private fun getContactIdFrom(cursor: Cursor): Long =\n                cursor.getLong(AndroidContactsQuery.CONTACT_ID)\n\n        private fun getDisplayNameFrom(cursor: Cursor): DisplayName =\n                DisplayName.from(cursor.getString(AndroidContactsQuery.DISPLAY_NAME))\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/contact/AndroidContactsProviderSource.kt",
    "content": "package com.alexstyl.specialdates.contact\n\ninternal class AndroidContactsProviderSource(private val cache: ContactCache, private val factory: AndroidContactFactory) : ContactsProviderSource {\n\n\n    @Throws(ContactNotFoundException::class)\n    override fun getOrCreateContact(contactID: Long): Contact {\n        var deviceContact = cache.getContact(contactID)\n        if (deviceContact == null) {\n            deviceContact = factory.createContactWithId(contactID)\n            cache.addContact(deviceContact)\n        }\n        return deviceContact\n    }\n\n    override val allContacts: Contacts\n        get() {\n            val allContacts = factory.getAllContacts()\n            cache.evictAll()\n            cache.addContacts(allContacts)\n            return allContacts\n        }\n\n    override fun queryContacts(contactIds: List<Long>): Contacts {\n        val contacts = factory.queryContacts(contactIds)\n        cache.addContacts(contacts)\n        return contacts\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/contact/AndroidContactsQuery.java",
    "content": "package com.alexstyl.specialdates.contact;\n\nimport android.net.Uri;\nimport android.provider.ContactsContract;\nimport android.provider.ContactsContract.Contacts;\n\nfinal class AndroidContactsQuery {\n\n    public static final Uri CONTENT_URI = ContactsContract.Contacts.CONTENT_URI;\n    static final String[] PROJECTION = {\n            Contacts._ID,\n            Contacts.DISPLAY_NAME_PRIMARY,\n    };\n    static final String SORT_ORDER = Contacts._ID;\n\n    public static final int CONTACT_ID = 0;\n    static final int DISPLAY_NAME = 1;\n    public static final String _ID = Contacts._ID;\n\n    private AndroidContactsQuery() {\n        // hide this\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/contact/ContactIntentExtractor.kt",
    "content": "package com.alexstyl.specialdates.contact\n\nimport android.content.Intent\nimport com.alexstyl.specialdates.CrashAndErrorTracker\nimport com.alexstyl.specialdates.MementoConstants\nimport com.alexstyl.specialdates.Optional\n\n\nclass ContactIntentExtractor(val tracker: CrashAndErrorTracker,\n                             val contactsProvider: ContactsProvider) {\n\n    companion object {\n        val EXTRA_CONTACT_SOURCE = \"${MementoConstants.PACKAGE}.extra:source\"\n        val EXTRA_CONTACT_ID = \"${MementoConstants.PACKAGE}.extra:contactId\"\n    }\n\n    fun getContactExtra(intent: Intent): Optional<Contact> {\n        val contactID = intent.getLongExtra(EXTRA_CONTACT_ID, -1)\n        if (contactID == -1L) {\n            return Optional.absent()\n        }\n        @ContactSource val contactSource = intent.getIntExtra(EXTRA_CONTACT_SOURCE, -1)\n        return if (contactSource == -1) {\n            return Optional.absent()\n        } else contactFor(contactID, contactSource)\n    }\n\n\n    private fun contactFor(contactID: Long, contactSource: Int): Optional<Contact> {\n        return try {\n            Optional(contactsProvider.getContact(contactID, contactSource))\n        } catch (e: ContactNotFoundException) {\n            tracker.track(e)\n            Optional.absent()\n        }\n    }\n}\n\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/contact/ContactsModule.kt",
    "content": "package com.alexstyl.specialdates.contact\n\nimport android.content.ContentResolver\nimport com.alexstyl.specialdates.CrashAndErrorTracker\nimport com.alexstyl.specialdates.contact.ContactSource.SOURCE_DEVICE\nimport com.alexstyl.specialdates.contact.ContactSource.SOURCE_FACEBOOK\nimport com.alexstyl.specialdates.events.database.EventSQLiteOpenHelper\nimport dagger.Module\nimport dagger.Provides\nimport javax.inject.Singleton\n\n@Module\nclass ContactsModule {\n\n    @Provides\n    @Singleton\n    internal fun provider(contentResolver: ContentResolver,\n                          eventSQLiteOpenHelper: EventSQLiteOpenHelper,\n                          tracker: CrashAndErrorTracker): ContactsProvider {\n        return ContactsProvider(mapOf(\n                Pair(SOURCE_DEVICE, buildAndroidSource(tracker, contentResolver)),\n                Pair(SOURCE_FACEBOOK, buildFacebookSource(eventSQLiteOpenHelper))\n        ))\n    }\n\n    companion object {\n\n        private const val CACHE_SIZE = 1024\n\n        private fun buildAndroidSource(tracker: CrashAndErrorTracker, contentResolver: ContentResolver): ContactsProviderSource {\n            val factory = AndroidContactFactory(contentResolver, tracker)\n            val contactCache = ContactCache(CACHE_SIZE)\n            return AndroidContactsProviderSource(contactCache, factory)\n        }\n\n        private fun buildFacebookSource(eventSQLHelper: EventSQLiteOpenHelper): ContactsProviderSource {\n            val contactCache = ContactCache(CACHE_SIZE)\n            return FacebookContactsSource(eventSQLHelper, contactCache)\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/contact/EmptyContactSource.kt",
    "content": "package com.alexstyl.specialdates.contact\n\nclass EmptyContactSource(val source: Int) : ContactsProviderSource {\n\n    override val allContacts: Contacts\n        get() = Contacts(source, emptyList())\n\n\n    @Throws(ContactNotFoundException::class)\n    override fun getOrCreateContact(contactID: Long): Contact {\n        throw ContactNotFoundException(contactID)\n    }\n\n    override fun queryContacts(contactIds: List<Long>): Contacts = Contacts(source, emptyList())\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/contact/FacebookContactsSource.kt",
    "content": "package com.alexstyl.specialdates.contact\n\nimport android.database.Cursor\nimport com.alexstyl.specialdates.contact.ContactSource.SOURCE_FACEBOOK\nimport com.alexstyl.specialdates.events.database.DatabaseContract.AnnualEventsContract\nimport com.alexstyl.specialdates.events.database.EventSQLiteOpenHelper\nimport com.alexstyl.specialdates.facebook.FacebookImagePath\n\ninternal class FacebookContactsSource(private val eventSQLHelper: EventSQLiteOpenHelper,\n                                      private val cache: ContactCache)\n    : ContactsProviderSource {\n\n\n    @Throws(ContactNotFoundException::class)\n    override fun getOrCreateContact(contactID: Long): Contact {\n        var contact: Contact? = cache.getContact(contactID)\n        if (contact == null) {\n            contact = queryContactWith(contactID)\n        }\n        return contact\n    }\n\n    @Throws(ContactNotFoundException::class)\n    private fun queryContactWith(contactID: Long): Contact {\n        val readableDatabase = eventSQLHelper.readableDatabase\n        val cursor = readableDatabase.query(\n                AnnualEventsContract.TABLE_NAME, null,\n                \"$IS_A_FACEBOOK_CONTACT AND ${AnnualEventsContract.CONTACT_ID} == $contactID\", null, null, null, null\n        )\n\n        return cursor.use {\n            if (!it.moveToFirst()) {\n                throw ContactNotFoundException(contactID)\n            }\n\n            return@use createContactFrom(cursor)\n        }\n    }\n\n    override fun queryContacts(contactIds: List<Long>): Contacts {\n        val readableDatabase = eventSQLHelper.readableDatabase\n        val cursor = readableDatabase.query(\n                AnnualEventsContract.TABLE_NAME,\n                null,\n                \"$IS_A_FACEBOOK_CONTACT AND ${AnnualEventsContract.CONTACT_ID} IN (${List(contactIds.size, { \"?\" }).joinToString(\",\")})\",\n                contactIds.map { it.toString() }.toTypedArray(),\n                null,\n                null,\n                null\n        )\n\n        return cursor.use {\n            val contacts = Contacts(SOURCE_FACEBOOK, List(it.count, { index ->\n                it.moveToPosition(index)\n                createContactFrom(it)\n            }))\n            cache.addContacts(contacts)\n            return@use contacts\n        }\n    }\n\n    override val allContacts: Contacts\n        get() {\n            return queryAllContacts().apply {\n                cache.evictAll()\n                cache.addContacts(this)\n            }\n        }\n\n\n    private fun queryAllContacts(): Contacts {\n        val db = eventSQLHelper.readableDatabase\n        val cursor = db.rawQuery(\n                \"SELECT * FROM ${AnnualEventsContract.TABLE_NAME}\" +\n                        \" WHERE ${AnnualEventsContract.SOURCE} == ? \" +\n                        \" GROUP BY ${AnnualEventsContract.CONTACT_ID}\",\n                arrayOf(SOURCE_FACEBOOK.toString()))\n\n        return cursor.use {\n            return@use Contacts(SOURCE_FACEBOOK, List(it.count, { index ->\n                it.moveToPosition(index)\n                createContactFrom(it)\n            }))\n        }\n    }\n\n    companion object {\n\n        private const val IS_A_FACEBOOK_CONTACT = AnnualEventsContract.SOURCE + \"== \" + SOURCE_FACEBOOK\n\n        private fun createContactFrom(cursor: Cursor): Contact {\n            val uid = cursor.getLong(cursor.getColumnIndexOrThrow(AnnualEventsContract.CONTACT_ID))\n            val displayName = DisplayName.from(cursor.getString(cursor.getColumnIndexOrThrow(AnnualEventsContract.DISPLAY_NAME)))\n            val imagePath = FacebookImagePath.forUid(uid)\n            return Contact(uid, displayName, imagePath, SOURCE_FACEBOOK)\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/dailyreminder/AlarmManagerCompat.java",
    "content": "package com.alexstyl.specialdates.dailyreminder;\n\nimport android.app.AlarmManager;\nimport android.app.PendingIntent;\n\nimport com.alexstyl.android.Version;\n\npublic final class AlarmManagerCompat {\n    private final AlarmManager alarmManager;\n\n    public AlarmManagerCompat(AlarmManager alarmManager) {\n        this.alarmManager = alarmManager;\n    }\n\n    public void setExact(int type, long triggerAtmillis, PendingIntent operation) {\n        if (Version.INSTANCE.hasMarshmallow()) {\n            alarmManager.setAndAllowWhileIdle(type, triggerAtmillis, operation);\n        } else if (Version.INSTANCE.hasKitKat()) {\n            alarmManager.setExact(type, triggerAtmillis, operation);\n        } else {\n            alarmManager.set(AlarmManager.RTC, triggerAtmillis, operation);\n        }\n    }\n\n    public void cancel(PendingIntent pendingIntent) {\n        alarmManager.cancel(pendingIntent);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/dailyreminder/AndroidDailyReminderNotifier.kt",
    "content": "package com.alexstyl.specialdates.dailyreminder\n\nimport android.app.NotificationManager\nimport android.app.PendingIntent\nimport android.content.Context\nimport android.content.Intent\nimport android.graphics.Bitmap\nimport android.graphics.Canvas\nimport android.graphics.Color\nimport android.graphics.Paint\nimport android.graphics.PorterDuff\nimport android.graphics.PorterDuffXfermode\nimport android.graphics.Rect\nimport android.graphics.RectF\nimport android.provider.ContactsContract.Contacts.CONTENT_LOOKUP_URI\nimport android.support.v4.app.NotificationCompat\nimport com.alexstyl.android.Version\nimport com.alexstyl.resources.Colors\nimport com.alexstyl.specialdates.R\nimport com.alexstyl.specialdates.dailyreminder.actions.PersonActionsActivity\nimport com.alexstyl.specialdates.events.namedays.activity.NamedaysOnADayActivity\nimport com.alexstyl.specialdates.home.HomeActivity\nimport com.alexstyl.specialdates.images.ImageLoader\nimport com.alexstyl.specialdates.person.PersonActivity\nimport java.net.URI\n\n\nclass AndroidDailyReminderNotifier(private val context: Context,\n                                   private val notificationManager: NotificationManager,\n                                   private val imageLoader: ImageLoader,\n                                   private val colors: Colors) : DailyReminderNotifier {\n\n    override fun notifyFor(viewModel: DailyReminderViewModel) {\n        if (viewModel.contacts.isNotEmpty()) {\n            when {\n                supportsNotificationGroupping() -> {\n                    notifyContacts(viewModel.contacts)\n                    notifySummary(viewModel)\n                }\n                viewModel.contacts.size == 1 -> notifyContacts(viewModel.contacts)\n                else -> notifySummary(viewModel)\n            }\n        }\n\n        if (viewModel.namedays.isPresent) {\n            notifyNamedays(viewModel.namedays.get())\n        }\n        if (viewModel.bankHoliday.isPresent) {\n            notifyBankHolidays(viewModel.bankHoliday.get())\n        }\n    }\n\n    private fun supportsNotificationGroupping() = Version.hasOreo()\n\n    private fun notifyContacts(viewModels: List<ContactEventNotificationViewModel>) {\n        viewModels.forEach { viewModel ->\n            val requestCode = NotificationConstants.CHANNEL_ID_CONTACTS.hashCode() + viewModel.hashCode()\n            val startIntent = PersonActivity.buildIntentFor(context, viewModel.contact)\n            val pendingIntent = PendingIntent.getActivity(\n                    context,\n                    requestCode,\n                    startIntent,\n                    PendingIntent.FLAG_UPDATE_CURRENT)\n\n\n            val notification =\n                    NotificationCompat.Builder(context, NotificationConstants.CHANNEL_ID_CONTACTS)\n                            .setContentTitle(viewModel.title)\n                            .setContentText(viewModel.label)\n                            .setContentIntent(pendingIntent)\n                            .setActions(viewModel)\n                            .loadLargeImage(viewModel.contact.imagePath)\n                            .setSmallIcon(R.drawable.ic_stat_memento)\n                            .setColor(colors.getDailyReminderColor())\n                            .setGroup(NotificationConstants.DAILY_REMINDER_GROUP_ID)\n                            .setGroupAlertBehavior(NotificationCompat.GROUP_ALERT_SUMMARY)\n                            .setAutoCancel(true)\n                            .addPerson(CONTENT_LOOKUP_URI.buildUpon().appendPath(viewModel.contact.contactID.toString()).build().toString())\n                            .build()\n            notificationManager.notify(viewModel.notificationId, notification)\n        }\n    }\n\n    private fun notifySummary(viewModel: DailyReminderViewModel) {\n        val startIntent = HomeActivity.getStartIntent(context)\n        val requestCode = NotificationConstants.NOTIFICATION_ID_CONTACTS_SUMMARY\n        val pendingIntent = PendingIntent.getActivity(\n                context,\n                requestCode,\n                startIntent,\n                PendingIntent.FLAG_UPDATE_CURRENT)\n\n        val summary = viewModel.summaryViewModel\n\n        val notification =\n                NotificationCompat.Builder(context, NotificationConstants.CHANNEL_ID_CONTACTS)\n                        .setContentTitle(summary.title)\n                        .setContentText(summary.text)\n                        .setContentIntent(pendingIntent)\n                        .setSmallIcon(R.drawable.ic_stat_memento)\n                        .setColor(colors.getDailyReminderColor())\n                        .setGroupSummary(true)\n                        .setGroup(NotificationConstants.DAILY_REMINDER_GROUP_ID)\n                        .setInboxStyle(viewModel.summaryViewModel)\n                        .build()\n\n        notificationManager.notify(summary.notificationId, notification)\n    }\n\n    private fun notifyBankHolidays(bankHoliday: BankHolidayNotificationViewModel) {\n        val startIntent = HomeActivity.getStartIntent(context)\n        val requestCode = NotificationConstants.NOTIFICATION_ID_BANK_HOLIDAY\n        val pendingIntent = PendingIntent.getActivity(\n                context,\n                requestCode,\n                startIntent,\n                PendingIntent.FLAG_UPDATE_CURRENT)\n\n        val notification =\n                NotificationCompat.Builder(context, NotificationConstants.CHANNEL_ID_BANKHOLIDAY)\n                        .setContentTitle(bankHoliday.title)\n                        .setContentText(bankHoliday.label)\n                        .setContentIntent(pendingIntent)\n                        .setSmallIcon(R.drawable.ic_stat_bankholidays)\n                        .setColor(colors.getBankholidaysColor())\n                        .build()\n\n        notificationManager.notify(NotificationConstants.NOTIFICATION_ID_BANK_HOLIDAY, notification)\n    }\n\n    private fun notifyNamedays(namedays: NamedaysNotificationViewModel) {\n        val startIntent = NamedaysOnADayActivity.getStartIntent(context, namedays.date)\n        val requestCode = NotificationConstants.NOTIFICATION_ID_NAMEDAYS\n        val pendingIntent = PendingIntent.getActivity(\n                context,\n                requestCode,\n                startIntent,\n                PendingIntent.FLAG_UPDATE_CURRENT)\n\n        val notification =\n                NotificationCompat.Builder(context, NotificationConstants.CHANNEL_ID_NAMEDAYS)\n                        .setContentTitle(namedays.title)\n                        .setContentText(namedays.label)\n                        .setStyle(NotificationCompat.BigTextStyle().bigText(namedays.label))\n                        .setContentIntent(pendingIntent)\n                        .setSmallIcon(R.drawable.ic_stat_namedays)\n                        .setColor(colors.getNamedaysColor())\n                        .build()\n\n        notificationManager.notify(NotificationConstants.NOTIFICATION_ID_NAMEDAYS, notification)\n    }\n\n    override fun cancelAllEvents() {\n        notificationManager.cancel(NotificationConstants.NOTIFICATION_ID_CONTACTS_SUMMARY)\n        notificationManager.cancel(NotificationConstants.NOTIFICATION_ID_BANK_HOLIDAY)\n        notificationManager.cancel(NotificationConstants.NOTIFICATION_ID_NAMEDAYS)\n    }\n\n    private fun NotificationCompat.Builder.loadLargeImage(imagePath: URI): NotificationCompat.Builder = apply {\n        val width = context.resources.getDimensionPixelSize(android.R.dimen.notification_large_icon_width)\n        val height = context.resources.getDimensionPixelSize(android.R.dimen.notification_large_icon_height)\n        val bitmap =\n                imageLoader\n                        .load(imagePath)\n                        .withSize(width, height)\n                        .synchronously()\n        if (bitmap.isPresent) {\n            if (Version.hasLollipop()) {\n                setLargeIcon(bitmap.get().toCircle())\n            } else {\n                setLargeIcon(bitmap.get())\n            }\n        }\n    }\n\n    private fun Bitmap.toCircle(): Bitmap? {\n        val output = Bitmap.createBitmap(\n                this.width,\n                this.height,\n                Bitmap.Config.ARGB_8888\n        )\n        val canvas = Canvas(output)\n\n        val color = Color.RED\n        val paint = Paint()\n        val rect = Rect(0, 0, this.width, this.height)\n        val rectF = RectF(rect)\n\n        paint.isAntiAlias = true\n        canvas.drawARGB(0, 0, 0, 0)\n        paint.color = color\n        canvas.drawOval(rectF, paint)\n\n        paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)\n        canvas.drawBitmap(this, rect, rect, paint)\n\n        return output\n    }\n\n    private fun NotificationCompat.Builder.setActions(contactEventViewModel: ContactEventNotificationViewModel): NotificationCompat.Builder {\n        contactEventViewModel.actions.forEach { actionViewModel ->\n            val intent = buildIntentFor(actionViewModel, contactEventViewModel)\n            val pendingIntent = PendingIntent.getActivity(context, actionViewModel.id, intent, 0)\n            addAction(NotificationCompat.Action(0, actionViewModel.label, pendingIntent))\n        }\n        return this\n    }\n\n    private fun buildIntentFor(actionViewModel: ContactActionViewModel, contactEventViewModel: ContactEventNotificationViewModel): Intent =\n            when (actionViewModel.type) {\n                ActionType.CALL -> PersonActionsActivity.buildCallIntentFor(context, contactEventViewModel.contact)\n                ActionType.SEND_WISH -> PersonActionsActivity.buildSendIntentFor(context, contactEventViewModel.contact)\n            }\n}\n\nprivate fun NotificationCompat.Builder.setInboxStyle(viewModel: SummaryNotificationViewModel): NotificationCompat.Builder {\n    val inboxStyle = NotificationCompat.InboxStyle()\n    viewModel.lines.forEach { line ->\n        inboxStyle.addLine(line)\n    }\n    setStyle(inboxStyle)\n    return this\n}\n\n\n\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/dailyreminder/AndroidDailyReminderScheduler.kt",
    "content": "package com.alexstyl.specialdates.dailyreminder\n\nimport com.alexstyl.specialdates.TimeOfDay\nimport com.evernote.android.job.DailyJob\nimport com.evernote.android.job.JobManager\nimport com.evernote.android.job.JobRequest\nimport java.util.concurrent.TimeUnit\n\n\nclass AndroidDailyReminderScheduler : DailyReminderScheduler {\n\n    @JvmField\n    val ONE_HOUR = TimeUnit.HOURS.toMillis(1)\n\n    override fun scheduleReminderFor(timeOfDay: TimeOfDay) {\n        DailyJob.schedule(JobRequest.Builder(DailyReminderJob.TAG),\n                timeOfDay.toMillis(),\n                timeOfDay.toMillis() + ONE_HOUR\n        )\n    }\n\n    override fun cancelReminder() {\n        JobManager.instance().cancelAllForTag(DailyReminderJob.TAG)\n    }\n}\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/dailyreminder/AndroidDailyReminderViewModelFactory.kt",
    "content": "package com.alexstyl.specialdates.dailyreminder\n\nimport android.graphics.Typeface\nimport android.text.Spannable\nimport android.text.SpannableString\nimport android.text.SpannableStringBuilder\nimport android.text.style.ForegroundColorSpan\nimport android.text.style.StyleSpan\nimport com.alexstyl.resources.Colors\nimport com.alexstyl.specialdates.Strings\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.date.ContactEvent\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.events.bankholidays.BankHoliday\nimport com.alexstyl.specialdates.events.namedays.NamesInADate\nimport com.alexstyl.specialdates.events.peopleevents.StandardEventType\nimport com.alexstyl.specialdates.util.NaturalLanguageUtils\nimport java.net.URI\n\nclass AndroidDailyReminderViewModelFactory(private val strings: Strings,\n                                           private val todaysDate: Date,\n                                           private val colors: Colors)\n    : DailyReminderViewModelFactory {\n\n\n    override fun summaryOf(viewModels: List<ContactEventNotificationViewModel>): SummaryNotificationViewModel {\n        val contacts = viewModels.fold(emptyList<Contact>(), { list, viewModel ->\n            list + viewModel.contact\n        })\n\n        val title = NaturalLanguageUtils.joinContacts(strings, contacts, MAX_CONTACTS)\n        val label = strings.dontForgetToSendWishes()\n\n        val lines = arrayListOf<CharSequence>()\n        viewModels.forEach { contactViewModel ->\n\n            val boldedTitle = SpannableString(\"${contactViewModel.title}\\t\\t${contactViewModel.label}\").apply {\n                setSpan(StyleSpan(Typeface.BOLD), 0, contactViewModel.title.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n            }\n\n            lines.add(boldedTitle)\n        }\n\n        val images = viewModels.fold(emptyList<URI>(), { list, viewModel ->\n            list + viewModel.contact.imagePath\n        })\n\n        return SummaryNotificationViewModel(\n                NotificationConstants.NOTIFICATION_ID_CONTACTS_SUMMARY,\n                title, label, lines, images\n        )\n    }\n\n    override fun viewModelFor(contact: Contact, events: List<ContactEvent>): ContactEventNotificationViewModel {\n        val stringBuilder = SpannableStringBuilder()\n        events.forEach { contactEvent ->\n            val coloredLabel = SpannableString(contactEvent.getLabel(todaysDate, strings) + \" \" + emojiFor(contactEvent)).apply {\n                setSpan(ForegroundColorSpan(colors.getColorFor(contactEvent.type)), 0, this.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n            }\n            if (stringBuilder.isNotEmpty()) {\n                stringBuilder.append(\", \")\n            }\n            stringBuilder.append(coloredLabel)\n        }\n\n        return ContactEventNotificationViewModel(events.hashCode(),\n                contact,\n                contact.displayName.toString(),\n                stringBuilder,\n                emptyList() // TODO feature coming from the notification_actions branch\n        )\n    }\n\n    private fun emojiFor(contactEvent: ContactEvent): CharSequence =\n            when (contactEvent.type) {\n                StandardEventType.BIRTHDAY -> \"🍰\"\n                StandardEventType.NAMEDAY -> \"🎈\"\n                StandardEventType.ANNIVERSARY -> \"💍\"\n                StandardEventType.OTHER -> \"🌸\"\n                else -> \"\"\n            }\n\n    override fun viewModelFor(namedays: NamesInADate): NamedaysNotificationViewModel {\n        return NamedaysNotificationViewModel(namedays.date,\n                strings.todaysNamedays(namedays.getNames().size),\n                namedays.getNames().joinToString(\", \"))\n    }\n\n    override fun viewModelFor(bankHoliday: BankHoliday): BankHolidayNotificationViewModel =\n            BankHolidayNotificationViewModel(bankHoliday.holidayName, strings.bankholidaySubtitle())\n\n\n    companion object {\n        private const val MAX_CONTACTS = 3\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/dailyreminder/DailyReminderDebugPreferences.java",
    "content": "package com.alexstyl.specialdates.dailyreminder;\n\nimport android.content.Context;\nimport android.support.v4.util.Pair;\n\nimport com.alexstyl.specialdates.EasyPreferences;\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.date.MonthInt;\nimport com.alexstyl.specialdates.date.Months;\n\npublic final class DailyReminderDebugPreferences {\n\n    private final EasyPreferences preferences;\n\n    public static DailyReminderDebugPreferences newInstance(Context context) {\n        return new DailyReminderDebugPreferences(EasyPreferences.createForPrivatePreferences(context, R.string.pref_dailyreminder_debug));\n    }\n\n    private DailyReminderDebugPreferences(EasyPreferences preferences) {\n        this.preferences = preferences;\n    }\n\n    @SuppressWarnings(\"magicNumber\")\n    public Date getSelectedDate() {\n        int dayOfMonth = preferences.getInt(R.string.key_debug_daily_reminder_date_fake_day, 1);\n        @MonthInt int month = preferences.getInt(R.string.key_debug_daily_reminder_date_fake_month, Months.JANUARY);\n        int year = preferences.getInt(R.string.key_debug_daily_reminder_date_fake_year, 2016);\n        return Date.Companion.on(dayOfMonth, month, year);\n    }\n\n    boolean isFakeDateEnabled() {\n        return preferences.getBoolean(R.string.key_debug_daily_reminder_date_enable, false);\n    }\n\n    public void setSelectedDate(int dayOfMonth, int month, int year) {\n        Pair<Integer, Integer> dayPair = new Pair<>(R.string.key_debug_daily_reminder_date_fake_day, dayOfMonth);\n        Pair<Integer, Integer> monthPair = new Pair<>(R.string.key_debug_daily_reminder_date_fake_month, month);\n        Pair<Integer, Integer> yearPair = new Pair<>(R.string.key_debug_daily_reminder_date_fake_year, year);\n        //noinspection unchecked\n        preferences.setIntegers(dayPair, monthPair, yearPair);\n    }\n\n    public void setEnabled(boolean newValue) {\n        preferences.setBoolean(R.string.key_debug_daily_reminder_date_enable, newValue);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/dailyreminder/DailyReminderJob.kt",
    "content": "package com.alexstyl.specialdates.dailyreminder\n\nimport com.evernote.android.job.DailyJob\n\nclass DailyReminderJob(private val presenter: DailyReminderPresenter,\n                       private val notifier: DailyReminderNotifier) : DailyJob() {\n\n    companion object {\n        const val TAG = \"Daily_reminder\"\n    }\n\n    override fun onRunDailyJob(params: Params): DailyJobResult {\n        val view = NotificationDailyReminderView(notifier)\n        presenter.startPresentingInto(view)\n        presenter.stopPresenting()\n        return DailyJobResult.SUCCESS\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/dailyreminder/DailyReminderModule.java",
    "content": "package com.alexstyl.specialdates.dailyreminder;\n\nimport android.app.NotificationManager;\nimport android.content.Context;\n\nimport com.alexstyl.Logger;\nimport com.alexstyl.resources.Colors;\nimport com.alexstyl.specialdates.CrashAndErrorTracker;\nimport com.alexstyl.specialdates.EasyPreferences;\nimport com.alexstyl.specialdates.Strings;\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.events.bankholidays.BankHolidayProvider;\nimport com.alexstyl.specialdates.events.bankholidays.BankHolidaysUserSettings;\nimport com.alexstyl.specialdates.events.namedays.NamedayUserSettings;\nimport com.alexstyl.specialdates.events.namedays.calendar.resource.NamedayCalendarProvider;\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsProvider;\nimport com.alexstyl.specialdates.images.ImageLoader;\nimport com.alexstyl.specialdates.permissions.MementoPermissions;\nimport com.alexstyl.specialdates.settings.DailyReminderNavigator;\n\nimport dagger.Module;\nimport dagger.Provides;\n\n@Module\npublic class DailyReminderModule {\n\n    @Provides\n    DailyReminderUserSettings settings(Context context) {\n        EasyPreferences defaultPreferences = EasyPreferences.createForDefaultPreferences(context);\n        return new DailyReminderPreferences(defaultPreferences);\n    }\n\n    @Provides\n    DailyReminderViewModelFactory factory(Strings strings, Colors colors) {\n        return new AndroidDailyReminderViewModelFactory(strings, Date.Companion.today(), colors);\n    }\n\n    @Provides\n    DailyReminderPresenter presenter(MementoPermissions permissions,\n                                     PeopleEventsProvider peopleEventsProvider,\n                                     NamedayUserSettings namedaySettings,\n                                     BankHolidaysUserSettings bankholidaySettings,\n                                     NamedayCalendarProvider namedayCalendarProvider,\n                                     DailyReminderViewModelFactory factory,\n                                     CrashAndErrorTracker errorTracker,\n                                     BankHolidayProvider bankHolidayProvider) {\n        return new DailyReminderPresenter(\n                permissions,\n                peopleEventsProvider,\n                namedaySettings,\n                bankholidaySettings,\n                namedayCalendarProvider,\n                factory,\n                errorTracker,\n                bankHolidayProvider\n        );\n    }\n\n    @Provides\n    DailyReminderNotifier notifier(Context context,\n                                   ImageLoader imageLoader,\n                                   Colors colors,\n                                   NotificationManager notificationManager) {\n        return new AndroidDailyReminderNotifier(context, notificationManager, imageLoader, colors);\n    }\n\n    @Provides\n    DailyReminderOreoChannelCreator channelCreator(NotificationManager notificationManager,\n                                                   Strings strings,\n                                                   Logger logger,\n                                                   DailyReminderUserSettings preferences) {\n        return new DailyReminderOreoChannelCreator(notificationManager, strings, preferences, logger);\n    }\n\n    @Provides\n    DailyReminderNavigator navigator() {\n        return new DailyReminderNavigator();\n    }\n\n    @Provides\n    DailyReminderScheduler scheduler() {\n        return new AndroidDailyReminderScheduler();\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/dailyreminder/DailyReminderOreoChannelCreator.kt",
    "content": "package com.alexstyl.specialdates.dailyreminder\n\nimport android.annotation.TargetApi\nimport android.app.NotificationChannel\nimport android.app.NotificationChannelGroup\nimport android.app.NotificationManager\nimport android.graphics.Color\nimport android.media.AudioAttributes\nimport android.os.Build\nimport com.alexstyl.Logger\nimport com.alexstyl.android.Version\nimport com.alexstyl.android.toUri\nimport com.alexstyl.specialdates.Strings\n\n@TargetApi(Build.VERSION_CODES.O)\nclass DailyReminderOreoChannelCreator(private val notificationManager: NotificationManager,\n                                      private val strings: Strings,\n                                      private val dailyReminderPreferences: DailyReminderUserSettings,\n                                      private val logger: Logger) {\n\n\n    fun createDailyReminderChannel() {\n        if (!Version.hasOreo()) {\n            return\n        }\n\n        val group = NotificationChannelGroup(NotificationConstants.DAILY_REMINDER_GROUP_ID, strings.dailyReminder())\n        if (notificationManager.notificationChannelGroups.contains(group)) {\n            logger.warning(\"Already contains Group '${group.name}'. Won't create new channels [$group]\")\n            return\n        }\n        notificationManager.createNotificationChannelGroup(group)\n\n        createContactsChannel()\n        createNamedayChannel()\n        createBankHolidayChannel()\n    }\n\n    private fun createContactsChannel() {\n        val contactsChannel = NotificationChannel(\n                NotificationConstants.CHANNEL_ID_CONTACTS,\n                strings.contacts(),\n                NotificationManager.IMPORTANCE_DEFAULT)\n\n        contactsChannel.group = NotificationConstants.DAILY_REMINDER_GROUP_ID\n        contactsChannel.enableLights(true)\n        contactsChannel.lightColor = Color.RED\n        contactsChannel.enableVibration(dailyReminderPreferences.isVibrationEnabled())\n        contactsChannel.setSound(dailyReminderPreferences.getRingtone().toUri(), AudioAttributes.Builder()\n                .setUsage(AudioAttributes.USAGE_NOTIFICATION)\n                .build())\n\n        notificationManager.createNotificationChannel(contactsChannel)\n    }\n\n    private fun createNamedayChannel() {\n        val namedaysChannel = NotificationChannel(\n                NotificationConstants.CHANNEL_ID_NAMEDAYS,\n                strings.namedays(),\n                NotificationManager.IMPORTANCE_LOW)\n\n        namedaysChannel.group = NotificationConstants.DAILY_REMINDER_GROUP_ID\n        namedaysChannel.enableLights(false)\n        namedaysChannel.enableVibration(dailyReminderPreferences.isVibrationEnabled())\n        namedaysChannel.setSound(dailyReminderPreferences.getRingtone().toUri(), AudioAttributes.Builder()\n                .setUsage(AudioAttributes.USAGE_NOTIFICATION)\n                .build())\n        notificationManager.createNotificationChannel(namedaysChannel)\n    }\n\n    private fun createBankHolidayChannel() {\n        val bankHolidaysChannel = NotificationChannel(\n                NotificationConstants.CHANNEL_ID_BANKHOLIDAY,\n                strings.bankholidays(),\n                NotificationManager.IMPORTANCE_LOW)\n\n        bankHolidaysChannel.group = NotificationConstants.DAILY_REMINDER_GROUP_ID\n        bankHolidaysChannel.enableLights(false)\n        bankHolidaysChannel.enableVibration(dailyReminderPreferences.isVibrationEnabled())\n        bankHolidaysChannel.setSound(dailyReminderPreferences.getRingtone().toUri(), AudioAttributes.Builder()\n                .setUsage(AudioAttributes.USAGE_NOTIFICATION)\n                .build())\n        notificationManager.createNotificationChannel(bankHolidaysChannel)\n\n    }\n}\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/dailyreminder/DailyReminderPreferences.kt",
    "content": "package com.alexstyl.specialdates.dailyreminder\n\nimport android.media.RingtoneManager\nimport android.net.Uri\nimport com.alexstyl.specialdates.EasyPreferences\nimport com.alexstyl.specialdates.R\nimport com.alexstyl.specialdates.TimeOfDay\nimport java.net.URI\n\nclass DailyReminderPreferences(private val preferences: EasyPreferences)\n    : DailyReminderUserSettings {\n\n    override fun setEnabled(isEnabled: Boolean) {\n        preferences.setBoolean(R.string.key_daily_reminder, isEnabled)\n    }\n\n    override fun isEnabled(): Boolean = preferences.getBoolean(R.string.key_daily_reminder, true)\n\n    override fun getTimeSet(): TimeOfDay {\n        val time = preferences\n                .getString(R.string.key_daily_reminder_time, DEFAULT_DAILY_REMINDER_TIME)\n                .split(\":\")\n        return TimeOfDay(time[0].toInt(), time[1].toInt())\n\n    }\n\n\n    override fun getRingtone(): URI {\n        val selectedRingtone = preferences.getString(R.string.key_daily_reminder_ringtone, null)\n        return selectedRingtone?.toURI() ?: RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION).toURI()\n    }\n\n    override fun isVibrationEnabled(): Boolean = preferences.getBoolean(R.string.key_daily_reminder_vibrate_enabled, false)\n\n    override fun setDailyReminderTime(time: TimeOfDay) {\n        preferences.setString(R.string.key_daily_reminder_time, time.toString())\n    }\n\n\n    private fun Uri.toURI(): URI = this.toString().toURI()\n    private fun String.toURI(): URI = URI.create(this)\n\n    companion object {\n        private const val DEFAULT_DAILY_REMINDER_TIME = \"08:00\"\n    }\n}\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/dailyreminder/NoActions.kt",
    "content": "package com.alexstyl.specialdates.dailyreminder\n\nimport com.alexstyl.specialdates.person.ContactActions\nimport java.net.URI\n\nclass NoActions : ContactActions {\n    override fun dial(phoneNumber: String) = {\n        // do nothing\n    }\n\n    override fun view(data: URI, mimetype: String) = {\n        // do nothing\n    }\n\n    override fun view(data: URI) = {\n        // do nothing\n    }\n\n    override fun message(phoneNumber: String) = {\n        // do nothing\n    }\n\n    override fun email(emailAdress: String) = {\n        // do nothing\n    }\n\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (javaClass != other?.javaClass) return false\n        return true\n    }\n\n    override fun hashCode(): Int {\n        return javaClass.hashCode()\n    }\n\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/dailyreminder/NotificationConstants.kt",
    "content": "package com.alexstyl.specialdates.dailyreminder\n\nimport com.alexstyl.specialdates.BuildConfig\n\nobject NotificationConstants {\n    const val CHANNEL_ID_CONTACTS = BuildConfig.APPLICATION_ID + \".channel.contacts\"\n    const val CHANNEL_ID_NAMEDAYS = BuildConfig.APPLICATION_ID + \".channel.namedays\"\n    const val CHANNEL_ID_BANKHOLIDAY = BuildConfig.APPLICATION_ID + \".channel.bankholiday\"\n\n    const val NOTIFICATION_ID_CONTACTS_SUMMARY: Int = 4001\n    const val NOTIFICATION_ID_NAMEDAYS = 4002\n    const val NOTIFICATION_ID_BANK_HOLIDAY = 4003\n\n    const val DAILY_REMINDER_GROUP_ID = BuildConfig.APPLICATION_ID + \".group.daily_reminder\"\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/dailyreminder/NotificationDailyReminderView.kt",
    "content": "package com.alexstyl.specialdates.dailyreminder\n\nclass NotificationDailyReminderView(private val notifier: DailyReminderNotifier)\n    : DailyReminderView {\n\n    override fun show(viewModel: DailyReminderViewModel) {\n        notifier.notifyFor(viewModel)\n    }\n}\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/dailyreminder/actions/AndroidContactActionsView.kt",
    "content": "package com.alexstyl.specialdates.dailyreminder.actions\n\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.person.ContactActionViewModel\nimport com.alexstyl.specialdates.person.ContactActionsAdapter\n\nclass AndroidContactActionsView(private val contact: Contact,\n                                private val recyclerView: ContactActionsAdapter)\n    : ContactActionsView {\n\n    override fun display(viewModels: List<ContactActionViewModel>) {\n        recyclerView.displayCallMethods(viewModels)\n    }\n\n    override fun contact(): Contact = contact\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/dailyreminder/actions/ContactActionsModule.java",
    "content": "package com.alexstyl.specialdates.dailyreminder.actions;\n\nimport com.alexstyl.specialdates.CrashAndErrorTracker;\nimport com.alexstyl.specialdates.contact.ContactIntentExtractor;\nimport com.alexstyl.specialdates.contact.ContactsProvider;\nimport com.alexstyl.specialdates.person.ContactActionsProvider;\n\nimport dagger.Module;\nimport dagger.Provides;\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.schedulers.Schedulers;\n\n@Module\npublic class ContactActionsModule {\n\n    @Provides\n    ContactActionsPresenter presenter(ContactActionsProvider personActionsProvider) {\n        return new ContactActionsPresenter(personActionsProvider, Schedulers.io(), AndroidSchedulers.mainThread());\n    }\n\n    @Provides\n    ContactIntentExtractor extractor(CrashAndErrorTracker tracker, ContactsProvider contactProvider) {\n        return new ContactIntentExtractor(tracker, contactProvider);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/dailyreminder/actions/ContactActionsPresenter.kt",
    "content": "package com.alexstyl.specialdates.dailyreminder.actions\n\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.person.ContactActions\nimport com.alexstyl.specialdates.person.ContactActionsProvider\nimport io.reactivex.Observable\nimport io.reactivex.Scheduler\nimport io.reactivex.disposables.Disposable\n\nclass ContactActionsPresenter(\n        private val personActionsProvider: ContactActionsProvider,\n        private val workScheduler: Scheduler,\n        private val resultScheduler: Scheduler) {\n\n    private var disposable: Disposable? = null\n\n    fun startPresentingCallsInto(view: ContactActionsView, contactActions: ContactActions) {\n        disposable =\n                callActionsFor(contactActions, view.contact())\n                        .observeOn(resultScheduler)\n                        .subscribeOn(workScheduler)\n                        .subscribe { viewModels ->\n                            view.display(viewModels)\n                        }\n\n    }\n\n    private fun callActionsFor(contactActions: ContactActions, contact: Contact) =\n            Observable.fromCallable { personActionsProvider.callActionsFor(contact, contactActions) }\n\n    fun startPresentingMessagingInto(view: ContactActionsView, contactActions: ContactActions) {\n        disposable =\n                messagingActionsFor(contactActions, view.contact())\n                        .observeOn(resultScheduler)\n                        .subscribeOn(workScheduler)\n                        .subscribe { viewModels ->\n                            view.display(viewModels)\n                        }\n\n    }\n\n    private fun messagingActionsFor(contactActions: ContactActions, contact: Contact) =\n            Observable.fromCallable { personActionsProvider.messagingActionsFor(contact, contactActions) }\n\n    fun stopPresenting() {\n        disposable?.dispose()\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/dailyreminder/actions/ContactActionsView.kt",
    "content": "package com.alexstyl.specialdates.dailyreminder.actions\n\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.person.ContactActionViewModel\n\ninterface ContactActionsView {\n    fun display(viewModels: List<ContactActionViewModel>)\n    fun contact(): Contact\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/dailyreminder/actions/PersonActionsActivity.kt",
    "content": "package com.alexstyl.specialdates.dailyreminder.actions\n\nimport android.content.Context\nimport android.content.Intent\nimport android.content.Intent.ACTION_CALL\nimport android.content.Intent.ACTION_SENDTO\nimport android.os.Bundle\nimport android.support.v7.widget.LinearLayoutManager\nimport android.support.v7.widget.RecyclerView\nimport com.alexstyl.specialdates.CrashAndErrorTracker\nimport com.alexstyl.specialdates.MementoApplication\nimport com.alexstyl.specialdates.R\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.contact.ContactIntentExtractor\nimport com.alexstyl.specialdates.person.AndroidContactActions\nimport com.alexstyl.specialdates.person.ContactActionsAdapter\nimport com.alexstyl.specialdates.ui.base.ThemedMementoActivity\nimport javax.inject.Inject\n\nclass PersonActionsActivity : ThemedMementoActivity() {\n\n    var presenter: ContactActionsPresenter? = null\n        @Inject set\n    var extractor: ContactIntentExtractor? = null\n        @Inject set\n    var errorTracker: CrashAndErrorTracker? = null\n        @Inject set\n\n    var view: ContactActionsView? = null\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_call)\n\n        (application as MementoApplication).applicationModule.inject(this)\n\n        val recyclerView = findViewById<RecyclerView>(R.id.actions_list)!!\n        recyclerView.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, false)\n        val adapter = ContactActionsAdapter {\n            it.action.run()\n            finish()\n        }\n        recyclerView.adapter = adapter\n        val contact = extractor?.getContactExtra(intent)\n        if (contact != null && contact.isPresent) {\n            view = AndroidContactActionsView(contact.get(), adapter)\n        } else {\n            errorTracker?.track(RuntimeException(\"Tried to load the actions for a contact from $intent\"))\n            finish()\n        }\n\n    }\n\n    override fun onStart() {\n        super.onStart()\n        if (view != null) {\n            startPresentingInto(view!!)\n        }\n    }\n\n    private fun startPresentingInto(view: ContactActionsView) {\n        val action = AndroidContactActions(this)\n        when {\n            intent.action == ACTION_CALL -> presenter?.startPresentingCallsInto(view, action)\n            intent.action == ACTION_SENDTO -> presenter?.startPresentingMessagingInto(view, action)\n            else -> {\n            }\n        }\n    }\n\n    override fun onStop() {\n        super.onStop()\n        presenter?.stopPresenting()\n    }\n\n\n    companion object {\n\n        fun buildCallIntentFor(context: Context, contact: Contact): Intent {\n            return Intent(context, PersonActionsActivity::class.java)\n                    .setAction(ACTION_CALL)\n                    .putContactExtra(contact)\n        }\n\n        fun buildSendIntentFor(context: Context, contact: Contact): Intent {\n            return Intent(context, PersonActionsActivity::class.java)\n                    .setAction(ACTION_SENDTO)\n                    .putContactExtra(contact)\n        }\n\n        private fun Intent.putContactExtra(contact: Contact): Intent {\n            return putExtra(ContactIntentExtractor.EXTRA_CONTACT_ID, contact.contactID)\n                    .putExtra(ContactIntentExtractor.EXTRA_CONTACT_SOURCE, contact.source)\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/date/AndroidDateLabelCreator.kt",
    "content": "package com.alexstyl.specialdates.date\n\nimport android.content.Context\nimport android.text.format.DateUtils\n\nclass AndroidDateLabelCreator(private val context: Context) : DateLabelCreator {\n    override fun createLabelWithoutYear(date: Date): String {\n        val formatFlags = DateUtils.FORMAT_SHOW_DATE or DateUtils.FORMAT_NO_YEAR\n        return DateUtils.formatDateTime(context, date.toMillis(), formatFlags)\n    }\n\n    override fun createWithYearPreferred(date: Date): String {\n        return if (date.hasYear()) {\n            val formatFlags = DateUtils.FORMAT_SHOW_DATE or DateUtils.FORMAT_SHOW_YEAR\n            DateUtils.formatDateTime(context, date.toMillis(), formatFlags)\n        } else {\n            val formatFlags = DateUtils.FORMAT_SHOW_DATE or DateUtils.FORMAT_NO_YEAR\n            DateUtils.formatDateTime(context, date.toMillis(), formatFlags)\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/date/DateModule.java",
    "content": "package com.alexstyl.specialdates.date;\n\nimport android.content.Context;\n\nimport com.alexstyl.specialdates.CrashAndErrorTracker;\n\nimport javax.inject.Singleton;\n\nimport dagger.Module;\nimport dagger.Provides;\n\n@Module\n@Singleton\npublic class DateModule {\n\n    @Provides\n    @Singleton\n    DateLabelCreator labelCreator(Context context) {\n        return new AndroidDateLabelCreator(context);\n    }\n\n    @Provides\n    DateParser dateParser(CrashAndErrorTracker errorTracker) {\n        return new DateParser(errorTracker);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/donate/AndroidDonation.java",
    "content": "package com.alexstyl.specialdates.donate;\n\nenum AndroidDonation implements Donation {\n    SKU_DONATE_1(\"1€\", \"donate_1\"),\n    SKU_DONATE_2(\"3€\", \"donate_2\"),\n    SKU_DONATE_3(\"5€\", \"donate_3\"),\n    SKU_DONATE_4(\"8€\", \"donate_4\"),\n    SKU_DONATE_5(\"10€\", \"donate_5\"),\n    SKU_DONATE_6(\"15€\", \"donate_6\"),\n    SKU_DONATE_7(\"20€\", \"donate_7\");\n\n    private final String priceLabel;\n    private final String identifier;\n\n    AndroidDonation(String priceLabel, String identifier) {\n        this.priceLabel = priceLabel;\n        this.identifier = identifier;\n    }\n\n    @Override\n    public String getAmount() {\n        return priceLabel;\n    }\n\n    @Override\n    public String getIdentifier() {\n        return identifier;\n    }\n\n    public static Donation valueOfIndex(int index) {\n        return values()[index];\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/donate/AndroidDonationConstants.java",
    "content": "package com.alexstyl.specialdates.donate;\n\npublic final class AndroidDonationConstants {\n\n    private AndroidDonationConstants() {\n        // hide this\n    }\n\n    public static final String PUBLIC_KEY =\n            \"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsYY0f8jTzL1RkaxI6RgasYZ1anbjHo3uOrSecriRJdQtTtiynmnjSqg0mh79gJunqbqtJtQQaFYo\"\n                    + \"wm1D5uTWkZ30CmZqrKAz8PILbF7andUNECZRuUENfsptHhaBQHYcDucXLP2QDuerEaYPcBW4kQoyv4Jyfm/\"\n                    + \"vDou04VwMADcFQ4vZ/Rj6tvt+KNXvMbJorQslDSmA3Ul+oDqDJ1K0TFPFOv3ECjuw+J/g0TX6yAcS9LR8xHVppWE9fW0+qPWd2tT\"\n                    + \"o0CIb3W3h+lgREkDZEGRlWvGijWmND7qFbhCv2jURen851trNSLIvyOQwraCVku6VkxSxwCeS2E26q7B5mQIDAQAB\";\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/donate/AndroidDonationService.java",
    "content": "package com.alexstyl.specialdates.donate;\n\nimport android.app.Activity;\nimport android.widget.Toast;\n\nimport com.alexstyl.specialdates.CrashAndErrorTracker;\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.analytics.Analytics;\nimport com.alexstyl.specialdates.donate.util.IabHelper;\nimport com.alexstyl.specialdates.donate.util.IabResult;\nimport com.alexstyl.specialdates.donate.util.Inventory;\nimport com.alexstyl.specialdates.donate.util.Purchase;\n\npublic class AndroidDonationService implements DonationService {\n\n    private final IabHelper iabHelper;\n    private final Activity activity;\n    private final DonationPreferences donationPreferences;\n    private final Analytics analytics;\n    private final CrashAndErrorTracker tracker;\n    private final DonateMonitor monitor;\n\n    private DonationCallbacks listener;\n\n    public AndroidDonationService(IabHelper iabHelper,\n                                  Activity activity,\n                                  DonationPreferences donationPreferences,\n                                  Analytics analytics,\n                                  CrashAndErrorTracker tracker,\n                                  DonateMonitor monitor) {\n        this.iabHelper = iabHelper;\n        this.activity = activity;\n        this.donationPreferences = donationPreferences;\n        this.analytics = analytics;\n        this.tracker = tracker;\n        this.monitor = monitor;\n    }\n\n    @Override\n    public void setup(final DonationCallbacks listener) {\n        this.listener = listener;\n        iabHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {\n            @Override\n            public void onIabSetupFinished(IabResult result) {\n                if (result.isFailure()) {\n                    listener.onDonateException(result.getMessage());\n                }\n            }\n        });\n    }\n\n    @Override\n    public void placeDonation(final Donation donation, int requestCode) {\n        try {\n            iabHelper.launchPurchaseFlow(\n                    activity, donation.getIdentifier(), requestCode, new IabHelper.OnIabPurchaseFinishedListener() {\n                        @Override\n                        public void onIabPurchaseFinished(IabResult result, Purchase info) {\n                            if (result.isSuccess()) {\n                                analytics.trackDonationPlaced(donation);\n                                listener.onDonationFinished(donation);\n                                donationPreferences.markAsDonated();\n                            }\n                        }\n                    }\n            );\n        } catch (IabHelper.IabAsyncInProgressException e) {\n            tracker.track(e);\n            listener.onDonateException(e.getMessage());\n        }\n    }\n\n    @Override\n    public void dispose() {\n        try {\n            iabHelper.dispose();\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n\n    @Override\n    public void restoreDonations() {\n        try {\n            iabHelper.queryInventoryAsync(new IabHelper.QueryInventoryFinishedListener() {\n                @Override\n                public void onQueryInventoryFinished(IabResult result, Inventory inv) {\n                    boolean hasDonated = containsDonations(inv);\n                    if (hasDonated) {\n                        Toast.makeText(activity, R.string.donate_thanks_for_donating, Toast.LENGTH_SHORT).show();\n                        donationPreferences.markAsDonated();\n                        monitor.onDonationUpdated();\n                        analytics.trackDonationRestored();\n                    } else {\n                        Toast.makeText(activity, R.string.donate_no_donation_found, Toast.LENGTH_SHORT).show();\n                    }\n                }\n\n            });\n        } catch (IabHelper.IabAsyncInProgressException e) {\n            tracker.track(e);\n        }\n    }\n\n    private static boolean containsDonations(Inventory inventory) {\n        for (AndroidDonation donation : AndroidDonation.values()) {\n            if (inventory.hasPurchase(donation.getIdentifier())) {\n                return true;\n            }\n        }\n        return false;\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/donate/DonateActivity.java",
    "content": "package com.alexstyl.specialdates.donate;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.support.design.widget.AppBarLayout;\nimport android.support.design.widget.CoordinatorLayout;\nimport android.support.v4.widget.NestedScrollView;\nimport android.support.v7.widget.Toolbar;\nimport android.view.View;\nimport android.widget.Button;\nimport android.widget.ImageView;\nimport android.widget.SeekBar;\nimport android.widget.Toast;\n\nimport com.alexstyl.android.Version;\nimport com.alexstyl.specialdates.AppComponent;\nimport com.alexstyl.specialdates.CrashAndErrorTracker;\nimport com.alexstyl.specialdates.MementoApplication;\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.Strings;\nimport com.alexstyl.specialdates.TextViewLabelSetter;\nimport com.alexstyl.specialdates.analytics.Analytics;\nimport com.alexstyl.specialdates.donate.util.IabHelper;\nimport com.alexstyl.specialdates.images.ImageLoader;\nimport com.alexstyl.specialdates.ui.LolipopHideStatusBarListener;\nimport com.alexstyl.specialdates.ui.base.MementoActivity;\nimport com.novoda.notils.caster.Views;\n\nimport javax.inject.Inject;\nimport java.net.URI;\n\npublic class DonateActivity extends MementoActivity {\n\n    private static final int REQUEST_CODE = 1004;\n    private static final int SCROLL_DOWN_ANIMATION_DELAY = 2000;\n    private static final URI DEV_IMAGE_URI = URI.create(\"http://alexstyl.com/memento-calendar/dev.jpg\");\n    private static final int VELOCITY_Y = 50;\n\n    private DonatePresenter donatePresenter;\n    private SeekBar donateBar;\n    private CoordinatorLayout coordinator;\n\n    @Inject Analytics analytics;\n    @Inject Strings strings;\n    @Inject ImageLoader imageLoader;\n    @Inject IabHelper iabHelper;\n    @Inject DonationPreferences donationPreferences;\n    @Inject CrashAndErrorTracker tracker;\n    @Inject DonateMonitor monitor;\n    @Inject DonateMonitor donateMonitor;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        setContentView(R.layout.activity_donate);\n\n        AppComponent applicationModule = ((MementoApplication) getApplication()).getApplicationModule();\n        applicationModule.inject(this);\n\n        Toolbar toolbar = Views.findById(this, R.id.toolbar);\n        setSupportActionBar(toolbar);\n\n        coordinator = Views.findById(this, R.id.donate_coordinator);\n        ImageView avatar = Views.findById(this, R.id.donate_avatar);\n        imageLoader\n                .load(DEV_IMAGE_URI)\n                .into(avatar);\n\n        final AppBarLayout appBarLayout = Views.findById(this, R.id.app_bar_layout);\n        final NestedScrollView scrollView = Views.findById(this, R.id.scroll);\n\n        if (Version.INSTANCE.hasLollipop()) {\n            appBarLayout.addOnOffsetChangedListener(new LolipopHideStatusBarListener(getWindow()));\n        }\n\n        DonationService donationService = new AndroidDonationService(iabHelper, this, donationPreferences, analytics, tracker, donateMonitor);\n        final Button donateButton = Views.findById(this, R.id.donate_place_donation);\n        donateButton.requestFocus();\n\n        donatePresenter = new DonatePresenter(analytics, donationService, new TextViewLabelSetter(donateButton), strings);\n        donateButton.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Donation donation = AndroidDonation.valueOfIndex(donateBar.getProgress());\n                donatePresenter.placeDonation(donation, REQUEST_CODE);\n            }\n        });\n        setupDonateBar();\n\n        donatePresenter.startPresenting(donationCallbacks());\n\n        scrollView.postDelayed(new Runnable() {\n            @Override\n            public void run() {\n                scrollToDonate();\n            }\n\n            private void scrollToDonate() {\n                CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();\n                AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();\n                behavior.onNestedFling(coordinator, appBarLayout, null, 0, VELOCITY_Y, true);\n            }\n        }, SCROLL_DOWN_ANIMATION_DELAY);\n\n    }\n\n    private void setupDonateBar() {\n        donateBar = Views.findById(this, R.id.donation_bar);\n        donateBar.setOnSeekBarChangeListener(new SimpleOnSeekBarChangeListener() {\n            @Override\n            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {\n                String amount = AndroidDonation.valueOfIndex(progress).getAmount();\n                donatePresenter.displaySelectedDonation(amount);\n            }\n        });\n        AndroidDonation[] values = AndroidDonation.values();\n        donateBar.setProgress(1);\n        donateBar.setMax(values.length - 1);\n    }\n\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n        donatePresenter.stopPresenting();\n    }\n\n    private DonationCallbacks donationCallbacks() {\n        return new DonationCallbacks() {\n\n            @Override\n            public void onDonateException(String message) {\n                tracker.track(new RuntimeException(message));\n                finish();\n            }\n\n            @Override\n            public void onDonationFinished(Donation donation) {\n                monitor.onDonationUpdated();\n\n                Toast.makeText(DonateActivity.this, R.string.donate_thanks_for_donating, Toast.LENGTH_SHORT).show();\n                setResult(RESULT_OK);\n                finish();\n            }\n        };\n    }\n\n    public static Intent createIntent(Context context) {\n        return new Intent(context, DonateActivity.class);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/donate/DonateModule.java",
    "content": "package com.alexstyl.specialdates.donate;\n\nimport android.content.Context;\n\nimport com.alexstyl.specialdates.donate.util.IabHelper;\n\nimport javax.inject.Singleton;\n\nimport dagger.Module;\nimport dagger.Provides;\n\n@Module\npublic class DonateModule {\n\n    @Provides\n    IabHelper providesIabHelper(Context context) {\n        return new IabHelper(context, AndroidDonationConstants.PUBLIC_KEY);\n    }\n\n    @Provides\n    DonationPreferences providesDonationPreferences(Context context) {\n        return DonationPreferences.newInstance(context);\n    }\n\n\n    @Provides\n    @Singleton\n    DonateMonitor providesMonitor(){\n        return new DonateMonitor();\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/donate/DonatePresenter.java",
    "content": "package com.alexstyl.specialdates.donate;\n\nimport com.alexstyl.specialdates.Strings;\nimport com.alexstyl.specialdates.LabelSetter;\nimport com.alexstyl.specialdates.analytics.Analytics;\nimport com.alexstyl.specialdates.analytics.Screen;\n\nclass DonatePresenter {\n\n    private final Analytics analytics;\n    private final DonationService donationService;\n    private final LabelSetter donateButtonLabel;\n    private final Strings strings;\n\n    DonatePresenter(Analytics analytics,\n                    DonationService donationService,\n                    LabelSetter donateButtonLabel,\n                    Strings strings) {\n        this.analytics = analytics;\n        this.donationService = donationService;\n        this.donateButtonLabel = donateButtonLabel;\n        this.strings = strings;\n    }\n\n    void displaySelectedDonation(String amount) {\n        donateButtonLabel.setLabel(strings.donateAmount(amount));\n    }\n\n    void startPresenting(DonationCallbacks donationCallbacks) {\n        analytics.trackScreen(Screen.DONATE);\n        donationService.setup(donationCallbacks);\n    }\n\n    void placeDonation(Donation donation, int requestCode) {\n        donationService.placeDonation(donation, requestCode);\n        analytics.trackDonationStarted(donation);\n    }\n\n    void stopPresenting() {\n        donationService.dispose();\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/donate/DonationPreferences.java",
    "content": "package com.alexstyl.specialdates.donate;\n\nimport android.content.Context;\n\nimport com.alexstyl.specialdates.EasyPreferences;\nimport com.alexstyl.specialdates.R;\n\npublic final class DonationPreferences {\n\n    private final EasyPreferences preferences;\n\n    public static DonationPreferences newInstance(Context context) {\n        EasyPreferences preferences = EasyPreferences.createForDefaultPreferences(context);\n        return new DonationPreferences(preferences);\n    }\n\n    private DonationPreferences(EasyPreferences preferences) {\n        this.preferences = preferences;\n    }\n\n    void markAsDonated() {\n        preferences.setBoolean(R.string.key_has_donated, true);\n    }\n\n    public boolean hasDonated() {\n        return preferences.getBoolean(R.string.key_has_donated, false);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/donate/SimpleOnSeekBarChangeListener.java",
    "content": "package com.alexstyl.specialdates.donate;\n\nimport android.widget.SeekBar;\n\nclass SimpleOnSeekBarChangeListener implements SeekBar.OnSeekBarChangeListener {\n    @Override\n    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {\n        // do nothing\n    }\n\n    @Override\n    public void onStartTrackingTouch(SeekBar seekBar) {\n        // do nothing\n    }\n\n    @Override\n    public void onStopTrackingTouch(SeekBar seekBar) {\n        // do nothing\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/donate/util/IabBroadcastReceiver.java",
    "content": "/* Copyright (c) 2014 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.alexstyl.specialdates.donate.util;\n\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport android.content.Intent;\n\n/**\n * Receiver for the \"com.android.vending.billing.PURCHASES_UPDATED\" Action\n * from the Play Store.\n *\n * <p>It is possible that an in-app item may be acquired without the\n * application calling getBuyIntent(), for example if the item can be\n * redeemed from inside the Play Store using a promotional code. If this\n * application isn't running at the time, then when it is started a call\n * to getPurchases() will be sufficient notification. However, if the\n * application is already running in the background when the item is acquired,\n * a message to this BroadcastReceiver will indicate that the an item\n * has been acquired.</p>\n */\npublic class IabBroadcastReceiver extends BroadcastReceiver {\n    /**\n     * DonationCallbacks interface for received broadcast messages.\n     */\n    public interface IabBroadcastListener {\n        void receivedBroadcast();\n    }\n\n    /**\n     * The Intent action that this Receiver should filter for.\n     */\n    public static final String ACTION = \"com.android.vending.billing.PURCHASES_UPDATED\";\n\n    private final IabBroadcastListener mListener;\n\n    public IabBroadcastReceiver(IabBroadcastListener listener) {\n        mListener = listener;\n    }\n\n    @Override\n    public void onReceive(Context context, Intent intent) {\n        if (mListener != null) {\n            mListener.receivedBroadcast();\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/donate/util/IabException.java",
    "content": "/* Copyright (c) 2012 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.alexstyl.specialdates.donate.util;\n\n/**\n * Exception thrown when something went wrong with in-app billing.\n * An IabException has an associated IabResult (an error).\n * To get the IAB result that caused this exception to be thrown,\n * call {@link #getResult()}.\n */\npublic class IabException extends Exception {\n    IabResult mResult;\n\n    public IabException(IabResult r) {\n        this(r, null);\n    }\n    public IabException(int response, String message) {\n        this(new IabResult(response, message));\n    }\n    public IabException(IabResult r, Exception cause) {\n        super(r.getMessage(), cause);\n        mResult = r;\n    }\n    public IabException(int response, String message, Exception cause) {\n        this(new IabResult(response, message), cause);\n    }\n\n    /** Returns the IAB result (error) that this exception signals. */\n    public IabResult getResult() { return mResult; }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/donate/util/IabHelper.java",
    "content": "/* Copyright (c) 2012 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.alexstyl.specialdates.donate.util;\n\nimport android.app.Activity;\nimport android.app.PendingIntent;\nimport android.content.ComponentName;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.IntentSender.SendIntentException;\nimport android.content.ServiceConnection;\nimport android.content.pm.ResolveInfo;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.os.IBinder;\nimport android.os.RemoteException;\nimport android.text.TextUtils;\nimport android.util.Log;\n\nimport com.android.vending.billing.IInAppBillingService;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport org.json.JSONException;\n\n\n/**\n * Provides convenience methods for in-app billing. You can create one instance of this\n * class for your application and use it to process in-app billing operations.\n * It provides synchronous (blocking) and asynchronous (non-blocking) methods for\n * many common in-app billing operations, as well as automatic signature\n * verification.\n *\n * After instantiating, you must perform setup in order to start using the object.\n * To perform setup, call the {@link #startSetup} method and provide a listener;\n * that listener will be notified when setup is complete, after which (and not before)\n * you may call other methods.\n *\n * After setup is complete, you will typically want to request an inventory of owned\n * items and subscriptions. See {@link #queryInventory}, {@link #queryInventoryAsync}\n * and related methods.\n *\n * When you are done with this object, don't forget to call {@link #dispose}\n * to ensure proper cleanup. This object holds a binding to the in-app billing\n * service, which will leak unless you dispose of it correctly. If you created\n * the object on an Activity's onCreate method, then the recommended\n * place to dispose of it is the Activity's onDestroy method. It is invalid to\n * dispose the object while an asynchronous operation is in progress. You can\n * call {@link #disposeWhenFinished()} to ensure that any in-progress operation\n * completes before the object is disposed.\n *\n * A note about threading: When using this object from a background thread, you may\n * call the blocking versions of methods; when using from a UI thread, call\n * only the asynchronous versions and handle the results via callbacks.\n * Also, notice that you can only call one asynchronous operation at a time;\n * attempting to start a second asynchronous operation while the first one\n * has not yet completed will result in an exception being thrown.\n *\n */\npublic class IabHelper {\n    // Is debug logging enabled?\n    boolean mDebugLog = false;\n    String mDebugTag = \"IabHelper\";\n\n    // Is setup done?\n    boolean mSetupDone = false;\n\n    // Has this object been disposed of? (If so, we should ignore callbacks, etc)\n    boolean mDisposed = false;\n\n    // Do we need to dispose this object after an in-progress asynchronous operation?\n    boolean mDisposeAfterAsync = false;\n\n    // Are subscriptions supported?\n    boolean mSubscriptionsSupported = false;\n\n    // Is subscription update supported?\n    boolean mSubscriptionUpdateSupported = false;\n\n    // Is an asynchronous operation in progress?\n    // (only one at a time can be in progress)\n    boolean mAsyncInProgress = false;\n\n    // Ensure atomic access to mAsyncInProgress and mDisposeAfterAsync.\n    private final Object mAsyncInProgressLock = new Object();\n\n    // (for logging/debugging)\n    // if mAsyncInProgress == true, what asynchronous operation is in progress?\n    String mAsyncOperation = \"\";\n\n    // Context we were passed during initialization\n    Context mContext;\n\n    // Connection to the service\n    IInAppBillingService mService;\n    ServiceConnection mServiceConn;\n\n    // The request code used to launch purchase flow\n    int mRequestCode;\n\n    // The item type of the current purchase flow\n    String mPurchasingItemType;\n\n    // Public key for verifying signature, in base64 encoding\n    String mSignatureBase64 = null;\n\n    // Billing response codes\n    public static final int BILLING_RESPONSE_RESULT_OK = 0;\n    public static final int BILLING_RESPONSE_RESULT_USER_CANCELED = 1;\n    public static final int BILLING_RESPONSE_RESULT_SERVICE_UNAVAILABLE = 2;\n    public static final int BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE = 3;\n    public static final int BILLING_RESPONSE_RESULT_ITEM_UNAVAILABLE = 4;\n    public static final int BILLING_RESPONSE_RESULT_DEVELOPER_ERROR = 5;\n    public static final int BILLING_RESPONSE_RESULT_ERROR = 6;\n    public static final int BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED = 7;\n    public static final int BILLING_RESPONSE_RESULT_ITEM_NOT_OWNED = 8;\n\n    // IAB Helper error codes\n    public static final int IABHELPER_ERROR_BASE = -1000;\n    public static final int IABHELPER_REMOTE_EXCEPTION = -1001;\n    public static final int IABHELPER_BAD_RESPONSE = -1002;\n    public static final int IABHELPER_VERIFICATION_FAILED = -1003;\n    public static final int IABHELPER_SEND_INTENT_FAILED = -1004;\n    public static final int IABHELPER_USER_CANCELLED = -1005;\n    public static final int IABHELPER_UNKNOWN_PURCHASE_RESPONSE = -1006;\n    public static final int IABHELPER_MISSING_TOKEN = -1007;\n    public static final int IABHELPER_UNKNOWN_ERROR = -1008;\n    public static final int IABHELPER_SUBSCRIPTIONS_NOT_AVAILABLE = -1009;\n    public static final int IABHELPER_INVALID_CONSUMPTION = -1010;\n    public static final int IABHELPER_SUBSCRIPTION_UPDATE_NOT_AVAILABLE = -1011;\n\n    // Keys for the responses from InAppBillingService\n    public static final String RESPONSE_CODE = \"RESPONSE_CODE\";\n    public static final String RESPONSE_GET_SKU_DETAILS_LIST = \"DETAILS_LIST\";\n    public static final String RESPONSE_BUY_INTENT = \"BUY_INTENT\";\n    public static final String RESPONSE_INAPP_PURCHASE_DATA = \"INAPP_PURCHASE_DATA\";\n    public static final String RESPONSE_INAPP_SIGNATURE = \"INAPP_DATA_SIGNATURE\";\n    public static final String RESPONSE_INAPP_ITEM_LIST = \"INAPP_PURCHASE_ITEM_LIST\";\n    public static final String RESPONSE_INAPP_PURCHASE_DATA_LIST = \"INAPP_PURCHASE_DATA_LIST\";\n    public static final String RESPONSE_INAPP_SIGNATURE_LIST = \"INAPP_DATA_SIGNATURE_LIST\";\n    public static final String INAPP_CONTINUATION_TOKEN = \"INAPP_CONTINUATION_TOKEN\";\n\n    // Item types\n    public static final String ITEM_TYPE_INAPP = \"inapp\";\n    public static final String ITEM_TYPE_SUBS = \"subs\";\n\n    // some fields on the getSkuDetails response bundle\n    public static final String GET_SKU_DETAILS_ITEM_LIST = \"ITEM_ID_LIST\";\n    public static final String GET_SKU_DETAILS_ITEM_TYPE_LIST = \"ITEM_TYPE_LIST\";\n\n    /**\n     * Creates an instance. After creation, it will not yet be ready to use. You must perform\n     * setup by calling {@link #startSetup} and wait for setup to complete. This constructor does not\n     * block and is safe to call from a UI thread.\n     *\n     * @param ctx Your application or Activity context. Needed to bind to the in-app billing service.\n     * @param base64PublicKey Your application's public key, encoded in base64.\n     *     This is used for verification of purchase signatures. You can find your app's base64-encoded\n     *     public key in your application's page on Google Play Developer Console. Note that this\n     *     is NOT your \"developer public key\".\n     */\n    public IabHelper(Context ctx, String base64PublicKey) {\n        mContext = ctx.getApplicationContext();\n        mSignatureBase64 = base64PublicKey;\n        logDebug(\"IAB helper created.\");\n    }\n\n    /**\n     * Enables or disable debug logging through LogCat.\n     */\n    public void enableDebugLogging(boolean enable, String tag) {\n        checkNotDisposed();\n        mDebugLog = enable;\n        mDebugTag = tag;\n    }\n\n    public void enableDebugLogging(boolean enable) {\n        checkNotDisposed();\n        mDebugLog = enable;\n    }\n\n\n\n    /**\n     * Callback for setup process. This listener's {@link #onIabSetupFinished} method is called\n     * when the setup process is complete.\n     */\n    public interface OnIabSetupFinishedListener {\n        /**\n         * Called to notify that setup is complete.\n         *\n         * @param result The result of the setup process.\n         */\n        void onIabSetupFinished(IabResult result);\n    }\n\n    /**\n     * Starts the setup process. This will start up the setup process asynchronously.\n     * You will be notified through the listener when the setup process is complete.\n     * This method is safe to call from a UI thread.\n     *\n     * @param listener The listener to notify when the setup process is complete.\n     */\n    public void startSetup(final OnIabSetupFinishedListener listener) {\n        // If already set up, can't do it again.\n        checkNotDisposed();\n        if (mSetupDone) throw new IllegalStateException(\"IAB helper is already set up.\");\n\n        // Connection to IAB service\n        logDebug(\"Starting in-app billing setup.\");\n        mServiceConn = new ServiceConnection() {\n            @Override\n            public void onServiceDisconnected(ComponentName name) {\n                logDebug(\"Billing service disconnected.\");\n                mService = null;\n            }\n\n            @Override\n            public void onServiceConnected(ComponentName name, IBinder service) {\n                if (mDisposed) return;\n                logDebug(\"Billing service connected.\");\n                mService = IInAppBillingService.Stub.asInterface(service);\n                String packageName = mContext.getPackageName();\n                try {\n                    logDebug(\"Checking for in-app billing 3 support.\");\n\n                    // check for in-app billing v3 support\n                    int response = mService.isBillingSupported(3, packageName, ITEM_TYPE_INAPP);\n                    if (response != BILLING_RESPONSE_RESULT_OK) {\n                        if (listener != null) listener.onIabSetupFinished(new IabResult(response,\n                                \"Error checking for billing v3 support.\"));\n\n                        // if in-app purchases aren't supported, neither are subscriptions\n                        mSubscriptionsSupported = false;\n                        mSubscriptionUpdateSupported = false;\n                        return;\n                    } else {\n                        logDebug(\"In-app billing version 3 supported for \" + packageName);\n                    }\n\n                    // Check for v5 subscriptions support. This is needed for\n                    // getBuyIntentToReplaceSku which allows for subscription update\n                    response = mService.isBillingSupported(5, packageName, ITEM_TYPE_SUBS);\n                    if (response == BILLING_RESPONSE_RESULT_OK) {\n                        logDebug(\"Subscription re-signup AVAILABLE.\");\n                        mSubscriptionUpdateSupported = true;\n                    } else {\n                        logDebug(\"Subscription re-signup not available.\");\n                        mSubscriptionUpdateSupported = false;\n                    }\n\n                    if (mSubscriptionUpdateSupported) {\n                        mSubscriptionsSupported = true;\n                    } else {\n                        // check for v3 subscriptions support\n                        response = mService.isBillingSupported(3, packageName, ITEM_TYPE_SUBS);\n                        if (response == BILLING_RESPONSE_RESULT_OK) {\n                            logDebug(\"Subscriptions AVAILABLE.\");\n                            mSubscriptionsSupported = true;\n                        } else {\n                            logDebug(\"Subscriptions NOT AVAILABLE. Response: \" + response);\n                            mSubscriptionsSupported = false;\n                            mSubscriptionUpdateSupported = false;\n                        }\n                    }\n\n                    mSetupDone = true;\n                }\n                catch (RemoteException e) {\n                    if (listener != null) {\n                        listener.onIabSetupFinished(new IabResult(IABHELPER_REMOTE_EXCEPTION,\n                                \"RemoteException while setting up in-app billing.\"));\n                    }\n                    e.printStackTrace();\n                    return;\n                }\n\n                if (listener != null) {\n                    listener.onIabSetupFinished(new IabResult(BILLING_RESPONSE_RESULT_OK, \"Setup successful.\"));\n                }\n            }\n        };\n\n        Intent serviceIntent = new Intent(\"com.android.vending.billing.InAppBillingService.BIND\");\n        serviceIntent.setPackage(\"com.android.vending\");\n        List<ResolveInfo> intentServices = mContext.getPackageManager().queryIntentServices(serviceIntent, 0);\n        if (intentServices != null && !intentServices.isEmpty()) {\n            // service available to handle that Intent\n            mContext.bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE);\n        }\n        else {\n            // no service available to handle that Intent\n            if (listener != null) {\n                listener.onIabSetupFinished(\n                        new IabResult(BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE,\n                                \"Billing service unavailable on device.\"));\n            }\n        }\n    }\n\n    /**\n     * Dispose of object, releasing resources. It's very important to call this\n     * method when you are done with this object. It will release any resources\n     * used by it such as service connections. Naturally, once the object is\n     * disposed of, it can't be used again.\n     */\n    public void dispose() throws IabAsyncInProgressException {\n        synchronized (mAsyncInProgressLock) {\n            if (mAsyncInProgress) {\n                throw new IabAsyncInProgressException(\"Can't dispose because an async operation \" +\n                    \"(\" + mAsyncOperation + \") is in progress.\");\n            }\n        }\n        logDebug(\"Disposing.\");\n        mSetupDone = false;\n        if (mServiceConn != null) {\n            logDebug(\"Unbinding from service.\");\n            if (mContext != null) mContext.unbindService(mServiceConn);\n        }\n        mDisposed = true;\n        mContext = null;\n        mServiceConn = null;\n        mService = null;\n        mPurchaseListener = null;\n    }\n\n    /**\n     * Disposes of object, releasing resources. If there is an in-progress async operation, this\n     * method will queue the dispose to occur after the operation has finished.\n     */\n    public void disposeWhenFinished() {\n        synchronized (mAsyncInProgressLock) {\n            if (mAsyncInProgress) {\n                logDebug(\"Will dispose after async operation finishes.\");\n                mDisposeAfterAsync = true;\n            } else {\n                try {\n                    dispose();\n                } catch (IabAsyncInProgressException e) {\n                    // Should never be thrown, because we call dispose() only after checking that\n                    // there's not already an async operation in progress.\n                }\n            }\n        }\n    }\n\n    private void checkNotDisposed() {\n        if (mDisposed) throw new IllegalStateException(\"IabHelper was disposed of, so it cannot be used.\");\n    }\n\n    /** Returns whether subscriptions are supported. */\n    public boolean subscriptionsSupported() {\n        checkNotDisposed();\n        return mSubscriptionsSupported;\n    }\n\n\n    /**\n     * Callback that notifies when a purchase is finished.\n     */\n    public interface OnIabPurchaseFinishedListener {\n        /**\n         * Called to notify that an in-app purchase finished. If the purchase was successful,\n         * then the sku parameter specifies which item was purchased. If the purchase failed,\n         * the sku and extraData parameters may or may not be null, depending on how far the purchase\n         * process went.\n         *\n         * @param result The result of the purchase.\n         * @param info The purchase information (null if purchase failed)\n         */\n        void onIabPurchaseFinished(IabResult result, Purchase info);\n    }\n\n    // The listener registered on launchPurchaseFlow, which we have to call back when\n    // the purchase finishes\n    OnIabPurchaseFinishedListener mPurchaseListener;\n\n    public void launchPurchaseFlow(Activity act, String sku, int requestCode, OnIabPurchaseFinishedListener listener)\n        throws IabAsyncInProgressException {\n        launchPurchaseFlow(act, sku, requestCode, listener, \"\");\n    }\n\n    public void launchPurchaseFlow(Activity act, String sku, int requestCode,\n            OnIabPurchaseFinishedListener listener, String extraData)\n        throws IabAsyncInProgressException {\n        launchPurchaseFlow(act, sku, ITEM_TYPE_INAPP, null, requestCode, listener, extraData);\n    }\n\n    public void launchSubscriptionPurchaseFlow(Activity act, String sku, int requestCode,\n            OnIabPurchaseFinishedListener listener) throws IabAsyncInProgressException {\n        launchSubscriptionPurchaseFlow(act, sku, requestCode, listener, \"\");\n    }\n\n    public void launchSubscriptionPurchaseFlow(Activity act, String sku, int requestCode,\n            OnIabPurchaseFinishedListener listener, String extraData)\n        throws IabAsyncInProgressException {\n        launchPurchaseFlow(act, sku, ITEM_TYPE_SUBS, null, requestCode, listener, extraData);\n    }\n\n    /**\n     * Initiate the UI flow for an in-app purchase. Call this method to initiate an in-app purchase,\n     * which will involve bringing up the Google Play screen. The calling activity will be paused\n     * while the user interacts with Google Play, and the result will be delivered via the\n     * activity's {@link Activity#onActivityResult} method, at which point you must call\n     * this object's {@link #handleActivityResult} method to continue the purchase flow. This method\n     * MUST be called from the UI thread of the Activity.\n     *\n     * @param act The calling activity.\n     * @param sku The sku of the item to purchase.\n     * @param itemType indicates if it's a product or a subscription (ITEM_TYPE_INAPP or\n     *      ITEM_TYPE_SUBS)\n     * @param oldSkus A list of SKUs which the new SKU is replacing or null if there are none\n     * @param requestCode A request code (to differentiate from other responses -- as in\n     *      {@link Activity#startActivityForResult}).\n     * @param listener The listener to notify when the purchase process finishes\n     * @param extraData Extra data (developer payload), which will be returned with the purchase\n     *      data when the purchase completes. This extra data will be permanently bound to that\n     *      purchase and will always be returned when the purchase is queried.\n     */\n    public void launchPurchaseFlow(Activity act, String sku, String itemType, List<String> oldSkus,\n            int requestCode, OnIabPurchaseFinishedListener listener, String extraData)\n        throws IabAsyncInProgressException {\n        checkNotDisposed();\n        checkSetupDone(\"launchPurchaseFlow\");\n        flagStartAsync(\"launchPurchaseFlow\");\n        IabResult result;\n\n        if (itemType.equals(ITEM_TYPE_SUBS) && !mSubscriptionsSupported) {\n            IabResult r = new IabResult(IABHELPER_SUBSCRIPTIONS_NOT_AVAILABLE,\n                    \"Subscriptions are not available.\");\n            flagEndAsync();\n            if (listener != null) listener.onIabPurchaseFinished(r, null);\n            return;\n        }\n\n        try {\n            logDebug(\"Constructing buy intent for \" + sku + \", item type: \" + itemType);\n            Bundle buyIntentBundle;\n            if (oldSkus == null || oldSkus.isEmpty()) {\n                // Purchasing a new item or subscription re-signup\n                buyIntentBundle = mService.getBuyIntent(3, mContext.getPackageName(), sku, itemType,\n                        extraData);\n            } else {\n                // Subscription upgrade/downgrade\n                if (!mSubscriptionUpdateSupported) {\n                    IabResult r = new IabResult(IABHELPER_SUBSCRIPTION_UPDATE_NOT_AVAILABLE,\n                            \"Subscription updates are not available.\");\n                    flagEndAsync();\n                    if (listener != null) listener.onIabPurchaseFinished(r, null);\n                    return;\n                }\n                buyIntentBundle = mService.getBuyIntentToReplaceSkus(5, mContext.getPackageName(),\n                        oldSkus, sku, itemType, extraData);\n            }\n            int response = getResponseCodeFromBundle(buyIntentBundle);\n            if (response != BILLING_RESPONSE_RESULT_OK) {\n                logError(\"Unable to buy item, Error response: \" + getResponseDesc(response));\n                flagEndAsync();\n                result = new IabResult(response, \"Unable to buy item\");\n                if (listener != null) listener.onIabPurchaseFinished(result, null);\n                return;\n            }\n\n            PendingIntent pendingIntent = buyIntentBundle.getParcelable(RESPONSE_BUY_INTENT);\n            logDebug(\"Launching buy intent for \" + sku + \". Request code: \" + requestCode);\n            mRequestCode = requestCode;\n            mPurchaseListener = listener;\n            mPurchasingItemType = itemType;\n            act.startIntentSenderForResult(pendingIntent.getIntentSender(),\n                    requestCode, new Intent(),\n                    Integer.valueOf(0), Integer.valueOf(0),\n                    Integer.valueOf(0));\n        }\n        catch (SendIntentException e) {\n            logError(\"SendIntentException while launching purchase flow for sku \" + sku);\n            e.printStackTrace();\n            flagEndAsync();\n\n            result = new IabResult(IABHELPER_SEND_INTENT_FAILED, \"Failed to send intent.\");\n            if (listener != null) listener.onIabPurchaseFinished(result, null);\n        }\n        catch (RemoteException e) {\n            logError(\"RemoteException while launching purchase flow for sku \" + sku);\n            e.printStackTrace();\n            flagEndAsync();\n\n            result = new IabResult(IABHELPER_REMOTE_EXCEPTION, \"Remote exception while starting purchase flow\");\n            if (listener != null) listener.onIabPurchaseFinished(result, null);\n        }\n    }\n\n    /**\n     * Handles an activity result that's part of the purchase flow in in-app billing. If you\n     * are calling {@link #launchPurchaseFlow}, then you must call this method from your\n     * Activity's {@link Activity@onActivityResult} method. This method\n     * MUST be called from the UI thread of the Activity.\n     *\n     * @param requestCode The requestCode as you received it.\n     * @param resultCode The resultCode as you received it.\n     * @param data The data (Intent) as you received it.\n     * @return Returns true if the result was related to a purchase flow and was handled;\n     *     false if the result was not related to a purchase, in which case you should\n     *     handle it normally.\n     */\n    public boolean handleActivityResult(int requestCode, int resultCode, Intent data) {\n        IabResult result;\n        if (requestCode != mRequestCode) return false;\n\n        checkNotDisposed();\n        checkSetupDone(\"handleActivityResult\");\n\n        // end of async purchase operation that started on launchPurchaseFlow\n        flagEndAsync();\n\n        if (data == null) {\n            logError(\"Null data in IAB activity result.\");\n            result = new IabResult(IABHELPER_BAD_RESPONSE, \"Null data in IAB result\");\n            if (mPurchaseListener != null) mPurchaseListener.onIabPurchaseFinished(result, null);\n            return true;\n        }\n\n        int responseCode = getResponseCodeFromIntent(data);\n        String purchaseData = data.getStringExtra(RESPONSE_INAPP_PURCHASE_DATA);\n        String dataSignature = data.getStringExtra(RESPONSE_INAPP_SIGNATURE);\n\n        if (resultCode == Activity.RESULT_OK && responseCode == BILLING_RESPONSE_RESULT_OK) {\n            logDebug(\"Successful resultcode from purchase activity.\");\n            logDebug(\"Purchase data: \" + purchaseData);\n            logDebug(\"Data signature: \" + dataSignature);\n            logDebug(\"Extras: \" + data.getExtras());\n            logDebug(\"Expected item type: \" + mPurchasingItemType);\n\n            if (purchaseData == null || dataSignature == null) {\n                logError(\"BUG: either purchaseData or dataSignature is null.\");\n                logDebug(\"Extras: \" + data.getExtras().toString());\n                result = new IabResult(IABHELPER_UNKNOWN_ERROR, \"IAB returned null purchaseData or dataSignature\");\n                if (mPurchaseListener != null) mPurchaseListener.onIabPurchaseFinished(result, null);\n                return true;\n            }\n\n            Purchase purchase = null;\n            try {\n                purchase = new Purchase(mPurchasingItemType, purchaseData, dataSignature);\n                String sku = purchase.getSku();\n\n                // Verify signature\n                if (!Security.verifyPurchase(mSignatureBase64, purchaseData, dataSignature)) {\n                    logError(\"Purchase signature verification FAILED for sku \" + sku);\n                    result = new IabResult(IABHELPER_VERIFICATION_FAILED, \"Signature verification failed for sku \" + sku);\n                    if (mPurchaseListener != null) mPurchaseListener.onIabPurchaseFinished(result, purchase);\n                    return true;\n                }\n                logDebug(\"Purchase signature successfully verified.\");\n            }\n            catch (JSONException e) {\n                logError(\"Failed to parse purchase data.\");\n                e.printStackTrace();\n                result = new IabResult(IABHELPER_BAD_RESPONSE, \"Failed to parse purchase data.\");\n                if (mPurchaseListener != null) mPurchaseListener.onIabPurchaseFinished(result, null);\n                return true;\n            }\n\n            if (mPurchaseListener != null) {\n                mPurchaseListener.onIabPurchaseFinished(new IabResult(BILLING_RESPONSE_RESULT_OK, \"Success\"), purchase);\n            }\n        }\n        else if (resultCode == Activity.RESULT_OK) {\n            // result code was OK, but in-app billing response was not OK.\n            logDebug(\"Result code was OK but in-app billing response was not OK: \" + getResponseDesc(responseCode));\n            if (mPurchaseListener != null) {\n                result = new IabResult(responseCode, \"Problem purchashing item.\");\n                mPurchaseListener.onIabPurchaseFinished(result, null);\n            }\n        }\n        else if (resultCode == Activity.RESULT_CANCELED) {\n            logDebug(\"Purchase canceled - Response: \" + getResponseDesc(responseCode));\n            result = new IabResult(IABHELPER_USER_CANCELLED, \"User canceled.\");\n            if (mPurchaseListener != null) mPurchaseListener.onIabPurchaseFinished(result, null);\n        }\n        else {\n            logError(\"Purchase failed. Result code: \" + Integer.toString(resultCode)\n                    + \". Response: \" + getResponseDesc(responseCode));\n            result = new IabResult(IABHELPER_UNKNOWN_PURCHASE_RESPONSE, \"Unknown purchase response.\");\n            if (mPurchaseListener != null) mPurchaseListener.onIabPurchaseFinished(result, null);\n        }\n        return true;\n    }\n\n    public Inventory queryInventory() throws IabException {\n        return queryInventory(false, null, null);\n    }\n\n    /**\n     * Queries the inventory. This will query all owned items from the server, as well as\n     * information on additional skus, if specified. This method may block or take long to execute.\n     * Do not call from a UI thread. For that, use the non-blocking version {@link #queryInventoryAsync}.\n     *\n     * @param querySkuDetails if true, SKU details (price, description, etc) will be queried as well\n     *     as purchase information.\n     * @param moreItemSkus additional PRODUCT skus to query information on, regardless of ownership.\n     *     Ignored if null or if querySkuDetails is false.\n     * @param moreSubsSkus additional SUBSCRIPTIONS skus to query information on, regardless of ownership.\n     *     Ignored if null or if querySkuDetails is false.\n     * @throws IabException if a problem occurs while refreshing the inventory.\n     */\n    public Inventory queryInventory(boolean querySkuDetails, List<String> moreItemSkus,\n            List<String> moreSubsSkus) throws IabException {\n        checkNotDisposed();\n        checkSetupDone(\"queryInventory\");\n        try {\n            Inventory inv = new Inventory();\n            int r = queryPurchases(inv, ITEM_TYPE_INAPP);\n            if (r != BILLING_RESPONSE_RESULT_OK) {\n                throw new IabException(r, \"Error refreshing inventory (querying owned items).\");\n            }\n\n            if (querySkuDetails) {\n                r = querySkuDetails(ITEM_TYPE_INAPP, inv, moreItemSkus);\n                if (r != BILLING_RESPONSE_RESULT_OK) {\n                    throw new IabException(r, \"Error refreshing inventory (querying prices of items).\");\n                }\n            }\n\n            // if subscriptions are supported, then also query for subscriptions\n            if (mSubscriptionsSupported) {\n                r = queryPurchases(inv, ITEM_TYPE_SUBS);\n                if (r != BILLING_RESPONSE_RESULT_OK) {\n                    throw new IabException(r, \"Error refreshing inventory (querying owned subscriptions).\");\n                }\n\n                if (querySkuDetails) {\n                    r = querySkuDetails(ITEM_TYPE_SUBS, inv, moreSubsSkus);\n                    if (r != BILLING_RESPONSE_RESULT_OK) {\n                        throw new IabException(r, \"Error refreshing inventory (querying prices of subscriptions).\");\n                    }\n                }\n            }\n\n            return inv;\n        }\n        catch (RemoteException e) {\n            throw new IabException(IABHELPER_REMOTE_EXCEPTION, \"Remote exception while refreshing inventory.\", e);\n        }\n        catch (JSONException e) {\n            throw new IabException(IABHELPER_BAD_RESPONSE, \"Error parsing JSON response while refreshing inventory.\", e);\n        }\n    }\n\n    /**\n     * DonationCallbacks that notifies when an inventory query operation completes.\n     */\n    public interface QueryInventoryFinishedListener {\n        /**\n         * Called to notify that an inventory query operation completed.\n         *\n         * @param result The result of the operation.\n         * @param inv The inventory.\n         */\n        void onQueryInventoryFinished(IabResult result, Inventory inv);\n    }\n\n\n    /**\n     * Asynchronous wrapper for inventory query. This will perform an inventory\n     * query as described in {@link #queryInventory}, but will do so asynchronously\n     * and call back the specified listener upon completion. This method is safe to\n     * call from a UI thread.\n     *\n     * @param querySkuDetails as in {@link #queryInventory}\n     * @param moreItemSkus as in {@link #queryInventory}\n     * @param moreSubsSkus as in {@link #queryInventory}\n     * @param listener The listener to notify when the refresh operation completes.\n     */\n    public void queryInventoryAsync(final boolean querySkuDetails, final List<String> moreItemSkus,\n            final List<String> moreSubsSkus, final QueryInventoryFinishedListener listener)\n        throws IabAsyncInProgressException {\n        final Handler handler = new Handler();\n        checkNotDisposed();\n        checkSetupDone(\"queryInventory\");\n        flagStartAsync(\"refresh inventory\");\n        (new Thread(new Runnable() {\n            public void run() {\n                IabResult result = new IabResult(BILLING_RESPONSE_RESULT_OK, \"Inventory refresh successful.\");\n                Inventory inv = null;\n                try {\n                    inv = queryInventory(querySkuDetails, moreItemSkus, moreSubsSkus);\n                }\n                catch (IabException ex) {\n                    result = ex.getResult();\n                }\n\n                flagEndAsync();\n\n                final IabResult result_f = result;\n                final Inventory inv_f = inv;\n                if (!mDisposed && listener != null) {\n                    handler.post(new Runnable() {\n                        public void run() {\n                            listener.onQueryInventoryFinished(result_f, inv_f);\n                        }\n                    });\n                }\n            }\n        })).start();\n    }\n\n    public void queryInventoryAsync(QueryInventoryFinishedListener listener)\n        throws IabAsyncInProgressException{\n        queryInventoryAsync(false, null, null, listener);\n    }\n\n    /**\n     * Consumes a given in-app product. Consuming can only be done on an item\n     * that's owned, and as a result of consumption, the user will no longer own it.\n     * This method may block or take long to return. Do not call from the UI thread.\n     * For that, see {@link #consumeAsync}.\n     *\n     * @param itemInfo The PurchaseInfo that represents the item to consume.\n     * @throws IabException if there is a problem during consumption.\n     */\n    void consume(Purchase itemInfo) throws IabException {\n        checkNotDisposed();\n        checkSetupDone(\"consume\");\n\n        if (!itemInfo.mItemType.equals(ITEM_TYPE_INAPP)) {\n            throw new IabException(IABHELPER_INVALID_CONSUMPTION,\n                    \"Items of type '\" + itemInfo.mItemType + \"' can't be consumed.\");\n        }\n\n        try {\n            String token = itemInfo.getToken();\n            String sku = itemInfo.getSku();\n            if (token == null || token.equals(\"\")) {\n                logError(\"Can't consume \"+ sku + \". No token.\");\n                throw new IabException(IABHELPER_MISSING_TOKEN, \"PurchaseInfo is missing token for sku: \"\n                        + sku + \" \" + itemInfo);\n            }\n\n            logDebug(\"Consuming sku: \" + sku + \", token: \" + token);\n            int response = mService.consumePurchase(3, mContext.getPackageName(), token);\n            if (response == BILLING_RESPONSE_RESULT_OK) {\n                logDebug(\"Successfully consumed sku: \" + sku);\n            }\n            else {\n                logDebug(\"Error consuming consuming sku \" + sku + \". \" + getResponseDesc(response));\n                throw new IabException(response, \"Error consuming sku \" + sku);\n            }\n        }\n        catch (RemoteException e) {\n            throw new IabException(IABHELPER_REMOTE_EXCEPTION, \"Remote exception while consuming. PurchaseInfo: \" + itemInfo, e);\n        }\n    }\n\n    /**\n     * Callback that notifies when a consumption operation finishes.\n     */\n    public interface OnConsumeFinishedListener {\n        /**\n         * Called to notify that a consumption has finished.\n         *\n         * @param purchase The purchase that was (or was to be) consumed.\n         * @param result The result of the consumption operation.\n         */\n        void onConsumeFinished(Purchase purchase, IabResult result);\n    }\n\n    /**\n     * Callback that notifies when a multi-item consumption operation finishes.\n     */\n    public interface OnConsumeMultiFinishedListener {\n        /**\n         * Called to notify that a consumption of multiple items has finished.\n         *\n         * @param purchases The purchases that were (or were to be) consumed.\n         * @param results The results of each consumption operation, corresponding to each\n         *     sku.\n         */\n        void onConsumeMultiFinished(List<Purchase> purchases, List<IabResult> results);\n    }\n\n    /**\n     * Asynchronous wrapper to item consumption. Works like {@link #consume}, but\n     * performs the consumption in the background and notifies completion through\n     * the provided listener. This method is safe to call from a UI thread.\n     *\n     * @param purchase The purchase to be consumed.\n     * @param listener The listener to notify when the consumption operation finishes.\n     */\n    public void consumeAsync(Purchase purchase, OnConsumeFinishedListener listener)\n        throws IabAsyncInProgressException {\n        checkNotDisposed();\n        checkSetupDone(\"consume\");\n        List<Purchase> purchases = new ArrayList<Purchase>();\n        purchases.add(purchase);\n        consumeAsyncInternal(purchases, listener, null);\n    }\n\n    /**\n     * Same as {@link #consumeAsync}, but for multiple items at once.\n     * @param purchases The list of PurchaseInfo objects representing the purchases to consume.\n     * @param listener The listener to notify when the consumption operation finishes.\n     */\n    public void consumeAsync(List<Purchase> purchases, OnConsumeMultiFinishedListener listener)\n        throws IabAsyncInProgressException {\n        checkNotDisposed();\n        checkSetupDone(\"consume\");\n        consumeAsyncInternal(purchases, null, listener);\n    }\n\n    /**\n     * Returns a human-readable description for the given response code.\n     *\n     * @param code The response code\n     * @return A human-readable string explaining the result code.\n     *     It also includes the result code numerically.\n     */\n    public static String getResponseDesc(int code) {\n        String[] iab_msgs = (\"0:OK/1:User Canceled/2:Unknown/\" +\n                \"3:Billing Unavailable/4:Item unavailable/\" +\n                \"5:Developer Error/6:Error/7:Item Already Owned/\" +\n                \"8:Item not owned\").split(\"/\");\n        String[] iabhelper_msgs = (\"0:OK/-1001:Remote exception during initialization/\" +\n                                   \"-1002:Bad response received/\" +\n                                   \"-1003:Purchase signature verification failed/\" +\n                                   \"-1004:Send intent failed/\" +\n                                   \"-1005:User cancelled/\" +\n                                   \"-1006:Unknown purchase response/\" +\n                                   \"-1007:Missing token/\" +\n                                   \"-1008:Unknown error/\" +\n                                   \"-1009:Subscriptions not available/\" +\n                                   \"-1010:Invalid consumption attempt\").split(\"/\");\n\n        if (code <= IABHELPER_ERROR_BASE) {\n            int index = IABHELPER_ERROR_BASE - code;\n            if (index >= 0 && index < iabhelper_msgs.length) return iabhelper_msgs[index];\n            else return String.valueOf(code) + \":Unknown IAB Helper Error\";\n        }\n        else if (code < 0 || code >= iab_msgs.length)\n            return String.valueOf(code) + \":Unknown\";\n        else\n            return iab_msgs[code];\n    }\n\n\n    // Checks that setup was done; if not, throws an exception.\n    void checkSetupDone(String operation) {\n        if (!mSetupDone) {\n            logError(\"Illegal state for operation (\" + operation + \"): IAB helper is not set up.\");\n            throw new IllegalStateException(\"IAB helper is not set up. Can't perform operation: \" + operation);\n        }\n    }\n\n    // Workaround to bug where sometimes response codes come as Long instead of Integer\n    int getResponseCodeFromBundle(Bundle b) {\n        Object o = b.get(RESPONSE_CODE);\n        if (o == null) {\n            logDebug(\"Bundle with null response code, assuming OK (known issue)\");\n            return BILLING_RESPONSE_RESULT_OK;\n        }\n        else if (o instanceof Integer) return ((Integer)o).intValue();\n        else if (o instanceof Long) return (int)((Long)o).longValue();\n        else {\n            logError(\"Unexpected type for bundle response code.\");\n            logError(o.getClass().getName());\n            throw new RuntimeException(\"Unexpected type for bundle response code: \" + o.getClass().getName());\n        }\n    }\n\n    // Workaround to bug where sometimes response codes come as Long instead of Integer\n    int getResponseCodeFromIntent(Intent i) {\n        Object o = i.getExtras().get(RESPONSE_CODE);\n        if (o == null) {\n            logError(\"Intent with no response code, assuming OK (known issue)\");\n            return BILLING_RESPONSE_RESULT_OK;\n        }\n        else if (o instanceof Integer) return ((Integer)o).intValue();\n        else if (o instanceof Long) return (int)((Long)o).longValue();\n        else {\n            logError(\"Unexpected type for intent response code.\");\n            logError(o.getClass().getName());\n            throw new RuntimeException(\"Unexpected type for intent response code: \" + o.getClass().getName());\n        }\n    }\n\n    void flagStartAsync(String operation) throws IabAsyncInProgressException {\n        synchronized (mAsyncInProgressLock) {\n            if (mAsyncInProgress) {\n                throw new IabAsyncInProgressException(\"Can't start async operation (\" +\n                    operation + \") because another async operation (\" + mAsyncOperation +\n                    \") is in progress.\");\n            }\n            mAsyncOperation = operation;\n            mAsyncInProgress = true;\n            logDebug(\"Starting async operation: \" + operation);\n        }\n    }\n\n    void flagEndAsync() {\n        synchronized (mAsyncInProgressLock) {\n            logDebug(\"Ending async operation: \" + mAsyncOperation);\n            mAsyncOperation = \"\";\n            mAsyncInProgress = false;\n            if (mDisposeAfterAsync) {\n                try {\n                    dispose();\n                } catch (IabAsyncInProgressException e) {\n                    // Should not be thrown, because we reset mAsyncInProgress immediately before\n                    // calling dispose().\n                }\n            }\n        }\n    }\n\n    /**\n     * Exception thrown when the requested operation cannot be started because an async operation\n     * is still in progress.\n     */\n    public static class IabAsyncInProgressException extends Exception {\n        public IabAsyncInProgressException(String message) {\n            super(message);\n        }\n    }\n\n    int queryPurchases(Inventory inv, String itemType) throws JSONException, RemoteException {\n        // Query purchases\n        logDebug(\"Querying owned items, item type: \" + itemType);\n        logDebug(\"Package name: \" + mContext.getPackageName());\n        boolean verificationFailed = false;\n        String continueToken = null;\n\n        do {\n            logDebug(\"Calling getPurchases with continuation token: \" + continueToken);\n            Bundle ownedItems = mService.getPurchases(3, mContext.getPackageName(),\n                    itemType, continueToken);\n\n            int response = getResponseCodeFromBundle(ownedItems);\n            logDebug(\"Owned items response: \" + String.valueOf(response));\n            if (response != BILLING_RESPONSE_RESULT_OK) {\n                logDebug(\"getPurchases() failed: \" + getResponseDesc(response));\n                return response;\n            }\n            if (!ownedItems.containsKey(RESPONSE_INAPP_ITEM_LIST)\n                    || !ownedItems.containsKey(RESPONSE_INAPP_PURCHASE_DATA_LIST)\n                    || !ownedItems.containsKey(RESPONSE_INAPP_SIGNATURE_LIST)) {\n                logError(\"Bundle returned from getPurchases() doesn't contain required fields.\");\n                return IABHELPER_BAD_RESPONSE;\n            }\n\n            ArrayList<String> ownedSkus = ownedItems.getStringArrayList(\n                    RESPONSE_INAPP_ITEM_LIST);\n            ArrayList<String> purchaseDataList = ownedItems.getStringArrayList(\n                    RESPONSE_INAPP_PURCHASE_DATA_LIST);\n            ArrayList<String> signatureList = ownedItems.getStringArrayList(\n                    RESPONSE_INAPP_SIGNATURE_LIST);\n\n            for (int i = 0; i < purchaseDataList.size(); ++i) {\n                String purchaseData = purchaseDataList.get(i);\n                String signature = signatureList.get(i);\n                String sku = ownedSkus.get(i);\n                if (Security.verifyPurchase(mSignatureBase64, purchaseData, signature)) {\n                    logDebug(\"Sku is owned: \" + sku);\n                    Purchase purchase = new Purchase(itemType, purchaseData, signature);\n\n                    if (TextUtils.isEmpty(purchase.getToken())) {\n                        logWarn(\"BUG: empty/null token!\");\n                        logDebug(\"Purchase data: \" + purchaseData);\n                    }\n\n                    // Record ownership and token\n                    inv.addPurchase(purchase);\n                }\n                else {\n                    logWarn(\"Purchase signature verification **FAILED**. Not adding item.\");\n                    logDebug(\"   Purchase data: \" + purchaseData);\n                    logDebug(\"   Signature: \" + signature);\n                    verificationFailed = true;\n                }\n            }\n\n            continueToken = ownedItems.getString(INAPP_CONTINUATION_TOKEN);\n            logDebug(\"Continuation token: \" + continueToken);\n        } while (!TextUtils.isEmpty(continueToken));\n\n        return verificationFailed ? IABHELPER_VERIFICATION_FAILED : BILLING_RESPONSE_RESULT_OK;\n    }\n\n    int querySkuDetails(String itemType, Inventory inv, List<String> moreSkus)\n            throws RemoteException, JSONException {\n        logDebug(\"Querying SKU details.\");\n        ArrayList<String> skuList = new ArrayList<String>();\n        skuList.addAll(inv.getAllOwnedSkus(itemType));\n        if (moreSkus != null) {\n            for (String sku : moreSkus) {\n                if (!skuList.contains(sku)) {\n                    skuList.add(sku);\n                }\n            }\n        }\n\n        if (skuList.size() == 0) {\n            logDebug(\"queryPrices: nothing to do because there are no SKUs.\");\n            return BILLING_RESPONSE_RESULT_OK;\n        }\n\n        // Split the sku list in blocks of no more than 20 elements.\n        ArrayList<ArrayList<String>> packs = new ArrayList<ArrayList<String>>();\n        ArrayList<String> tempList;\n        int n = skuList.size() / 20;\n        int mod = skuList.size() % 20;\n        for (int i = 0; i < n; i++) {\n            tempList = new ArrayList<String>();\n            for (String s : skuList.subList(i * 20, i * 20 + 20)) {\n                tempList.add(s);\n            }\n            packs.add(tempList);\n        }\n        if (mod != 0) {\n            tempList = new ArrayList<String>();\n            for (String s : skuList.subList(n * 20, n * 20 + mod)) {\n                tempList.add(s);\n            }\n            packs.add(tempList);\n        }\n\n        for (ArrayList<String> skuPartList : packs) {\n            Bundle querySkus = new Bundle();\n            querySkus.putStringArrayList(GET_SKU_DETAILS_ITEM_LIST, skuPartList);\n            Bundle skuDetails = mService.getSkuDetails(3, mContext.getPackageName(),\n                    itemType, querySkus);\n\n            if (!skuDetails.containsKey(RESPONSE_GET_SKU_DETAILS_LIST)) {\n                int response = getResponseCodeFromBundle(skuDetails);\n                if (response != BILLING_RESPONSE_RESULT_OK) {\n                    logDebug(\"getSkuDetails() failed: \" + getResponseDesc(response));\n                    return response;\n                } else {\n                    logError(\"getSkuDetails() returned a bundle with neither an error nor a detail list.\");\n                    return IABHELPER_BAD_RESPONSE;\n                }\n            }\n\n            ArrayList<String> responseList = skuDetails.getStringArrayList(\n                    RESPONSE_GET_SKU_DETAILS_LIST);\n\n            for (String thisResponse : responseList) {\n                SkuDetails d = new SkuDetails(itemType, thisResponse);\n                logDebug(\"Got sku details: \" + d);\n                inv.addSkuDetails(d);\n            }\n        }\n\n        return BILLING_RESPONSE_RESULT_OK;\n    }\n\n    void consumeAsyncInternal(final List<Purchase> purchases,\n                              final OnConsumeFinishedListener singleListener,\n                              final OnConsumeMultiFinishedListener multiListener)\n        throws IabAsyncInProgressException {\n        final Handler handler = new Handler();\n        flagStartAsync(\"consume\");\n        (new Thread(new Runnable() {\n            public void run() {\n                final List<IabResult> results = new ArrayList<IabResult>();\n                for (Purchase purchase : purchases) {\n                    try {\n                        consume(purchase);\n                        results.add(new IabResult(BILLING_RESPONSE_RESULT_OK, \"Successful consume of sku \" + purchase.getSku()));\n                    }\n                    catch (IabException ex) {\n                        results.add(ex.getResult());\n                    }\n                }\n\n                flagEndAsync();\n                if (!mDisposed && singleListener != null) {\n                    handler.post(new Runnable() {\n                        public void run() {\n                            singleListener.onConsumeFinished(purchases.get(0), results.get(0));\n                        }\n                    });\n                }\n                if (!mDisposed && multiListener != null) {\n                    handler.post(new Runnable() {\n                        public void run() {\n                            multiListener.onConsumeMultiFinished(purchases, results);\n                        }\n                    });\n                }\n            }\n        })).start();\n    }\n\n    void logDebug(String msg) {\n        if (mDebugLog) Log.d(mDebugTag, msg);\n    }\n\n    void logError(String msg) {\n        Log.e(mDebugTag, \"In-app billing error: \" + msg);\n    }\n\n    void logWarn(String msg) {\n        Log.w(mDebugTag, \"In-app billing warning: \" + msg);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/donate/util/IabResult.java",
    "content": "/* Copyright (c) 2012 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.alexstyl.specialdates.donate.util;\n\n/**\n * Represents the result of an in-app billing operation.\n * A result is composed of a response code (an integer) and possibly a\n * message (String). You can get those by calling\n * {@link #getResponse} and {@link #getMessage()}, respectively. You\n * can also inquire whether a result is a success or a failure by\n * calling {@link #isSuccess()} and {@link #isFailure()}.\n */\npublic class IabResult {\n    int mResponse;\n    String mMessage;\n\n    public IabResult(int response, String message) {\n        mResponse = response;\n        if (message == null || message.trim().length() == 0) {\n            mMessage = IabHelper.getResponseDesc(response);\n        }\n        else {\n            mMessage = message + \" (response: \" + IabHelper.getResponseDesc(response) + \")\";\n        }\n    }\n    public int getResponse() { return mResponse; }\n    public String getMessage() { return mMessage; }\n    public boolean isSuccess() { return mResponse == IabHelper.BILLING_RESPONSE_RESULT_OK; }\n    public boolean isFailure() { return !isSuccess(); }\n    public String toString() { return \"IabResult: \" + getMessage(); }\n}\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/donate/util/Inventory.java",
    "content": "/* Copyright (c) 2012 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.alexstyl.specialdates.donate.util;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * Represents a block of information about in-app items.\n * An Inventory is returned by such methods as {@link IabHelper#queryInventory}.\n */\npublic class Inventory {\n    Map<String,SkuDetails> mSkuMap = new HashMap<String,SkuDetails>();\n    Map<String,Purchase> mPurchaseMap = new HashMap<String,Purchase>();\n\n    Inventory() { }\n\n    /** Returns the listing details for an in-app product. */\n    public SkuDetails getSkuDetails(String sku) {\n        return mSkuMap.get(sku);\n    }\n\n    /** Returns purchase information for a given product, or null if there is no purchase. */\n    public Purchase getPurchase(String sku) {\n        return mPurchaseMap.get(sku);\n    }\n\n    /** Returns whether or not there exists a purchase of the given product. */\n    public boolean hasPurchase(String sku) {\n        return mPurchaseMap.containsKey(sku);\n    }\n\n    /** Return whether or not details about the given product are available. */\n    public boolean hasDetails(String sku) {\n        return mSkuMap.containsKey(sku);\n    }\n\n    /**\n     * Erase a purchase (locally) from the inventory, given its product ID. This just\n     * modifies the Inventory object locally and has no effect on the server! This is\n     * useful when you have an existing Inventory object which you know to be up to date,\n     * and you have just consumed an item successfully, which means that erasing its\n     * purchase data from the Inventory you already have is quicker than querying for\n     * a new Inventory.\n     */\n    public void erasePurchase(String sku) {\n        if (mPurchaseMap.containsKey(sku)) mPurchaseMap.remove(sku);\n    }\n\n    /** Returns a list of all owned product IDs. */\n    List<String> getAllOwnedSkus() {\n        return new ArrayList<String>(mPurchaseMap.keySet());\n    }\n\n    /** Returns a list of all owned product IDs of a given type */\n    List<String> getAllOwnedSkus(String itemType) {\n        List<String> result = new ArrayList<String>();\n        for (Purchase p : mPurchaseMap.values()) {\n            if (p.getItemType().equals(itemType)) result.add(p.getSku());\n        }\n        return result;\n    }\n\n    /** Returns a list of all purchases. */\n    List<Purchase> getAllPurchases() {\n        return new ArrayList<Purchase>(mPurchaseMap.values());\n    }\n\n    void addSkuDetails(SkuDetails d) {\n        mSkuMap.put(d.getSku(), d);\n    }\n\n    void addPurchase(Purchase p) {\n        mPurchaseMap.put(p.getSku(), p);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/donate/util/Purchase.java",
    "content": "/* Copyright (c) 2012 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.alexstyl.specialdates.donate.util;\n\nimport org.json.JSONException;\nimport org.json.JSONObject;\n\n/**\n * Represents an in-app billing purchase.\n */\npublic class Purchase {\n    String mItemType;  // ITEM_TYPE_INAPP or ITEM_TYPE_SUBS\n    String mOrderId;\n    String mPackageName;\n    String mSku;\n    long mPurchaseTime;\n    int mPurchaseState;\n    String mDeveloperPayload;\n    String mToken;\n    String mOriginalJson;\n    String mSignature;\n    boolean mIsAutoRenewing;\n\n    public Purchase(String itemType, String jsonPurchaseInfo, String signature) throws JSONException {\n        mItemType = itemType;\n        mOriginalJson = jsonPurchaseInfo;\n        JSONObject o = new JSONObject(mOriginalJson);\n        mOrderId = o.optString(\"orderId\");\n        mPackageName = o.optString(\"packageName\");\n        mSku = o.optString(\"productId\");\n        mPurchaseTime = o.optLong(\"purchaseTime\");\n        mPurchaseState = o.optInt(\"purchaseState\");\n        mDeveloperPayload = o.optString(\"developerPayload\");\n        mToken = o.optString(\"token\", o.optString(\"purchaseToken\"));\n        mIsAutoRenewing = o.optBoolean(\"autoRenewing\");\n        mSignature = signature;\n    }\n\n    public String getItemType() { return mItemType; }\n    public String getOrderId() { return mOrderId; }\n    public String getPackageName() { return mPackageName; }\n    public String getSku() { return mSku; }\n    public long getPurchaseTime() { return mPurchaseTime; }\n    public int getPurchaseState() { return mPurchaseState; }\n    public String getDeveloperPayload() { return mDeveloperPayload; }\n    public String getToken() { return mToken; }\n    public String getOriginalJson() { return mOriginalJson; }\n    public String getSignature() { return mSignature; }\n    public boolean isAutoRenewing() { return mIsAutoRenewing; }\n\n    @Override\n    public String toString() { return \"PurchaseInfo(type:\" + mItemType + \"):\" + mOriginalJson; }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/donate/util/Security.java",
    "content": "/* Copyright (c) 2012 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.alexstyl.specialdates.donate.util;\n\nimport android.text.TextUtils;\nimport android.util.Base64;\nimport android.util.Log;\n\nimport java.security.InvalidKeyException;\nimport java.security.KeyFactory;\nimport java.security.NoSuchAlgorithmException;\nimport java.security.PublicKey;\nimport java.security.Signature;\nimport java.security.SignatureException;\nimport java.security.spec.InvalidKeySpecException;\nimport java.security.spec.X509EncodedKeySpec;\n\n/**\n * Security-related methods. For a secure implementation, all of this code\n * should be implemented on a server that communicates with the\n * application on the device. For the sake of simplicity and clarity of this\n * example, this code is included here and is executed on the device. If you\n * must verify the purchases on the phone, you should obfuscate this code to\n * make it harder for an attacker to replace the code with stubs that treat all\n * purchases as verified.\n */\n@SuppressWarnings(\"all\")\npublic class Security {\n    private static final String TAG = \"IABUtil/Security\";\n\n    private static final String KEY_FACTORY_ALGORITHM = \"RSA\";\n    private static final String SIGNATURE_ALGORITHM = \"SHA1withRSA\";\n\n    /**\n     * Verifies that the data was signed with the given signature, and returns\n     * the verified purchase. The data is in JSON format and signed\n     * with a private key. The data also contains the {@link PurchaseState}\n     * and product ID of the purchase.\n     * @param base64PublicKey the base64-encoded public key to use for verifying.\n     * @param signedData the signed JSON string (signed, not encrypted)\n     * @param signature the signature for the data, signed with the private key\n     */\n    public static boolean verifyPurchase(String base64PublicKey, String signedData, String signature) {\n        if (TextUtils.isEmpty(signedData) || TextUtils.isEmpty(base64PublicKey) ||\n                TextUtils.isEmpty(signature)) {\n            Log.e(TAG, \"Purchase verification failed: missing data.\");\n            return false;\n        }\n\n        PublicKey key = Security.generatePublicKey(base64PublicKey);\n        return Security.verify(key, signedData, signature);\n    }\n\n    /**\n     * Generates a PublicKey instance from a string containing the\n     * Base64-encoded public key.\n     *\n     * @param encodedPublicKey Base64-encoded public key\n     * @throws IllegalArgumentException if encodedPublicKey is invalid\n     */\n    public static PublicKey generatePublicKey(String encodedPublicKey) {\n        try {\n            byte[] decodedKey = Base64.decode(encodedPublicKey, Base64.DEFAULT);\n            KeyFactory keyFactory = KeyFactory.getInstance(KEY_FACTORY_ALGORITHM);\n            return keyFactory.generatePublic(new X509EncodedKeySpec(decodedKey));\n        } catch (NoSuchAlgorithmException e) {\n            throw new RuntimeException(e);\n        } catch (InvalidKeySpecException e) {\n            Log.e(TAG, \"Invalid key specification.\");\n            throw new IllegalArgumentException(e);\n        }\n    }\n\n    /**\n     * Verifies that the signature from the server matches the computed\n     * signature on the data.  Returns true if the data is correctly signed.\n     *\n     * @param publicKey public key associated with the developer account\n     * @param signedData signed data from server\n     * @param signature server signature\n     * @return true if the data and signature match\n     */\n    public static boolean verify(PublicKey publicKey, String signedData, String signature) {\n        byte[] signatureBytes;\n        try {\n            signatureBytes = Base64.decode(signature, Base64.DEFAULT);\n        } catch (IllegalArgumentException e) {\n            Log.e(TAG, \"Base64 decoding failed.\");\n            return false;\n        }\n        try {\n            Signature sig = Signature.getInstance(SIGNATURE_ALGORITHM);\n            sig.initVerify(publicKey);\n            sig.update(signedData.getBytes());\n            if (!sig.verify(signatureBytes)) {\n                Log.e(TAG, \"Signature verification failed.\");\n                return false;\n            }\n            return true;\n        } catch (NoSuchAlgorithmException e) {\n            Log.e(TAG, \"NoSuchAlgorithmException.\");\n        } catch (InvalidKeyException e) {\n            Log.e(TAG, \"Invalid key specification.\");\n        } catch (SignatureException e) {\n            Log.e(TAG, \"Signature exception.\");\n        }\n        return false;\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/donate/util/SkuDetails.java",
    "content": "/* Copyright (c) 2012 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage com.alexstyl.specialdates.donate.util;\n\nimport org.json.JSONException;\nimport org.json.JSONObject;\n\n/**\n * Represents an in-app product's listing details.\n */\npublic class SkuDetails {\n    private final String mItemType;\n    private final String mSku;\n    private final String mType;\n    private final String mPrice;\n    private final long mPriceAmountMicros;\n    private final String mPriceCurrencyCode;\n    private final String mTitle;\n    private final String mDescription;\n    private final String mJson;\n\n    public SkuDetails(String jsonSkuDetails) throws JSONException {\n        this(IabHelper.ITEM_TYPE_INAPP, jsonSkuDetails);\n    }\n\n    public SkuDetails(String itemType, String jsonSkuDetails) throws JSONException {\n        mItemType = itemType;\n        mJson = jsonSkuDetails;\n        JSONObject o = new JSONObject(mJson);\n        mSku = o.optString(\"productId\");\n        mType = o.optString(\"type\");\n        mPrice = o.optString(\"price\");\n        mPriceAmountMicros = o.optLong(\"price_amount_micros\");\n        mPriceCurrencyCode = o.optString(\"price_currency_code\");\n        mTitle = o.optString(\"title\");\n        mDescription = o.optString(\"description\");\n    }\n\n    public String getSku() { return mSku; }\n    public String getType() { return mType; }\n    public String getPrice() { return mPrice; }\n    public long getPriceAmountMicros() { return mPriceAmountMicros; }\n    public String getPriceCurrencyCode() { return mPriceCurrencyCode; }\n    public String getTitle() { return mTitle; }\n    public String getDescription() { return mDescription; }\n\n    @Override\n    public String toString() {\n        return \"SkuDetails:\" + mJson;\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/events/ContactsObserver.java",
    "content": "package com.alexstyl.specialdates.events;\n\nimport android.content.ContentResolver;\nimport android.database.ContentObserver;\nimport android.net.Uri;\nimport android.os.Handler;\nimport android.provider.ContactsContract;\n\nimport com.alexstyl.specialdates.EventsUpdateTrigger;\n\npublic final class ContactsObserver extends ContentObserver implements EventsUpdateTrigger {\n\n    private static final Uri URI = ContactsContract.Contacts.CONTENT_URI;\n    private final ContentResolver resolver;\n\n    private Callback callback;\n\n    public ContactsObserver(ContentResolver resolver) {\n        super(new Handler());\n        this.resolver = resolver;\n    }\n\n    @Override\n    public void startObserving(Callback callback) {\n        this.callback = callback;\n        resolver.registerContentObserver(URI, false, this);\n    }\n\n    @Override\n    public void onChange(boolean selfChange) {\n        super.onChange(selfChange);\n        callback.onMonitorTriggered();\n    }\n\n    @Override\n    public void onChange(boolean selfChange, Uri uri) {\n        super.onChange(selfChange, uri);\n        callback.onMonitorTriggered();\n    }\n\n    @Override\n    public void stopObserving() {\n        resolver.unregisterContentObserver(this);\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/events/PreferenceChangedEventsUpdateTrigger.java",
    "content": "package com.alexstyl.specialdates.events;\n\nimport android.content.SharedPreferences;\nimport android.content.res.Resources;\n\nimport com.alexstyl.specialdates.EasyPreferences;\nimport com.alexstyl.specialdates.EventsUpdateTrigger;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic final class PreferenceChangedEventsUpdateTrigger implements EventsUpdateTrigger {\n\n    private final EasyPreferences preferences;\n    private final List<String> keys;\n\n    private SharedPreferences.OnSharedPreferenceChangeListener listener;\n\n    public PreferenceChangedEventsUpdateTrigger(EasyPreferences preferences, Resources strings, int firstKeys, int... keys) {\n        this.preferences = preferences;\n        this.keys = new ArrayList<>(keys.length + 1);\n        this.keys.add(strings.getString(firstKeys));\n        for (int key : keys) {\n            this.keys.add(strings.getString(key));\n        }\n    }\n\n    @Override\n    public void startObserving(final Callback callback) {\n        listener = new SharedPreferences.OnSharedPreferenceChangeListener() {\n            @Override\n            public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {\n                if (isAKeyIcareAbout(key)) {\n                    callback.onMonitorTriggered();\n                }\n            }\n\n        };\n        preferences.addOnPreferenceChangedListener(listener);\n    }\n\n    private boolean isAKeyIcareAbout(String key) {\n        return keys.contains(key);\n    }\n\n    @Override\n    public void stopObserving() {\n        preferences.removeOnPreferenceChagnedListener(listener);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/events/bankholidays/BankHolidaysModule.java",
    "content": "package com.alexstyl.specialdates.events.bankholidays;\n\nimport android.content.Context;\n\nimport com.alexstyl.specialdates.EasyPreferences;\nimport com.alexstyl.specialdates.events.namedays.calendar.OrthodoxEasterCalculator;\n\nimport dagger.Module;\nimport dagger.Provides;\n\n@Module\npublic class BankHolidaysModule {\n\n    @Provides\n    BankHolidaysUserSettings userSettings(Context context) {\n        EasyPreferences preferences = EasyPreferences.createForDefaultPreferences(context);\n        return new BankHolidaysPreferences(preferences);\n    }\n\n    @Provides\n    GreekBankHolidaysCalculator greekBankHolidaysCalculator(OrthodoxEasterCalculator calculator) {\n        return new GreekBankHolidaysCalculator(calculator);\n    }\n\n    @Provides\n    BankHolidayProvider provider(GreekBankHolidaysCalculator bankHolidaysCalculator) {\n        return new BankHolidayProvider(bankHolidaysCalculator);\n    }\n}\n\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/events/bankholidays/BankHolidaysPreferences.java",
    "content": "package com.alexstyl.specialdates.events.bankholidays;\n\nimport com.alexstyl.specialdates.EasyPreferences;\nimport com.alexstyl.specialdates.R;\n\npublic class BankHolidaysPreferences implements BankHolidaysUserSettings {\n\n    private final EasyPreferences preferences;\n\n    BankHolidaysPreferences(EasyPreferences preferences) {\n        this.preferences = preferences;\n    }\n\n    @Override\n    public boolean isEnabled() {\n        return preferences.getBoolean(R.string.key_enable_bank_holidays, R.bool.isBankholidaysSupported);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/events/database/ContactColumns.java",
    "content": "package com.alexstyl.specialdates.events.database;\n\n@SuppressWarnings(\"all\")\ninterface ContactColumns {\n    String CONTACT_ID = \"contact_id\";\n    String DISPLAY_NAME = \"display_name\";\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/events/database/DatabaseContract.java",
    "content": "package com.alexstyl.specialdates.events.database;\n\nimport android.provider.BaseColumns;\n\npublic final class DatabaseContract {\n\n    public static final class AnnualEventsContract implements BaseColumns, ContactColumns, EventColumns {\n        public static final String TABLE_NAME = \"annual_events\";\n    }\n\n    private DatabaseContract() {\n        // hide this\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/events/database/EventSQLiteOpenHelper.kt",
    "content": "package com.alexstyl.specialdates.events.database\n\nimport android.content.Context\nimport android.database.sqlite.SQLiteDatabase\nimport android.database.sqlite.SQLiteOpenHelper\nimport android.provider.BaseColumns._ID\nimport com.alexstyl.specialdates.events.database.ContactColumns.CONTACT_ID\nimport com.alexstyl.specialdates.events.database.ContactColumns.DISPLAY_NAME\nimport com.alexstyl.specialdates.events.database.DatabaseContract.AnnualEventsContract.TABLE_NAME\nimport com.alexstyl.specialdates.events.database.EventColumns.DATE\nimport com.alexstyl.specialdates.events.database.EventColumns.DEVICE_EVENT_ID\nimport com.alexstyl.specialdates.events.database.EventColumns.EVENT_TYPE\nimport com.alexstyl.specialdates.events.database.EventColumns.SOURCE\nimport com.alexstyl.specialdates.events.database.EventColumns.VISIBLE\n\nclass EventSQLiteOpenHelper(context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {\n\n    override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {\n        db.execSQL(\"DROP TABLE IF EXISTS dynamic_events;\")\n        db.execSQL(\"DROP TABLE IF EXISTS annual_events;\")\n        onCreate(db)\n    }\n\n    override fun onCreate(db: SQLiteDatabase) {\n        db.execSQL((\"CREATE TABLE $TABLE_NAME (\"\n                + \"$_ID INTEGER NOT NULL, \"\n                + \"$DISPLAY_NAME TEXT NOT NULL, \"\n                + \"$DEVICE_EVENT_ID INTEGER NOT NULL, \"\n                + \"$CONTACT_ID INTEGER NOT NULL, \"\n                + \"$DATE TEXT NOT NULL, \"\n                + \"$EVENT_TYPE INTEGER NOT NULL, \"\n                + \"$SOURCE INTEGER NOT NULL, \"\n                + \"$VISIBLE INTEGER NOT NULL, \"\n                + \"PRIMARY KEY ($_ID)\"\n                + \");\"))\n    }\n\n    companion object {\n\n        const val DATABASE_VERSION = 5\n\n        private const val DATABASE_NAME = \"events.db\"\n\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/events/namedays/NamedayModule.java",
    "content": "package com.alexstyl.specialdates.events.namedays;\n\nimport android.content.Context;\nimport android.content.res.Resources;\n\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.events.namedays.calendar.NamedayCalendar;\nimport com.alexstyl.specialdates.events.namedays.calendar.OrthodoxEasterCalculator;\nimport com.alexstyl.specialdates.events.namedays.calendar.resource.AndroidJSONResourceLoader;\nimport com.alexstyl.specialdates.events.namedays.calendar.resource.NamedayCalendarProvider;\nimport com.alexstyl.specialdates.events.namedays.calendar.resource.NamedayJSONProvider;\nimport com.alexstyl.specialdates.events.namedays.calendar.resource.RomanianEasterSpecialCalculator;\nimport com.alexstyl.specialdates.events.namedays.calendar.resource.SpecialNamedaysHandlerFactory;\n\nimport javax.inject.Singleton;\n\nimport dagger.Module;\nimport dagger.Provides;\n\n@Module\n@Singleton\npublic class NamedayModule {\n\n    @Provides\n    NamedayJSONProvider namedayJSONProvider(Resources resources) {\n        return new NamedayJSONProvider(new AndroidJSONResourceLoader(resources));\n    }\n\n    @Provides\n    RomanianEasterSpecialCalculator romanianEasterSpecialCalculator(OrthodoxEasterCalculator calculator) {\n        return new RomanianEasterSpecialCalculator(calculator);\n    }\n\n    @Provides\n    OrthodoxEasterCalculator calculator() {\n        return new OrthodoxEasterCalculator();\n    }\n\n    @Provides\n    SpecialNamedaysHandlerFactory handlerFactory(OrthodoxEasterCalculator easterCalculator,\n                                                 RomanianEasterSpecialCalculator romanianEasterCalculator) {\n        return new SpecialNamedaysHandlerFactory(easterCalculator, romanianEasterCalculator);\n    }\n\n    @Provides\n    @Singleton\n    NamedayCalendarProvider provider(OrthodoxEasterCalculator easterCalculator, NamedayJSONProvider namedayJSONProvider, SpecialNamedaysHandlerFactory factory) {\n        return new NamedayCalendarProvider(\n                namedayJSONProvider,\n                factory\n        );\n    }\n\n    @Provides\n    NamedayUserSettings userSettings(Context context) {\n        return new NamedayPreferences(context);\n    }\n\n    @Provides\n    NamedayCalendar calendar(NamedayUserSettings settings, NamedayCalendarProvider namedayCalendarProvider) {\n        NamedayLocale selectedLanguage = settings.getSelectedLanguage();\n        int year = Date.Companion.getCURRENT_YEAR();\n        return namedayCalendarProvider.loadNamedayCalendarForLocale(selectedLanguage, year);\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/events/namedays/NamedayPreferences.java",
    "content": "package com.alexstyl.specialdates.events.namedays;\n\nimport android.content.Context;\n\nimport com.alexstyl.specialdates.EasyPreferences;\nimport com.alexstyl.specialdates.R;\n\npublic final class NamedayPreferences implements NamedayUserSettings {\n\n    private static final String DEFAULT_LOCALE = NamedayLocale.GREEK.getCountryCode();\n\n    private final boolean enabledByDefault;\n    private final EasyPreferences preferences;\n\n    NamedayPreferences(Context context) {\n        this.preferences = EasyPreferences.createForDefaultPreferences(context);\n        this.enabledByDefault = shouldNamedaysBeEnabledByDefault(context);\n    }\n\n    @Override\n    public void setSelectedLanguage(String language) {\n        preferences.setString(R.string.key_nameday_lang, language);\n    }\n\n    @Override\n    public NamedayLocale getSelectedLanguage() {\n        String lang = preferences.getString(R.string.key_nameday_lang, DEFAULT_LOCALE);\n        return NamedayLocale.from(lang);\n    }\n\n    @Override\n    public boolean isEnabled() {\n        return preferences.getBoolean(R.string.key_enable_namedays, enabledByDefault);\n    }\n\n    @Override\n    public boolean isEnabledForContactsOnly() {\n        return preferences.getBoolean(R.string.key_namedays_contacts_only, false);\n    }\n\n    @Override\n    public void setEnabledForContactsOnly(boolean onlyForContacts) {\n        preferences.setBoolean(R.string.key_namedays_contacts_only, onlyForContacts);\n    }\n\n    @Override\n    public boolean shouldLookupAllNames() {\n        return preferences.getBoolean(R.string.key_namedays_full_name, false);\n    }\n\n    private static boolean shouldNamedaysBeEnabledByDefault(Context context) {\n        return context.getResources().getBoolean(R.bool.isNamedaySupported);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/events/namedays/activity/AndroidNamedaysOnADayView.kt",
    "content": "package com.alexstyl.specialdates.events.namedays.activity\n\nclass AndroidNamedaysOnADayView(private val screenAdapter: NamedaysScreenAdapter) : NamedaysOnADayView {\n    override fun displayNamedays(viewModels: List<NamedayScreenViewModel>) {\n        screenAdapter.display(viewModels)\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/events/namedays/activity/CelebratingContactViewHolder.kt",
    "content": "package com.alexstyl.specialdates.events.namedays.activity\n\nimport android.view.View\nimport android.widget.TextView\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.images.ImageLoader\nimport com.alexstyl.specialdates.ui.widget.ColorImageView\n\nclass CelebratingContactViewHolder(view: View,\n                                   private val imageLoader: ImageLoader,\n                                   private val avatarView: ColorImageView,\n                                   private val contactNameView: TextView)\n    : NamedayScreenViewHolder<CelebratingContactViewModel>(view) {\n    override fun bind(viewModel: CelebratingContactViewModel, onContactClicked: (Contact) -> Unit) {\n        val contact = viewModel.contact\n        contactNameView.text = contact.displayName.toString()\n        avatarView.setLetter(viewModel.letter)\n        avatarView.setCircleColorVariant(viewModel.colorVariant)\n        imageLoader.load(contact.imagePath)\n                .asCircle()\n                .into(avatarView.imageView)\n        itemView.setOnClickListener { onContactClicked(contact) }\n    }\n\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/events/namedays/activity/NameViewHolder.kt",
    "content": "package com.alexstyl.specialdates.events.namedays.activity\n\nimport android.view.View\nimport android.widget.TextView\nimport com.alexstyl.specialdates.contact.Contact\n\nclass NameViewHolder(view: View,\n                     private val nameView: TextView)\n    : NamedayScreenViewHolder<NamedaysViewModel>(view) {\n\n    override fun bind(viewModel: NamedaysViewModel, onContactClicked: (Contact) -> Unit) {\n        nameView.text = viewModel.name\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/events/namedays/activity/NamedayScreenViewHolder.kt",
    "content": "package com.alexstyl.specialdates.events.namedays.activity\n\nimport android.support.v7.widget.RecyclerView\nimport android.view.View\nimport com.alexstyl.specialdates.contact.Contact\n\nabstract class NamedayScreenViewHolder<in T : NamedayScreenViewModel>(itemView: View) : RecyclerView.ViewHolder(itemView) {\n    abstract fun bind(viewModel: T, onContactClicked: (Contact) -> Unit)\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/events/namedays/activity/NamedaysInADayModule.java",
    "content": "package com.alexstyl.specialdates.events.namedays.activity;\n\nimport com.alexstyl.specialdates.contact.ContactsProvider;\nimport com.alexstyl.specialdates.events.namedays.NamedayUserSettings;\nimport com.alexstyl.specialdates.events.namedays.calendar.NamedayCalendar;\nimport com.alexstyl.specialdates.ui.widget.AndroidLetterPainter;\n\nimport dagger.Module;\nimport dagger.Provides;\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.schedulers.Schedulers;\n\n@Module\npublic class NamedaysInADayModule {\n\n    @Provides\n    NamedaysViewModelFactory viewModelFactory(AndroidLetterPainter letterPainter) {\n        return new NamedaysViewModelFactory(letterPainter);\n    }\n\n    @Provides\n    NamedaysInADayPresenter presenter(NamedayCalendar calendar,\n                               NamedaysViewModelFactory namedaysViewModelFactory,\n                               ContactsProvider contactsProvider,\n                               NamedayUserSettings namedayUserSettings) {\n        return new NamedaysInADayPresenter(calendar, namedaysViewModelFactory, contactsProvider, namedayUserSettings, Schedulers.io(), AndroidSchedulers.mainThread());\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/events/namedays/activity/NamedaysOnADayActivity.kt",
    "content": "package com.alexstyl.specialdates.events.namedays.activity\n\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport android.support.v7.widget.LinearLayoutManager\nimport android.support.v7.widget.RecyclerView\nimport android.view.LayoutInflater\nimport android.widget.TextView\nimport com.alexstyl.specialdates.MementoApplication\nimport com.alexstyl.specialdates.R\nimport com.alexstyl.specialdates.analytics.Analytics\nimport com.alexstyl.specialdates.analytics.Screen\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.DateLabelCreator\nimport com.alexstyl.specialdates.date.getDateExtraOrThrow\nimport com.alexstyl.specialdates.date.putExtraDate\nimport com.alexstyl.specialdates.images.ImageLoader\nimport com.alexstyl.specialdates.ui.base.ThemedMementoActivity\nimport com.alexstyl.specialdates.ui.widget.MementoToolbar\nimport javax.inject.Inject\n\n\nclass NamedaysOnADayActivity : ThemedMementoActivity() {\n\n    @Inject\n    lateinit var imageLoader: ImageLoader\n    @Inject\n    lateinit var presenter: NamedaysInADayPresenter\n    @Inject\n    lateinit var dateLabelCreator: DateLabelCreator\n    @Inject\n    lateinit var analytics: Analytics\n\n    private var dateView: TextView? = null\n    private var namedaysOnADayNavigator: NamedaysOnADayNavigator? = null\n\n\n    private lateinit var view: NamedaysOnADayView\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_namedays)\n\n        val applicationModule = (application as MementoApplication).applicationModule\n        applicationModule.inject(this)\n\n        analytics.trackScreen(Screen.NAMEDAYS)\n        namedaysOnADayNavigator = NamedaysOnADayNavigator(this, analytics)\n\n        val toolbar = findViewById<MementoToolbar>(R.id.memento_toolbar)\n        toolbar.displayNavigationIconAsUp()\n        setSupportActionBar(toolbar)\n\n        dateView = findViewById(R.id.namedays_date)\n\n        val recyclerView = findViewById<RecyclerView>(R.id.namedays_list)\n        recyclerView.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, false)\n\n\n        val date = intent.getDateExtraOrThrow()\n        dateView?.text = dateLabelCreator.createWithYearPreferred(date)\n\n        val layoutInflater = LayoutInflater.from(this)\n        val adapter = NamedaysScreenAdapter(\n                NamedaysScreenViewHolderFactory(layoutInflater, imageLoader),\n                { contact -> namedaysOnADayNavigator?.toContactDetails(contact) }\n        )\n        recyclerView.adapter = adapter\n        view = AndroidNamedaysOnADayView(adapter)\n    }\n\n    override fun onStart() {\n        super.onStart()\n        val date = intent.getDateExtraOrThrow()\n        presenter.startPresenting(view, date)\n    }\n\n    override fun onStop() {\n        super.onStop()\n        presenter.stopPresenting()\n    }\n\n    companion object {\n        fun getStartIntent(context: Context, date: Date): Intent {\n            return Intent(context, NamedaysOnADayActivity::class.java)\n                    .putExtraDate(date)\n        }\n    }\n}\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/events/namedays/activity/NamedaysOnADayNavigator.kt",
    "content": "package com.alexstyl.specialdates.events.namedays.activity\n\nimport android.app.Activity\nimport com.alexstyl.specialdates.analytics.Analytics\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.person.PersonActivity\n\nclass NamedaysOnADayNavigator(private val activity: Activity, private val analytics: Analytics) {\n    fun toContactDetails(contact: Contact) {\n        val intent = PersonActivity.buildIntentFor(activity, contact)\n        activity.startActivity(intent)\n        analytics.trackNamedaysScreen()\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/events/namedays/activity/NamedaysScreenAdapter.java",
    "content": "package com.alexstyl.specialdates.events.namedays.activity;\n\nimport android.support.annotation.NonNull;\nimport android.support.v7.util.DiffUtil;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.ViewGroup;\n\nimport com.alexstyl.specialdates.contact.Contact;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport kotlin.Unit;\nimport kotlin.jvm.functions.Function1;\n\npublic class NamedaysScreenAdapter extends RecyclerView.Adapter<NamedayScreenViewHolder> {\n\n    private final List<NamedayScreenViewModel> viewModels = new ArrayList<>();\n\n    private final NamedaysScreenViewHolderFactory viewholderFactory;\n    private final Function1<Contact, Unit> onContactClicked;\n\n    public NamedaysScreenAdapter(NamedaysScreenViewHolderFactory viewholderFactory, Function1<Contact, Unit> onContactClicked) {\n        this.viewholderFactory = viewholderFactory;\n        this.onContactClicked = onContactClicked;\n    }\n\n    @Override\n    public int getItemViewType(int position) {\n        return viewModels.get(position).getViewType();\n    }\n\n    @NonNull\n    @Override\n    public NamedayScreenViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {\n        return viewholderFactory.viewHolderFor(parent, viewType);\n    }\n\n    @Override\n    @SuppressWarnings(\"unchecked\")\n    public void onBindViewHolder(@NonNull NamedayScreenViewHolder holder, int position) {\n        holder.bind(viewModels.get(position), onContactClicked);\n    }\n\n    void display(List<NamedayScreenViewModel> viewModels) {\n        DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new NamedaysViewModelDiff(this.viewModels, viewModels));\n        this.viewModels.clear();\n        this.viewModels.addAll(viewModels);\n        diffResult.dispatchUpdatesTo(this);\n    }\n\n    @Override\n    public int getItemCount() {\n        return viewModels.size();\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/events/namedays/activity/NamedaysScreenViewHolderFactory.kt",
    "content": "package com.alexstyl.specialdates.events.namedays.activity\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport com.alexstyl.specialdates.R\nimport com.alexstyl.specialdates.images.ImageLoader\nimport com.alexstyl.specialdates.ui.widget.ColorImageView\n\nclass NamedaysScreenViewHolderFactory(private val layoutInflater: LayoutInflater,\n                                      private val imageLoader: ImageLoader) {\n\n    fun viewHolderFor(parent: ViewGroup, @NamedayScreenViewType viewType: Int): NamedayScreenViewHolder<*> {\n        return when (viewType) {\n            NamedayScreenViewType.NAMEDAY -> {\n                val view = layoutInflater.inflate(R.layout.row_nameday_name, parent, false)\n                val nameView = view.findViewById<TextView>(R.id.nameday_name)\n                NameViewHolder(view, nameView)\n            }\n            NamedayScreenViewType.CONTACT -> {\n                val view = layoutInflater.inflate(R.layout.row_nameday_contact, parent, false)\n                val nameView = view.findViewById<TextView>(R.id.row_nameday_contact_name)\n                val avatarView = view.findViewById<ColorImageView>(R.id.row_nameday_contact_avatar)\n                CelebratingContactViewHolder(view, imageLoader, avatarView, nameView)\n            }\n            else -> throw UnsupportedOperationException(\"Unsupported view type $viewType\")\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/events/namedays/activity/NamedaysViewModelDiff.java",
    "content": "package com.alexstyl.specialdates.events.namedays.activity;\n\nimport android.support.v7.util.DiffUtil;\n\nimport java.util.List;\n\nfinal class NamedaysViewModelDiff extends DiffUtil.Callback {\n\n    private final List<NamedayScreenViewModel> oldModels;\n    private final List<NamedayScreenViewModel> newModels;\n\n    NamedaysViewModelDiff(List<NamedayScreenViewModel> oldModels, List<NamedayScreenViewModel> newModels) {\n        this.oldModels = oldModels;\n        this.newModels = newModels;\n    }\n\n    @Override\n    public int getOldListSize() {\n        return oldModels.size();\n    }\n\n    @Override\n    public int getNewListSize() {\n        return newModels.size();\n    }\n\n    @Override\n    public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {\n        return oldModels.get(oldItemPosition).getViewType() == newModels.get(newItemPosition).getViewType()\n                && oldModels.get(oldItemPosition).getId() == newModels.get(newItemPosition).getId();\n    }\n\n    @Override\n    public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {\n        return oldModels.get(oldItemPosition).equals(newModels.get(newItemPosition));\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/events/namedays/calendar/resource/AndroidJSONResourceLoader.kt",
    "content": "package com.alexstyl.specialdates.events.namedays.calendar.resource\n\nimport android.content.res.Resources\nimport com.alexstyl.specialdates.R\n\nimport com.alexstyl.specialdates.events.namedays.NamedayLocale\n\nimport java.io.ByteArrayOutputStream\nimport java.io.IOException\nimport java.io.InputStream\n\nimport org.json.JSONException\nimport org.json.JSONObject\n\nclass AndroidJSONResourceLoader(private val resources: Resources) : NamedayJSONResourceLoader {\n\n    @Throws(JSONException::class)\n    override fun loadJSON(locale: NamedayLocale): JSONObject {\n        val inputStream = resources.openRawResource(locale.rawResId())\n        val outputStream = ByteArrayOutputStream()\n\n        var ctr: Int\n        try {\n            ctr = inputStream.read()\n            while (ctr != -1) {\n                outputStream.write(ctr)\n                ctr = inputStream.read()\n            }\n            inputStream.close()\n            return JSONObject(outputStream.toString(\"UTF-8\"))\n        } catch (e: IOException) {\n            throw JSONException(e.message)\n        } catch (e: JSONException) {\n            throw JSONException(e.message)\n        }\n\n    }\n\n}\n\nprivate fun NamedayLocale.rawResId(): Int = when(this){\n    NamedayLocale.GREEK -> R.raw.gr_namedays\n    NamedayLocale.ROMANIAN -> R.raw.ro_namedays\n    NamedayLocale.RUSSIAN -> R.raw.ru_namedays\n    NamedayLocale.LATVIAN -> R.raw.lv_namedays\n    NamedayLocale.LATVIAN_EXTENDED -> R.raw.lv_ext_namedays\n    NamedayLocale.SLOVAK -> R.raw.sk_namedays\n    NamedayLocale.ITALIAN -> R.raw.it_namedays\n    NamedayLocale.CZECH -> R.raw.cs_namedays\n    NamedayLocale.HUNGARIAN -> R.raw.hu_namedays\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/events/peopleevents/AndroidPeopleEventsPersister.kt",
    "content": "package com.alexstyl.specialdates.events.peopleevents\n\nimport android.content.ContentValues\nimport android.database.sqlite.SQLiteDatabase\nimport android.database.sqlite.SQLiteException\nimport android.database.sqlite.SQLiteOpenHelper\nimport com.alexstyl.specialdates.CrashAndErrorTracker\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.contact.ContactSource\nimport com.alexstyl.specialdates.date.ContactEvent\nimport com.alexstyl.specialdates.events.database.DatabaseContract.AnnualEventsContract\nimport com.alexstyl.specialdates.events.database.EventColumns\nimport com.alexstyl.specialdates.events.database.EventTypeId.TYPE_NAMEDAY\n\nclass AndroidPeopleEventsPersister(private val helper: SQLiteOpenHelper,\n                                   private val marshaller: ContactEventsMarshaller,\n                                   private val tracker: CrashAndErrorTracker)\n    : PeopleEventsPersister {\n\n    override fun deleteAllNamedays() {\n        helper.writableDatabase\n                .executeTransaction {\n                    delete(\n                            AnnualEventsContract.TABLE_NAME,\n                            \"${AnnualEventsContract.EVENT_TYPE}  ==  $TYPE_NAMEDAY\",\n                            null)\n                }\n    }\n\n\n    override fun deleteAllEventsOfSource(@ContactSource source: Int) {\n        helper.writableDatabase\n                .executeTransaction {\n                    delete(AnnualEventsContract.TABLE_NAME,\n                            AnnualEventsContract.SOURCE + \"==\" + source,\n                            null)\n                }\n    }\n\n    override fun deleteAllDeviceEvents() {\n        helper.writableDatabase\n                .executeTransaction {\n                    delete(AnnualEventsContract.TABLE_NAME,\n                            \"${EventColumns.SOURCE}  ==  ${ContactSource.SOURCE_DEVICE}\" +\n                                    \" AND ${EventColumns.EVENT_TYPE}  != ${StandardEventType.NAMEDAY.id}\"\n                            , null)\n                }\n    }\n\n    override fun insertAnnualEvents(events: List<ContactEvent>) {\n        helper.writableDatabase\n                .executeTransaction {\n                    marshaller\n                            .marshall(events)\n                            .forEach { contentValues ->\n                                insert(AnnualEventsContract.TABLE_NAME, null, contentValues)\n                            }\n                }\n    }\n\n    override fun markContactAsVisible(contact: Contact) {\n        helper.writableDatabase\n                .executeTransaction {\n                    update(\n                            AnnualEventsContract.TABLE_NAME,\n                            visible(),\n                            AnnualEventsContract.CONTACT_ID + \" = \" + contact.contactID\n                                    + \" AND \" + AnnualEventsContract.SOURCE + \" = \" + contact.source, null)\n\n                }\n\n    }\n\n    private fun visible(): ContentValues {\n        return ContentValues(1).apply {\n            put(AnnualEventsContract.VISIBLE, 1)\n        }\n    }\n\n    override fun markContactAsHidden(contact: Contact) {\n        helper.writableDatabase\n                .executeTransaction {\n                    update(AnnualEventsContract.TABLE_NAME,\n                            hidden(),\n                            AnnualEventsContract.CONTACT_ID + \" = \" + contact.contactID\n                                    + \" AND \" + AnnualEventsContract.SOURCE + \" = \" + contact.source, null)\n                }\n\n    }\n\n    private fun hidden(): ContentValues {\n        val values = ContentValues(1)\n        values.put(AnnualEventsContract.VISIBLE, 0)\n        return values\n    }\n\n    override fun getVisibilityFor(contact: Contact): Boolean {\n        val database = helper.writableDatabase\n        // TODO just COUNT() events the contact has\n        val query = database.query(\n                AnnualEventsContract.TABLE_NAME, null,\n                AnnualEventsContract.CONTACT_ID + \" == \" + contact.contactID\n                        + \" AND \" + AnnualEventsContract.SOURCE + \" == \" + contact.source\n                        + \" AND \" + AnnualEventsContract.VISIBLE + \" = 1\", null, null, null, null\n        )\n        val count = query.count\n        query.close()\n        return count > 0\n    }\n\n    private inline fun SQLiteDatabase.executeTransaction(function: SQLiteDatabase.() -> Unit) {\n        try {\n            this.beginTransaction()\n            function(this)\n            this.setTransactionSuccessful()\n        } catch (e: SQLiteException) {\n            tracker.track(e)\n        } finally {\n            this.endTransaction()\n        }\n    }\n}\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/events/peopleevents/AndroidPeopleEventsProvider.kt",
    "content": "package com.alexstyl.specialdates.events.peopleevents\n\nimport android.database.Cursor\nimport android.database.MergeCursor\nimport android.database.sqlite.SQLiteDatabase\nimport com.alexstyl.specialdates.CrashAndErrorTracker\nimport com.alexstyl.specialdates.Optional\nimport com.alexstyl.specialdates.SQLArgumentBuilder\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.contact.ContactNotFoundException\nimport com.alexstyl.specialdates.contact.ContactSource\nimport com.alexstyl.specialdates.contact.Contacts\nimport com.alexstyl.specialdates.contact.ContactsProvider\nimport com.alexstyl.specialdates.date.ContactEvent\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.DateParser\nimport com.alexstyl.specialdates.date.TimePeriod\nimport com.alexstyl.specialdates.events.database.DatabaseContract.AnnualEventsContract\nimport com.alexstyl.specialdates.events.database.EventSQLiteOpenHelper\nimport com.alexstyl.specialdates.events.database.EventTypeId\nimport com.alexstyl.specialdates.events.database.EventTypeId.TYPE_CUSTOM\nimport com.novoda.notils.logger.simple.Log\n\nclass AndroidPeopleEventsProvider(private val eventSQLHelper: EventSQLiteOpenHelper,\n                                  private val contactsProvider: ContactsProvider,\n                                  private val customEventProvider: CustomEventProvider,\n                                  private val dateParser: DateParser,\n                                  private val tracker: CrashAndErrorTracker,\n                                  private val shortDateLabelCreator: ShortDateLabelCreator) : PeopleEventsProvider {\n\n    override fun fetchEventsOn(date: Date): ContactEventsOnADate {\n        return ContactEventsOnADate.createFrom(date, fetchEventsBetween(TimePeriod.between(date, date)))\n    }\n\n    override fun fetchEventsBetween(timePeriod: TimePeriod): List<ContactEvent> {\n        val cursor = queryEventsFor(timePeriod)\n        val contactEvents = ArrayList<ContactEvent>(cursor.count)\n\n        val deviceIds = ArrayList<Long>(cursor.count)\n        val facebookIds = ArrayList<Long>(cursor.count)\n\n        while (cursor.moveToNext()) {\n            val contactId = getContactIdFrom(cursor)\n            val source = getContactSourceFrom(cursor)\n\n            when (source) {\n                ContactSource.SOURCE_DEVICE -> deviceIds.add(contactId)\n                ContactSource.SOURCE_FACEBOOK -> facebookIds.add(contactId)\n                else -> throw UnsupportedOperationException(\"Source $source not managed\")\n            }\n        }\n\n        val deviceContacts = contactsProvider.getContacts(deviceIds, ContactSource.SOURCE_DEVICE)\n        val facebookContacts = contactsProvider.getContacts(facebookIds, ContactSource.SOURCE_FACEBOOK)\n        val contacts = HashMap<Int, Contacts>()\n        contacts[ContactSource.SOURCE_DEVICE] = deviceContacts\n        contacts[ContactSource.SOURCE_FACEBOOK] = facebookContacts\n\n        cursor.moveToFirst()\n        while (!cursor.isAfterLast) {\n            try {\n                val contactsOfSource = contacts[getContactSourceFrom(cursor)]\n                val contact = contactsOfSource?.getContact(getContactIdFrom(cursor))\n                if (contact != null) {\n                    val contactEvent = getContactEventFrom(cursor, contact)\n                    contactEvents.add(contactEvent)\n                }\n            } catch (e: ContactNotFoundException) {\n                tracker.track(e)\n            }\n\n            cursor.moveToNext()\n        }\n        cursor.close()\n        return contactEvents.toList()\n    }\n\n    override fun fetchEventsFor(contact: Contact): List<ContactEvent> {\n        val contactEvents = ArrayList<ContactEvent>()\n        val cursor = queryEventsOf(contact)\n        while (cursor.moveToNext()) {\n            try {\n                val contactEvent = getContactEventFrom(cursor, contact)\n                contactEvents.add(contactEvent)\n            } catch (e: ContactNotFoundException) {\n                Log.w(e)\n            }\n\n        }\n        cursor.close()\n        return contactEvents.toList()\n    }\n\n    private fun queryEventsFor(timeDuration: TimePeriod): Cursor {\n        return if (isWithinTheSameYear(timeDuration)) {\n            queryPeopleEvents(timeDuration, AnnualEventsContract.DATE + \" ASC\")\n        } else {\n            queryAllYearsIn(timeDuration)\n        }\n    }\n\n    private fun queryEventsOf(contact: Contact): Cursor {\n        val selectArgs = arrayOf(contact.contactID.toString(), contact.source.toString())\n\n        // query database\n        return eventSQLHelper.readableDatabase.query(\n                AnnualEventsContract.TABLE_NAME,\n                PROJECTION,\n                AnnualEventsContract.CONTACT_ID + \" = ? \"\n                        + \"AND \" + AnnualEventsContract.SOURCE + \" = ?\",\n                selectArgs, null, null, null\n        )\n    }\n\n    private fun queryPeopleEvents(timePeriod: TimePeriod, sortOrder: String): Cursor {\n        val selectArgs = arrayOf(SQLArgumentBuilder.dateWithoutYear(timePeriod.startingDate),\n                SQLArgumentBuilder.dateWithoutYear(timePeriod.endingDate)\n        )\n\n        return eventSQLHelper.readableDatabase.query(\n                AnnualEventsContract.TABLE_NAME,\n                PROJECTION,\n                DATE_BETWEEN_IGNORING_YEAR,\n                selectArgs, null, null,\n                sortOrder\n        )\n    }\n\n    private fun queryAllYearsIn(timeDuration: TimePeriod): Cursor {\n        val firstHalf = firstHalfOf(timeDuration)\n        val cursors = arrayOfNulls<Cursor>(2)\n        cursors[0] = queryPeopleEvents(firstHalf, AnnualEventsContract.DATE + \" ASC\")\n        val secondHalf = secondHalfOf(timeDuration)\n        cursors[1] = queryPeopleEvents(secondHalf, AnnualEventsContract.DATE + \" ASC\")\n        return MergeCursor(cursors)\n    }\n\n    private fun isWithinTheSameYear(timeDuration: TimePeriod): Boolean {\n        return timeDuration.startingDate.year == timeDuration.endingDate.year\n    }\n\n    override fun findClosestEventDateOnOrAfter(date: Date): Date? =\n            eventSQLHelper\n                    .readableDatabase\n                    .queryFirstEventOnOrAfter(date)\n                    .use { cursor ->\n                        return if (cursor.moveToFirst()) {\n                            return cursor.getDate().withYear(date.year)\n                        } else {\n                            null\n                        }\n                    }\n\n    private fun Date.withYear(year: Int): Date = Date.on(this.dayOfMonth, this.month, year)\n\n    private fun SQLiteDatabase.queryFirstEventOnOrAfter(date: Date): Cursor =\n            query(\n                    AnnualEventsContract.TABLE_NAME,\n                    AndroidPeopleEventsProvider.PEOPLE_PROJECTION,\n                    \"${AndroidPeopleEventsProvider.DATE_COLUMN_WITHOUT_YEAR} >= ?\",\n                    monthAndDayOf(date),\n                    null, null,\n                    \"${AndroidPeopleEventsProvider.DATE_COLUMN_WITHOUT_YEAR} ASC LIMIT 1\")\n\n    private fun monthAndDayOf(date: Date): Array<String> {\n        return arrayOf(shortDateLabelCreator.createLabelWithNoYearFor(date))\n    }\n\n    private fun getEventType(cursor: Cursor): EventType {\n        val eventTypeIndex = cursor.getColumnIndexOrThrow(AnnualEventsContract.EVENT_TYPE)\n        @EventTypeId val rawEventType = cursor.getInt(eventTypeIndex)\n        if (rawEventType == TYPE_CUSTOM) {\n            val deviceEventIdFrom = getDeviceEventIdFrom(cursor)\n            return if (deviceEventIdFrom.isPresent) {\n                queryCustomEvent(deviceEventIdFrom.get())\n            } else StandardEventType.OTHER\n        }\n        return StandardEventType.fromId(rawEventType)\n    }\n\n    @Throws(ContactNotFoundException::class)\n    private fun getContactEventFrom(cursor: Cursor, contact: Contact): ContactEvent {\n        val date = cursor.getDate()\n        val eventType = getEventType(cursor)\n\n        val eventId = getDeviceEventIdFrom(cursor)\n        return ContactEvent(eventId, eventType, date, contact)\n    }\n\n    @ContactSource\n    private fun getContactSourceFrom(cursor: Cursor): Int {\n        val sourceTypeIndex = cursor.getColumnIndexOrThrow(AnnualEventsContract.SOURCE)\n        return cursor.getInt(sourceTypeIndex)\n    }\n\n    private fun queryCustomEvent(deviceId: Long): EventType {\n        return customEventProvider.getEventWithId(deviceId)\n    }\n\n    private fun Cursor.getDate(): Date {\n        val index = getColumnIndexOrThrow(AnnualEventsContract.DATE)\n        val rawDate = getString(index)\n        return dateParser.parse(rawDate)\n    }\n\n    companion object {\n\n        private const val DATE_FROM = \"substr(\" + AnnualEventsContract.DATE + \",-5) >= ?\"\n        private const val DATE_TO = \"substr(\" + AnnualEventsContract.DATE + \",-5) <= ?\"\n        private const val DATE_BETWEEN_IGNORING_YEAR = DATE_FROM + \" AND \" + DATE_TO + \" AND \" + AnnualEventsContract.VISIBLE + \" == 1\"\n        private val PEOPLE_PROJECTION = arrayOf(AnnualEventsContract.DATE)\n        private val PROJECTION = arrayOf(\n                AnnualEventsContract.CONTACT_ID,\n                AnnualEventsContract.DEVICE_EVENT_ID,\n                AnnualEventsContract.DATE,\n                AnnualEventsContract.EVENT_TYPE,\n                AnnualEventsContract.SOURCE\n        )\n\n        /*\n        We use this column in order to be able to do comparisons of dates, without having to worry about the year\n        So, instead of a full date 1990-12-19, this will return 12-19. Similarwise for --12-19.\n\n        an example in use: select * from annual_events WHERE substr(date,-5) >= '03-04' ORDER BY substr(date,-5) asc LIMIT 1\n     */\n        private const val DATE_COLUMN_WITHOUT_YEAR = \"substr(\" + AnnualEventsContract.DATE + \", -5) \"\n\n        private fun firstHalfOf(timeDuration: TimePeriod): TimePeriod {\n            return TimePeriod.between(\n                    timeDuration.startingDate,\n                    Date.endOfYear(timeDuration.startingDate.year)\n            )\n        }\n\n        private fun secondHalfOf(timeDuration: TimePeriod): TimePeriod {\n            return TimePeriod.between(\n                    Date.startOfYear(timeDuration.endingDate.year),\n                    timeDuration.endingDate\n            )\n        }\n\n\n        private fun getContactIdFrom(cursor: Cursor): Long {\n            val contactIdIndex = cursor.getColumnIndexOrThrow(AnnualEventsContract.CONTACT_ID)\n            return cursor.getLong(contactIdIndex)\n        }\n\n        private fun getDeviceEventIdFrom(cursor: Cursor): Optional<Long> {\n            val eventId = cursor.getColumnIndexOrThrow(AnnualEventsContract.DEVICE_EVENT_ID)\n            val deviceEventId = cursor.getLong(eventId)\n            return if (isALegitEventId(deviceEventId)) {\n                Optional.absent()\n            } else Optional(deviceEventId)\n        }\n\n        private fun isALegitEventId(deviceEventId: Long): Boolean {\n            return deviceEventId == -1L\n        }\n\n    }\n\n}\n\n\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/events/peopleevents/AndroidPeopleEventsRepository.kt",
    "content": "package com.alexstyl.specialdates.events.peopleevents\n\nimport android.content.ContentResolver\nimport android.database.Cursor\nimport android.provider.ContactsContract\nimport com.alexstyl.specialdates.CrashAndErrorTracker\nimport com.alexstyl.specialdates.Optional\nimport com.alexstyl.specialdates.contact.ContactNotFoundException\nimport com.alexstyl.specialdates.contact.ContactSource.SOURCE_DEVICE\nimport com.alexstyl.specialdates.contact.ContactsProvider\nimport com.alexstyl.specialdates.date.ContactEvent\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.DateParseException\nimport com.alexstyl.specialdates.date.DateParser\nimport com.novoda.notils.logger.simple.Log\n\nclass AndroidPeopleEventsRepository(private val contentResolver: ContentResolver,\n                                    private val contactsProvider: ContactsProvider,\n                                    private val dateParser: DateParser,\n                                    private val tracker: CrashAndErrorTracker) : PeopleEventsRepository {\n\n    override fun fetchPeopleWithEvents(): List<ContactEvent> {\n        val cursor = contentResolver.query(CONTENT_URI, PROJECTION, SELECTION, SELECT_ARGS, SORT_ORDER)\n        if (isInvalid(cursor)) {\n            return emptyList()\n        }\n        val events = ArrayList<ContactEvent>()\n        try {\n            while (cursor!!.moveToNext()) {\n                val contactId = getContactIdFrom(cursor)\n                val eventType = getEventTypeFrom(cursor)\n                try {\n                    val eventDate = getEventDateFrom(cursor)\n                    val eventId = getEventIdFrom(cursor)\n                    val contact = contactsProvider.getContact(contactId, SOURCE_DEVICE)\n                    events.add(ContactEvent(Optional(eventId), eventType, eventDate, contact))\n                } catch (e: DateParseException) {\n                    tracker.track(e)\n                } catch (e: ContactNotFoundException) {\n                    Log.e(e)\n                }\n\n            }\n        } finally {\n            cursor!!.close()\n        }\n        return events\n    }\n\n    private fun getContactIdFrom(cursor: Cursor): Long {\n        val contactIdIndex = cursor.getColumnIndex(ContactsContract.Data.CONTACT_ID)\n        return cursor.getLong(contactIdIndex)\n    }\n\n    @Throws(DateParseException::class)\n    private fun getEventDateFrom(cursor: Cursor): Date {\n        val dateIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Event.START_DATE)\n        val dateRaw = cursor.getString(dateIndex)\n\n        return dateParser.parse(dateRaw)\n    }\n\n    private fun getEventTypeFrom(cursor: Cursor): EventType {\n        val eventTypeIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Event.TYPE)\n        val eventTypeRaw = cursor.getInt(eventTypeIndex)\n        return when (eventTypeRaw) {\n            ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY -> StandardEventType.BIRTHDAY\n            ContactsContract.CommonDataKinds.Event.TYPE_ANNIVERSARY -> StandardEventType.ANNIVERSARY\n            ContactsContract.CommonDataKinds.Event.TYPE_CUSTOM -> StandardEventType.CUSTOM\n            else -> StandardEventType.OTHER\n        }\n    }\n\n    private fun isInvalid(cursor: Cursor?): Boolean {\n        return cursor == null || cursor.isClosed\n    }\n\n    companion object {\n\n        private val CONTENT_URI = ContactsContract.Data.CONTENT_URI\n        private val PROJECTION = arrayOf(\n                ContactsContract.Data.CONTACT_ID,\n                ContactsContract.CommonDataKinds.Event.TYPE,\n                ContactsContract.CommonDataKinds.Event._ID,\n                ContactsContract.CommonDataKinds.Event.START_DATE\n        )\n        private const val SELECTION = (\n                \"( \" + ContactsContract.Data.MIMETYPE + \" = ? \"\n                        + \" AND \" + ContactsContract.Data.IN_VISIBLE_GROUP + \" = 1)\")\n\n        private val SELECT_ARGS = arrayOf(ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE)\n        private val SORT_ORDER: String? = null\n\n        private fun getEventIdFrom(cursor: Cursor): Long {\n            val eventIdIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Event._ID)\n            return cursor.getLong(eventIdIndex)\n        }\n    }\n\n}\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/events/peopleevents/AndroidUpcomingEventSettings.kt",
    "content": "package com.alexstyl.specialdates.events.peopleevents\n\nimport android.content.Context\n\nimport com.alexstyl.specialdates.EasyPreferences\nimport com.alexstyl.specialdates.R\nimport com.alexstyl.specialdates.events.database.EventSQLiteOpenHelper\n\nclass AndroidUpcomingEventSettings(context: Context) : UpcomingEventsSettings {\n\n    private val preferences: EasyPreferences = EasyPreferences.createForPrivatePreferences(context, R.string.pref_events)\n\n    override fun hasBeenInitialised(): Boolean {\n        return isUpdatedVersion() && preferences.getBoolean(R.string.key_events_are_initialised, false)\n    }\n\n    private fun isUpdatedVersion(): Boolean {\n        val lastDatabaseVersion = preferences.getInt(R.string.key_database_version, -1)\n        return lastDatabaseVersion >= EventSQLiteOpenHelper.DATABASE_VERSION\n    }\n\n    override fun markEventsAsInitialised() {\n        preferences.setBoolean(R.string.key_events_are_initialised, true)\n        preferences.setInteger(R.string.key_database_version, EventSQLiteOpenHelper.DATABASE_VERSION)\n    }\n\n    override fun reset() {\n        preferences.setBoolean(R.string.key_events_are_initialised, false)\n    }\n}\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/events/peopleevents/ContactEventsMarshaller.java",
    "content": "package com.alexstyl.specialdates.events.peopleevents;\n\nimport android.content.ContentValues;\n\nimport com.alexstyl.specialdates.Optional;\nimport com.alexstyl.specialdates.contact.Contact;\nimport com.alexstyl.specialdates.date.ContactEvent;\nimport com.alexstyl.specialdates.events.database.DatabaseContract.AnnualEventsContract;\n\nimport java.util.List;\n\npublic class ContactEventsMarshaller {\n\n    private static final int DEFAULT_VALUES_SIZE = 5;\n    private static final int IS_VISIBILE = 1;\n\n    private final ShortDateLabelCreator dateLabelCreator;\n\n    public ContactEventsMarshaller(ShortDateLabelCreator dateLabelCreator) {\n        this.dateLabelCreator = dateLabelCreator;\n    }\n\n    public ContentValues[] marshall(List<ContactEvent> item) {\n        ContentValues[] returningValues = new ContentValues[item.size()];\n        for (int i = 0; i < item.size(); i++) {\n            ContactEvent event = item.get(i);\n            returningValues[i] = createValuesFor(event);\n        }\n        return returningValues;\n    }\n\n    private ContentValues createValuesFor(ContactEvent event) {\n        Contact contact = event.getContact();\n\n        ContentValues values = new ContentValues(DEFAULT_VALUES_SIZE);\n\n        values.put(AnnualEventsContract.CONTACT_ID, contact.getContactID());\n        values.put(AnnualEventsContract.DISPLAY_NAME, contact.getDisplayName().toString());\n        values.put(AnnualEventsContract.DATE, dateLabelCreator.createLabelWithYearPreferredFor(event.getDate()));\n        values.put(AnnualEventsContract.EVENT_TYPE, event.getType().getId());\n        values.put(AnnualEventsContract.SOURCE, contact.getSource());\n        values.put(AnnualEventsContract.VISIBLE, IS_VISIBILE);\n\n        putDeviceContactIdIfPresent(event, values);\n\n        return values;\n    }\n\n    private void putDeviceContactIdIfPresent(ContactEvent event, ContentValues values) {\n        Optional<Long> deviceEventId = event.getDeviceEventId();\n        if (deviceEventId.isPresent()) {\n            values.put(AnnualEventsContract.DEVICE_EVENT_ID, deviceEventId.get());\n        } else {\n            values.put(AnnualEventsContract.DEVICE_EVENT_ID, -1);\n        }\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/events/peopleevents/CustomEventProvider.kt",
    "content": "package com.alexstyl.specialdates.events.peopleevents\n\nimport android.content.ContentResolver\nimport android.provider.ContactsContract\n\nclass CustomEventProvider(private val resolver: ContentResolver) {\n\n    fun getEventWithId(deviceId: Long): EventType {\n\n        resolver\n                .query(CONTENT_URI,\n                        PROJECTION,\n                        SELECTION,\n                        arrayOf(deviceId.toString(), ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE),\n                        SORT_ORDER)\n                .use { cursor ->\n                    if (cursor.moveToFirst()) {\n                        val columnIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Event.LABEL)\n                        val eventName = cursor.getString(columnIndex)\n                        return CustomEventType(eventName)\n                    }\n                }\n        return StandardEventType.OTHER\n    }\n\n    companion object {\n\n        private val CONTENT_URI = ContactsContract.Data.CONTENT_URI\n        private val PROJECTION = arrayOf(ContactsContract.CommonDataKinds.Event.LABEL)\n        private const val SELECTION = (\n                \"( \" + ContactsContract.Data._ID + \" = ?\"\n                        + \" AND \" + ContactsContract.Data.MIMETYPE + \" = ? \"\n                        + \" AND \" + ContactsContract.Data.IN_VISIBLE_GROUP + \" = 1\"\n                        + \")\")\n\n        private const val SORT_ORDER = ContactsContract.CommonDataKinds.Event._ID + \" LIMIT 1\"\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/events/peopleevents/PeopleEventsModule.kt",
    "content": "package com.alexstyl.specialdates.events.peopleevents\n\nimport android.appwidget.AppWidgetManager\nimport android.content.ContentResolver\nimport android.content.Context\nimport com.alexstyl.specialdates.CrashAndErrorTracker\nimport com.alexstyl.specialdates.contact.ContactsProvider\nimport com.alexstyl.specialdates.date.DateParser\nimport com.alexstyl.specialdates.events.SettingsPresenter\nimport com.alexstyl.specialdates.events.database.EventSQLiteOpenHelper\nimport com.alexstyl.specialdates.events.namedays.NamedayDatabaseRefresher\nimport com.alexstyl.specialdates.events.namedays.NamedayUserSettings\nimport com.alexstyl.specialdates.events.namedays.calendar.resource.NamedayCalendarProvider\nimport com.alexstyl.specialdates.upcoming.widget.list.UpcomingEventsScrollingWidgetView\nimport com.alexstyl.specialdates.upcoming.widget.today.TodayUpcomingEventsView\nimport com.alexstyl.specialdates.wear.WearSyncUpcomingEventsView\nimport dagger.Module\nimport dagger.Provides\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.schedulers.Schedulers\nimport javax.inject.Singleton\n\n@Module\n@Singleton\nclass PeopleEventsModule(private val context: Context) {\n\n    @Provides\n    fun peopleEventsProvider(peopleDynamicNamedaysProvider: PeopleDynamicNamedaysProvider,\n                             androidPeopleEventsProvider: AndroidPeopleEventsProvider): PeopleEventsProvider {\n        return CompositePeopleEventsProvider(listOf(peopleDynamicNamedaysProvider, androidPeopleEventsProvider))\n    }\n\n    @Provides\n    fun androidPeopleEventsProvider(sqLiteOpenHelper: EventSQLiteOpenHelper,\n                                    contactsProvider: ContactsProvider,\n                                    dateParser: DateParser,\n                                    tracker: CrashAndErrorTracker,\n                                    shortLabelCreator: ShortDateLabelCreator): AndroidPeopleEventsProvider {\n        return AndroidPeopleEventsProvider(\n                sqLiteOpenHelper,\n                contactsProvider,\n                CustomEventProvider(context.contentResolver),\n                dateParser,\n                tracker,\n                shortLabelCreator\n        )\n    }\n\n    @Provides\n    fun peopleNamedayCalculator(namedayPreferences: NamedayUserSettings,\n                                namedaysCalendarProvider: NamedayCalendarProvider,\n                                contactsProvider: ContactsProvider): PeopleDynamicNamedaysProvider {\n        return PeopleDynamicNamedaysProvider(namedayPreferences, namedaysCalendarProvider, contactsProvider)\n    }\n\n    @Provides\n    @Singleton\n    fun peopleEventsViewRefresher(appContext: Context, appWidgetManager: AppWidgetManager): UpcomingEventsViewRefresher {\n        return UpcomingEventsViewRefresher(mutableSetOf(\n                WearSyncUpcomingEventsView(appContext),\n                TodayUpcomingEventsView(appContext, appWidgetManager),\n                UpcomingEventsScrollingWidgetView(appContext, appWidgetManager)\n        ))\n    }\n\n    @Provides\n    fun peopleEventsStaticEventsRefresher(\n            eventSQlite: EventSQLiteOpenHelper,\n            contentResolver: ContentResolver,\n            contactsProvider: ContactsProvider,\n            dateParser: DateParser,\n            marshaller: ContactEventsMarshaller,\n            tracker: CrashAndErrorTracker): PeopleEventsStaticEventsRefresher {\n        val repository = AndroidPeopleEventsRepository(contentResolver, contactsProvider, dateParser, tracker)\n        val androidPeopleEventsPersister = AndroidPeopleEventsPersister(eventSQlite, marshaller, tracker)\n        return PeopleEventsStaticEventsRefresher(repository, androidPeopleEventsPersister)\n    }\n\n    @Provides\n    fun namedayDatabaseRefresher(namedayUserSettings: NamedayUserSettings,\n                                 databaseProvider: PeopleEventsPersister,\n                                 provider: PeopleDynamicNamedaysProvider): NamedayDatabaseRefresher {\n        return NamedayDatabaseRefresher(namedayUserSettings, databaseProvider, provider)\n    }\n\n    @Provides\n    fun peopleEventsUpdater(staticRefresher: PeopleEventsStaticEventsRefresher,\n                            namedayRefresher: NamedayDatabaseRefresher,\n                            viewRefresher: UpcomingEventsViewRefresher,\n                            settings: UpcomingEventsSettings): PeopleEventsUpdater {\n        return PeopleEventsUpdater(\n                staticRefresher,\n                namedayRefresher,\n                viewRefresher,\n                settings,\n                Schedulers.io(),\n                AndroidSchedulers.mainThread()\n        )\n    }\n\n\n    @Provides\n    fun marshaller(dateLabelCreator: ShortDateLabelCreator) = ContactEventsMarshaller(dateLabelCreator)\n\n    @Provides\n    fun peopleEventsPersister(tracker: CrashAndErrorTracker,\n                              marshaller: ContactEventsMarshaller,\n                              helper: EventSQLiteOpenHelper): PeopleEventsPersister {\n        return AndroidPeopleEventsPersister(helper, marshaller, tracker)\n    }\n\n    @Provides\n    fun eventPreferences(): UpcomingEventsSettings {\n        return AndroidUpcomingEventSettings(context)\n    }\n\n    @Provides\n    fun peopleEventsDatabaseUpdater(uiRefresher: UpcomingEventsViewRefresher, peopleEventsUpdater: PeopleEventsUpdater): SettingsPresenter {\n        return SettingsPresenter(peopleEventsUpdater, uiRefresher, Schedulers.io())\n    }\n\n    @Provides\n    fun shortDateCreator() = ShortDateLabelCreator()\n\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/facebook/AndroidFacebookPreferences.java",
    "content": "package com.alexstyl.specialdates.facebook;\n\nimport com.alexstyl.specialdates.EasyPreferences;\nimport com.alexstyl.specialdates.R;\n\npublic final class AndroidFacebookPreferences implements FacebookUserSettings {\n    private final EasyPreferences preferences;\n\n    AndroidFacebookPreferences(EasyPreferences preferences) {\n        this.preferences = preferences;\n    }\n\n    @Override\n    public void store(UserCredentials userCredentials) {\n        preferences.setLong(R.string.key_facebook_user_id, userCredentials.getUid());\n        preferences.setString(R.string.key_facebook_user_key, userCredentials.getKey());\n        preferences.setString(R.string.key_facebook_user_name, userCredentials.getName());\n    }\n\n    @Override\n    public UserCredentials retrieveCredentials() {\n        long uid = preferences.getLong(R.string.key_facebook_user_id, -1);\n        String key = preferences.getString(R.string.key_facebook_user_key, \"\");\n        String name = preferences.getString(R.string.key_facebook_user_name, \"\");\n        return new UserCredentials(uid, key, name);\n    }\n\n    @Override\n    public boolean isLoggedIn() {\n        return !UserCredentials.ANNONYMOUS.equals(retrieveCredentials());\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/facebook/FacebookLogoutService.java",
    "content": "package com.alexstyl.specialdates.facebook;\n\nimport com.alexstyl.specialdates.events.peopleevents.UpcomingEventsViewRefresher;\nimport com.alexstyl.specialdates.facebook.friendimport.FacebookFriendsPersister;\n\nimport io.reactivex.Completable;\nimport io.reactivex.Scheduler;\nimport io.reactivex.disposables.CompositeDisposable;\nimport io.reactivex.functions.Action;\nimport io.reactivex.schedulers.Schedulers;\n\nclass FacebookLogoutService {\n\n    private final UpcomingEventsViewRefresher refresher;\n    private final FacebookUserSettings preferences;\n    private final FacebookFriendsPersister persister;\n    private final Scheduler resultScheduler;\n    private final OnFacebookLogOutCallback callback;\n\n    private CompositeDisposable disposable = new CompositeDisposable();\n\n    FacebookLogoutService(Scheduler resultScheduler,\n                          FacebookUserSettings preferences,\n                          FacebookFriendsPersister persister,\n                          UpcomingEventsViewRefresher refresher, OnFacebookLogOutCallback callback) {\n        this.resultScheduler = resultScheduler;\n        this.preferences = preferences;\n        this.persister = persister;\n        this.refresher = refresher;\n        this.callback = callback;\n    }\n\n    void logOut() {\n        disposable.add(\n                Completable.fromAction(clearAllUserPresence())\n                        .doOnComplete(onLogOut())\n                        .observeOn(resultScheduler)\n                        .doOnComplete(refreshAllUI())\n                        .subscribeOn(Schedulers.io())\n                        .subscribe()\n        );\n    }\n\n    private Action refreshAllUI() {\n        return new Action() {\n            @Override\n            public void run() throws Exception {\n                refresher.refreshViews();\n            }\n        };\n    }\n\n    private Action clearAllUserPresence() {\n        return new Action() {\n            @Override\n            public void run() throws Exception {\n                preferences.store(UserCredentials.ANNONYMOUS);\n                persister.removeAllFriends();\n            }\n        };\n    }\n\n    private Action onLogOut() {\n        return new Action() {\n            @Override\n            public void run() throws Exception {\n                callback.onUserLogOut();\n            }\n        };\n    }\n\n    void dispose() {\n        disposable.dispose();\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/facebook/FacebookModule.java",
    "content": "package com.alexstyl.specialdates.facebook;\n\nimport android.content.Context;\n\nimport com.alexstyl.specialdates.EasyPreferences;\nimport com.alexstyl.specialdates.R;\n\nimport dagger.Module;\nimport dagger.Provides;\n\n@Module\npublic class FacebookModule {\n\n    private final Context context;\n\n    public FacebookModule(Context context) {\n        this.context = context;\n    }\n\n    @Provides\n    FacebookUserSettings userSettings() {\n        return new AndroidFacebookPreferences(EasyPreferences.createForPrivatePreferences(context, R.string.pref_facebook));\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/facebook/FacebookProfileActivity.java",
    "content": "package com.alexstyl.specialdates.facebook;\n\nimport android.os.Bundle;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport com.alexstyl.specialdates.AppComponent;\nimport com.alexstyl.specialdates.CrashAndErrorTracker;\nimport com.alexstyl.specialdates.ExternalNavigator;\nimport com.alexstyl.specialdates.MementoApplication;\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.analytics.Analytics;\nimport com.alexstyl.specialdates.analytics.Screen;\nimport com.alexstyl.specialdates.events.database.EventSQLiteOpenHelper;\nimport com.alexstyl.specialdates.events.peopleevents.ContactEventsMarshaller;\nimport com.alexstyl.specialdates.events.peopleevents.AndroidPeopleEventsPersister;\nimport com.alexstyl.specialdates.events.peopleevents.UpcomingEventsViewRefresher;\nimport com.alexstyl.specialdates.events.peopleevents.UpcomingEventsSettings;\nimport com.alexstyl.specialdates.facebook.friendimport.FacebookFriendsPersister;\nimport com.alexstyl.specialdates.images.ImageLoader;\nimport com.alexstyl.specialdates.ui.base.ThemedMementoActivity;\nimport com.alexstyl.specialdates.ui.widget.MementoToolbar;\n\nimport javax.inject.Inject;\nimport java.net.URI;\n\nimport io.reactivex.android.schedulers.AndroidSchedulers;\n\nimport static com.novoda.notils.caster.Views.findById;\n\npublic class FacebookProfileActivity extends ThemedMementoActivity implements FacebookProfileView {\n\n    private static final int LOGOUT_ID = 40444;\n\n    private ExternalNavigator navigator;\n    private FacebookProfilePresenter presenter;\n    private ImageView profilePicture;\n    private TextView userName;\n    @Inject Analytics analytics;\n    @Inject ImageLoader imageLoader;\n    @Inject UpcomingEventsViewRefresher uiRefresher;\n    @Inject CrashAndErrorTracker tracker;\n    @Inject FacebookUserSettings facebookSettings;\n    @Inject UpcomingEventsSettings eventsSettings;\n    @Inject ContactEventsMarshaller marshaller;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        AppComponent applicationModule = ((MementoApplication) getApplication()).getApplicationModule();\n        applicationModule.inject(this);\n        analytics.trackScreen(Screen.FACEBOOK_PROFILE);\n        setContentView(R.layout.activity_facebook_profile);\n\n        setupToolbar();\n        profilePicture = findById(this, R.id.facebook_profile_avatar);\n        userName = findById(this, R.id.facebook_profile_name);\n\n        findById(this, R.id.facebook_profile_fb_page).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                navigator.toFacebookPage();\n            }\n        });\n\n        FacebookFriendsPersister persister = new FacebookFriendsPersister(\n                new AndroidPeopleEventsPersister(new EventSQLiteOpenHelper(this), marshaller, tracker));\n        navigator = new ExternalNavigator(this, analytics, tracker);\n\n        FacebookLogoutService service = new FacebookLogoutService(\n                AndroidSchedulers.mainThread(),\n                facebookSettings,\n                persister,\n                uiRefresher,\n                onLogOut()\n        );\n        presenter = new FacebookProfilePresenter(\n                service,\n                this,\n                facebookSettings\n        );\n        presenter.startPresenting();\n    }\n\n    private OnFacebookLogOutCallback onLogOut() {\n        return new OnFacebookLogOutCallback() {\n            @Override\n            public void onUserLogOut() {\n                finish();\n            }\n        };\n    }\n\n    private void setupToolbar() {\n        MementoToolbar toolbar = findById(this, R.id.memento_toolbar);\n        setSupportActionBar(toolbar);\n        toolbar.displayNavigationIconAsClose();\n        setTitle(null);\n    }\n\n    @Override\n    public void display(UserCredentials userCredentials) {\n        userName.setText(userCredentials.getName());\n        URI uri = FacebookImagePath.INSTANCE.forUid(userCredentials.getUid());\n        imageLoader\n                .load(uri)\n                .asCircle()\n                .into(profilePicture);\n    }\n\n    @Override\n    public boolean onCreateOptionsMenu(Menu menu) {\n        menu.add(0, LOGOUT_ID, 0, R.string.log_out);\n        return true;\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        int itemId = item.getItemId();\n        if (itemId == LOGOUT_ID) {\n            presenter.logOut();\n            analytics.trackFacebookLoggedOut();\n            return true;\n        } else if (itemId == android.R.id.home) {\n            finish();\n        }\n        return super.onOptionsItemSelected(item);\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        presenter.stopPresenting();\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/facebook/FacebookProfilePresenter.java",
    "content": "package com.alexstyl.specialdates.facebook;\n\nclass FacebookProfilePresenter {\n    private final FacebookLogoutService service;\n    private final FacebookProfileView view;\n    private final FacebookUserSettings settings;\n\n    FacebookProfilePresenter(FacebookLogoutService service,\n                             FacebookProfileView view,\n                             FacebookUserSettings settings) {\n        this.service = service;\n        this.view = view;\n        this.settings = settings;\n    }\n\n    void startPresenting() {\n        UserCredentials userCredentials = settings.retrieveCredentials();\n        view.display(userCredentials);\n    }\n\n    void logOut() {\n        service.logOut();\n    }\n\n    void stopPresenting() {\n        service.dispose();\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/facebook/FacebookProfileView.java",
    "content": "package com.alexstyl.specialdates.facebook;\n\ninterface FacebookProfileView {\n    void display(UserCredentials userCredentials);\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/facebook/OnFacebookLogOutCallback.java",
    "content": "package com.alexstyl.specialdates.facebook;\n\ninterface OnFacebookLogOutCallback {\n    void onUserLogOut();\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/facebook/ScreenOrientationLock.java",
    "content": "package com.alexstyl.specialdates.facebook;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.pm.ActivityInfo;\nimport android.view.Surface;\nimport android.view.WindowManager;\n\npublic class ScreenOrientationLock {\n\n    public void lock(Activity activity) {\n        int orientation = activity.getRequestedOrientation();\n        int rotation = ((WindowManager)\n                activity.getSystemService(Context.WINDOW_SERVICE))\n                .getDefaultDisplay().getRotation();\n\n        switch (rotation) {\n            case Surface.ROTATION_0:\n                orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;\n                break;\n            case Surface.ROTATION_90:\n                orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;\n                break;\n            case Surface.ROTATION_180:\n                orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;\n                break;\n            default:\n                orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;\n                break;\n        }\n        activity.setRequestedOrientation(orientation);\n    }\n\n    public void unlock(Activity activity) {\n        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/facebook/friendimport/CalendarURLCreator.java",
    "content": "package com.alexstyl.specialdates.facebook.friendimport;\n\nimport com.alexstyl.specialdates.CrashAndErrorTracker;\nimport com.alexstyl.specialdates.facebook.UserCredentials;\n\nimport java.net.MalformedURLException;\nimport java.net.URL;\n\nclass CalendarURLCreator {\n\n    private final CrashAndErrorTracker tracker;\n\n    CalendarURLCreator(CrashAndErrorTracker tracker) {\n        this.tracker = tracker;\n    }\n\n    URL createFrom(UserCredentials user) {\n        try {\n            return new URL(\"https://www.facebook.com/ical/b.php?locale=en_US&uid=\" + user.getUid() + \"&key=\" + user.getKey());\n        } catch (MalformedURLException e) {\n            tracker.track(e);\n            throw new IllegalArgumentException(e);\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/facebook/friendimport/FacebookFriendsIntentService.java",
    "content": "package com.alexstyl.specialdates.facebook.friendimport;\n\nimport android.app.IntentService;\nimport android.app.Notification;\nimport android.app.NotificationManager;\nimport android.content.Intent;\nimport android.support.annotation.Nullable;\nimport android.support.v4.app.NotificationCompat;\n\nimport com.alexstyl.specialdates.BuildConfig;\nimport com.alexstyl.specialdates.CrashAndErrorTracker;\nimport com.alexstyl.specialdates.MementoApplication;\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.date.ContactEvent;\nimport com.alexstyl.specialdates.date.DateParser;\nimport com.alexstyl.specialdates.events.database.EventSQLiteOpenHelper;\nimport com.alexstyl.specialdates.events.peopleevents.AndroidPeopleEventsPersister;\nimport com.alexstyl.specialdates.events.peopleevents.ContactEventsMarshaller;\nimport com.alexstyl.specialdates.events.peopleevents.UpcomingEventsViewRefresher;\nimport com.alexstyl.specialdates.facebook.FacebookUserSettings;\nimport com.alexstyl.specialdates.facebook.UserCredentials;\n\nimport javax.inject.Inject;\nimport java.net.URL;\nimport java.util.List;\n\npublic class FacebookFriendsIntentService extends IntentService {\n    private static final String TAG = FacebookFriendsIntentService.class.getSimpleName();\n    private static final int NOTIFICATION_ID = 123;\n\n    @Inject UpcomingEventsViewRefresher uiRefresher;\n    @Inject CrashAndErrorTracker tracker;\n    @Inject FacebookUserSettings facebookUserSettings;\n    @Inject DateParser parser;\n    @Inject ContactEventsMarshaller marshaller;\n\n    public FacebookFriendsIntentService() {\n        super(TAG);\n    }\n\n    @Override\n    public void onCreate() {\n        super.onCreate();\n        ((MementoApplication) getApplication()).getApplicationModule().inject(this);\n    }\n\n    @Override\n    protected void onHandleIntent(@Nullable Intent intent) {\n        FacebookCalendarLoader calendarLoader = new FacebookCalendarLoader();\n        FacebookContactFactory factory = new FacebookContactFactory(parser);\n        ContactEventSerialiser serialiser = new ContactEventSerialiser(factory, tracker);\n        FacebookBirthdaysProvider calendarFetcher = new FacebookBirthdaysProvider(calendarLoader, serialiser);\n\n        UserCredentials userCredentials = facebookUserSettings.retrieveCredentials();\n        if (isAnnonymous(userCredentials)) {\n            tracker.track(new RuntimeException(\"Tried to fetch events, but was anonymous\"));\n            return;\n        }\n        CalendarURLCreator calendarURLCreator = new CalendarURLCreator(tracker);\n\n        URL calendarUrl = calendarURLCreator.createFrom(userCredentials);\n        FacebookFriendsPersister persister = new FacebookFriendsPersister(\n                new AndroidPeopleEventsPersister(\n                        new EventSQLiteOpenHelper(this),\n                        marshaller,\n                        tracker\n                )\n        );\n        try {\n            List<ContactEvent> friends = calendarFetcher.fetchCalendarFrom(calendarUrl);\n            persister.keepOnly(friends);\n            uiRefresher.refreshViews();\n        } catch (CalendarFetcherException e) {\n            tracker.track(e);\n        }\n\n        if (BuildConfig.DEBUG) {\n            notifyServiceRan();\n        }\n    }\n\n    private void notifyServiceRan() {\n        Notification notification = new NotificationCompat.Builder(this)\n                .setContentTitle(\"Friends fetched\")\n                .setSmallIcon(R.mipmap.ic_launcher)\n                .build();\n        ((NotificationManager) getSystemService(NOTIFICATION_SERVICE)).notify(NOTIFICATION_ID, notification);\n    }\n\n    private boolean isAnnonymous(UserCredentials userCredentials) {\n        return UserCredentials.ANNONYMOUS.equals(userCredentials);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/facebook/friendimport/FacebookFriendsPersister.java",
    "content": "package com.alexstyl.specialdates.facebook.friendimport;\n\nimport com.alexstyl.specialdates.date.ContactEvent;\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsPersister;\n\nimport java.util.List;\n\nimport static com.alexstyl.specialdates.contact.ContactSource.SOURCE_FACEBOOK;\n\npublic final class FacebookFriendsPersister {\n\n    private final PeopleEventsPersister persister;\n\n    public FacebookFriendsPersister(PeopleEventsPersister persister) {\n        this.persister = persister;\n    }\n\n    void keepOnly(List<ContactEvent> friends) {\n        persister.deleteAllEventsOfSource(SOURCE_FACEBOOK);\n        persister.insertAnnualEvents(friends);\n    }\n\n    public void removeAllFriends() {\n        persister.deleteAllEventsOfSource(SOURCE_FACEBOOK);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/facebook/friendimport/FacebookFriendsScheduler.java",
    "content": "package com.alexstyl.specialdates.facebook.friendimport;\n\nimport android.app.AlarmManager;\nimport android.app.PendingIntent;\nimport android.content.Context;\nimport android.content.Intent;\n\nimport com.alexstyl.specialdates.TimeOfDay;\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.date.DateAndTime;\n\npublic final class FacebookFriendsScheduler {\n\n    private static final TimeOfDay EIGHT_O_CLOCK = new TimeOfDay(8, 0);\n\n    private final AlarmManager alarmManager;\n    private final Context context;\n\n    public FacebookFriendsScheduler(Context context, AlarmManager alarmManager) {\n        this.context = context;\n        this.alarmManager = alarmManager;\n    }\n\n    public void scheduleNext() {\n        DateAndTime dateAndTime = new DateAndTime(Date.Companion.today().addDay(1), EIGHT_O_CLOCK);\n        PendingIntent pi = PendingIntent.getService(\n                context,\n                0,\n                new Intent(context, FacebookFriendsIntentService.class),\n                PendingIntent.FLAG_UPDATE_CURRENT\n        );\n        alarmManager.setRepeating(AlarmManager.RTC, dateAndTime.toMilis(),\n                                  AlarmManager.INTERVAL_DAY, pi\n        );\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/facebook/login/CookieResetter.java",
    "content": "package com.alexstyl.specialdates.facebook.login;\n\nimport android.webkit.CookieManager;\nimport android.webkit.ValueCallback;\n\nimport com.alexstyl.android.Version;\n\nclass CookieResetter {\n    private final CookieManager cookieManager;\n\n    CookieResetter(CookieManager instance) {\n        this.cookieManager = instance;\n    }\n\n    void clearAll() {\n        removeAllCookies();\n\n        cookieManager.setCookie(\".facebook.com\", \"locale=\");\n        cookieManager.setCookie(\".facebook.com\", \"datr=\");\n        cookieManager.setCookie(\".facebook.com\", \"s=\");\n        cookieManager.setCookie(\".facebook.com\", \"csm=\");\n        cookieManager.setCookie(\".facebook.com\", \"fr=\");\n        cookieManager.setCookie(\".facebook.com\", \"lu=\");\n        cookieManager.setCookie(\".facebook.com\", \"c_user=\");\n        cookieManager.setCookie(\".facebook.com\", \"xs=\");\n        cookieManager.setCookie(\".facebook.com\", \"wd\");\n        cookieManager.setCookie(\".facebook.com\", \"presence\");\n        cookieManager.setCookie(\".facebook.com\", \"act\");\n        cookieManager.setCookie(\".facebook.com\", \"lu\");\n        cookieManager.setCookie(\".facebook.com\", \"pl\");\n        cookieManager.setCookie(\".facebook.com\", \"fr\");\n        cookieManager.setCookie(\".facebook.com\", \"xs\");\n        cookieManager.setCookie(\".facebook.com\", \"c_user\");\n        cookieManager.setCookie(\".facebook.com\", \"sb\");\n        cookieManager.setCookie(\".facebook.com\", \"dats\");\n        cookieManager.setCookie(\".facebook.com\", \"datr\");\n        cookieManager.setCookie(\".facebook.com\", \"locale\");\n        cookieManager.setCookie(\".facebook.com\", \"x-referer\");\n    }\n\n    private void removeAllCookies() {\n        if (Version.INSTANCE.hasLollipop()) {\n            cookieManager.removeAllCookies(new ValueCallback<Boolean>() {\n                @Override\n                public void onReceiveValue(Boolean value) {\n\n                }\n            });\n        } else {\n            cookieManager.removeAllCookie();\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/facebook/login/CredentialsExtractor.java",
    "content": "package com.alexstyl.specialdates.facebook.login;\n\nimport com.alexstyl.specialdates.facebook.UserCredentials;\n\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\nclass CredentialsExtractor {\n\n    private static final Pattern BIRTHDAY_PATTERN = Pattern.compile(\"(www.facebook.com/ical/b.php\\\\?uid=\\\\w+&amp;key=.+?(?=\\\"))\");\n    private static final String UID = \"uid=\";\n    private static final int UID_LENGTH = UID.length();\n    private static final String KEY = \"key=\";\n    private static final int KEY_LENGTH = KEY.length();\n    private static final int USER_DETAILS = 1;\n    private static final String OPENNING_SPAN = \"<span>\";\n    private static final String CLOSING_SPAN = \"</span>\";\n\n    UserCredentials extractCalendarURL(String pageSource) {\n        Matcher matcher = BIRTHDAY_PATTERN.matcher(pageSource);\n        if (matcher.find()) {\n            String url = matcher\n                    .group(1)\n                    .replace(\"&amp;\", \"&\");\n            String name = obtainName(pageSource);\n            return createFrom(url, name);\n        } else {\n            return UserCredentials.ANNONYMOUS;\n        }\n    }\n\n    static UserCredentials createFrom(String calendarURL, String name) {\n        int indexOfKey = calendarURL.indexOf(KEY);\n        int indexOfUserID = calendarURL.indexOf(UID);\n        int indexOfEnd = calendarURL.indexOf(\"&\", indexOfUserID);\n\n        long userID = Long.parseLong(calendarURL.substring(indexOfUserID + UID_LENGTH, indexOfEnd));\n        String key = calendarURL.substring(indexOfKey + KEY_LENGTH);\n\n        return new UserCredentials(userID, key, name);\n\n    }\n\n    private String obtainName(String pageSource) {\n        try {\n            String userDetails = pageSource.split(\"data-testid=\\\"blue_bar_profile_link\\\">\")[USER_DETAILS];\n            int startOfName = userDetails.indexOf(OPENNING_SPAN) + OPENNING_SPAN.length();\n            int endOfName = userDetails.indexOf(CLOSING_SPAN);\n            return userDetails.substring(startOfName, endOfName);\n        } catch (Exception e) {\n            return \"\";\n        }\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/facebook/login/FBImportClient.java",
    "content": "package com.alexstyl.specialdates.facebook.login;\n\nimport android.graphics.Bitmap;\nimport android.webkit.WebSettings;\nimport android.webkit.WebView;\nimport android.webkit.WebViewClient;\n\nclass FBImportClient extends WebViewClient {\n    private static final String HTTPS = \"https://\";\n    private static final String HTTP = \"http://\";\n    private static final String MOBILE_HOME = \"m.facebook.com/home.php\";\n    private static final String DESKTOP_HOME = \"www.facebook.com/home.php\";\n    private static final String DESKTOP_USER_AGENT = \"Mozilla/5.0 (X11; U; Linux i686; en   US; rv:1.9.0.4) Gecko/20100101 Firefox/4.0\";\n    private static final String URL_WITH_BIRTHDAY_SOURCE = \"https://www.facebook.com/events/calendar\";\n\n    private final WebView webView;\n    private FacebookLogInCallback listener;\n\n    FBImportClient(WebView webview) {\n        this.webView = webview;\n    }\n\n    @Override\n    public void onPageStarted(WebView view, String url, Bitmap favicon) {\n        if (isHomePage(url)) {\n            view.stopLoading();\n            internalOnUserLoggedIn();\n        }\n    }\n\n    private boolean isHomePage(String url) {\n        return url.startsWith(HTTP + MOBILE_HOME) || url.startsWith(HTTPS + MOBILE_HOME)\n                || url.startsWith(HTTP + DESKTOP_HOME) || url.startsWith(HTTPS + DESKTOP_HOME);\n    }\n\n    private void internalOnUserLoggedIn() {\n        switchToDesktopBrowsing();\n        webView.loadUrl(URL_WITH_BIRTHDAY_SOURCE);\n        listener.onUserCredentialsSubmitted();\n    }\n\n    private void switchToDesktopBrowsing() {\n        WebSettings settings = webView.getSettings();\n        settings.setUserAgentString(DESKTOP_USER_AGENT);\n    }\n\n    @Override\n    public void onPageFinished(WebView view, String url) {\n        if (url.contains(URL_WITH_BIRTHDAY_SOURCE)) {\n            webView.loadUrl(\"javascript:window.HTMLOUT.processHTML('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');\");\n        }\n    }\n\n    @Override\n    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {\n        super.onReceivedError(view, errorCode, description, failingUrl);\n        listener.onError(new FacebookLogInException(description));\n    }\n\n    public void setListener(FacebookLogInCallback listener) {\n        this.listener = listener;\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/facebook/login/FacebookImportView.java",
    "content": "package com.alexstyl.specialdates.facebook.login;\n\nimport com.alexstyl.specialdates.facebook.UserCredentials;\n\ninterface FacebookImportView {\n\n    void showLoading();\n\n    void showData(UserCredentials user);\n\n    void showError();\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/facebook/login/FacebookLogInActivity.java",
    "content": "package com.alexstyl.specialdates.facebook.login;\n\nimport android.app.AlarmManager;\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.support.v7.widget.Toolbar;\nimport android.view.View;\nimport android.view.animation.Animation;\nimport android.view.animation.AnimationUtils;\nimport android.view.animation.BounceInterpolator;\nimport android.webkit.CookieManager;\nimport android.widget.Button;\nimport android.widget.ImageView;\nimport android.widget.ProgressBar;\nimport android.widget.TextView;\n\nimport com.alexstyl.specialdates.AppComponent;\nimport com.alexstyl.specialdates.CrashAndErrorTracker;\nimport com.alexstyl.specialdates.MementoApplication;\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.ShareAppIntentCreator;\nimport com.alexstyl.specialdates.Strings;\nimport com.alexstyl.specialdates.analytics.Analytics;\nimport com.alexstyl.specialdates.analytics.Screen;\nimport com.alexstyl.specialdates.facebook.FacebookImagePath;\nimport com.alexstyl.specialdates.facebook.FacebookUserSettings;\nimport com.alexstyl.specialdates.facebook.ScreenOrientationLock;\nimport com.alexstyl.specialdates.facebook.UserCredentials;\nimport com.alexstyl.specialdates.facebook.friendimport.FacebookFriendsIntentService;\nimport com.alexstyl.specialdates.facebook.friendimport.FacebookFriendsScheduler;\nimport com.alexstyl.specialdates.images.ImageLoader;\nimport com.alexstyl.specialdates.ui.base.ThemedMementoActivity;\nimport com.novoda.notils.caster.Views;\nimport com.novoda.notils.meta.AndroidUtils;\n\nimport javax.inject.Inject;\nimport java.net.URI;\n\npublic class FacebookLogInActivity extends ThemedMementoActivity implements FacebookImportView {\n\n    private FacebookFriendsScheduler facebookFriendsScheduler;\n\n    private FacebookWebView webView;\n    private ImageView avatar;\n    private TextView helloView;\n    private TextView moreText;\n    private ScreenOrientationLock orientationLock;\n    private ProgressBar progress;\n    private Button shareButton;\n    private Button closeButton;\n    @Inject Analytics analytics;\n    @Inject Strings stringResource;\n    @Inject CrashAndErrorTracker tracker;\n    @Inject ImageLoader imageLoader;\n    @Inject FacebookUserSettings facebookUserSettings;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        AppComponent applicationModule = ((MementoApplication) getApplication()).getApplicationModule();\n        applicationModule.inject(this);\n        analytics.trackScreen(Screen.FACEBOOK_LOG_IN);\n        setContentView(R.layout.activity_facebook_log_in);\n\n        Toolbar toolbar = Views.findById(this, R.id.memento_toolbar);\n        setSupportActionBar(toolbar);\n        avatar = Views.findById(this, R.id.facebook_import_avatar);\n        helloView = Views.findById(this, R.id.facebook_import_hello);\n        moreText = Views.findById(this, R.id.facebook_import_description);\n        progress = Views.findById(this, R.id.progress);\n        shareButton = Views.findById(this, R.id.facebook_import_share);\n        shareButton.setOnClickListener(shareAppIntentOnClick());\n        closeButton = Views.findById(this, R.id.facebook_import_close);\n        closeButton.setOnClickListener(onCloseButtonPressed());\n        webView = Views.findById(this, R.id.facebook_import_webview);\n        orientationLock = new ScreenOrientationLock();\n        facebookFriendsScheduler = new FacebookFriendsScheduler(\n                thisActivity(),\n                (AlarmManager) getSystemService(ALARM_SERVICE)\n        );\n\n        webView.setCallback(facebookCallback);\n\n        UserCredentials userCredentials = facebookUserSettings.retrieveCredentials();\n        if (savedInstanceState == null || userCredentials.equals(UserCredentials.ANNONYMOUS)) {\n            new CookieResetter(CookieManager.getInstance()).clearAll();\n            webView.loadLogInPage();\n        } else {\n            showData(userCredentials);\n        }\n    }\n\n    private View.OnClickListener onCloseButtonPressed() {\n        return new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                finish();\n            }\n        };\n    }\n\n    private View.OnClickListener shareAppIntentOnClick() {\n        return new View.OnClickListener() {\n\n            @Override\n            public void onClick(View v) {\n                ShareAppIntentCreator appIntentCreator = new ShareAppIntentCreator(stringResource);\n                Intent intent = appIntentCreator.buildIntent();\n                startActivity(intent);\n                analytics.trackAppInviteRequested();\n            }\n        };\n    }\n\n    private final FacebookLogInCallback facebookCallback = new FacebookLogInCallback() {\n\n        @Override\n        public void onUserCredentialsSubmitted() {\n            AndroidUtils.requestHideKeyboard(thisActivity(), webView);\n            showLoading();\n        }\n\n        @Override\n        public void onUserLoggedIn(UserCredentials credentials) {\n            fetchFacebookFriends();\n            showData(credentials);\n            analytics.trackFacebookLoggedIn();\n        }\n\n        private void fetchFacebookFriends() {\n            facebookFriendsScheduler.scheduleNext();\n\n            startFacebookFetchService();\n        }\n\n        private void startFacebookFetchService() {\n            Intent intent = new Intent(thisActivity(), FacebookFriendsIntentService.class);\n            startService(intent);\n        }\n\n        @Override\n        public void onError(Exception e) {\n            showError();\n            tracker.track(e);\n        }\n    };\n\n    @Override\n    public void showLoading() {\n        orientationLock.lock(thisActivity());\n\n        progress.setVisibility(View.VISIBLE);\n        webView.setVisibility(View.GONE);\n        avatar.setVisibility(View.GONE);\n        helloView.setVisibility(View.GONE);\n        moreText.setVisibility(View.GONE);\n        closeButton.setVisibility(View.GONE);\n        shareButton.setVisibility(View.GONE);\n    }\n\n    @Override\n    public void showData(UserCredentials userCredentials) {\n        progress.setVisibility(View.GONE);\n        webView.setVisibility(View.GONE);\n        avatar.setVisibility(View.VISIBLE);\n        helloView.setVisibility(View.VISIBLE);\n        moreText.setVisibility(View.VISIBLE);\n        closeButton.setVisibility(View.VISIBLE);\n        shareButton.setVisibility(View.VISIBLE);\n\n        URI uri = FacebookImagePath.INSTANCE.forUid(userCredentials.getUid());\n        imageLoader\n                .load(uri)\n                .asCircle()\n                .into(avatar);\n\n        animateAvatarWithBounce();\n        avatar.setVisibility(View.VISIBLE);\n\n        String name = userCredentials.getName();\n        if (name.isEmpty()) {\n            helloView.setText(R.string.Welcome);\n        } else {\n            helloView.setText(getString(R.string.facebook_hi, name));\n        }\n    }\n\n    private void animateAvatarWithBounce() {\n        final Animation animation = AnimationUtils.loadAnimation(FacebookLogInActivity.this, R.anim.bounce);\n        animation.setInterpolator(new BounceInterpolator());\n        avatar.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                avatar.startAnimation(animation);\n                analytics.trackOnAvatarBounce();\n            }\n        });\n        avatar.startAnimation(animation);\n    }\n\n    @Override\n    public void showError() {\n        avatar.setVisibility(View.VISIBLE);\n        avatar.setImageResource(R.drawable.ic_facebook_sad);\n\n        helloView.setVisibility(View.VISIBLE);\n        helloView.setText(R.string.facebook_error);\n        closeButton.setVisibility(View.VISIBLE);\n        moreText.setVisibility(View.VISIBLE);\n        moreText.setText(R.string.facebook_try_again);\n\n        progress.setVisibility(View.GONE);\n        webView.setVisibility(View.GONE);\n        shareButton.setVisibility(View.GONE);\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        webView.destroy();\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/facebook/login/FacebookLogInCallback.java",
    "content": "package com.alexstyl.specialdates.facebook.login;\n\nimport com.alexstyl.specialdates.facebook.UserCredentials;\n\ninterface FacebookLogInCallback {\n    void onUserLoggedIn(UserCredentials loggedInCredentials);\n\n    /**\n     * Called when the user has successfully submitted their log in credentials.\n     */\n    void onUserCredentialsSubmitted();\n\n    void onError(Exception e);\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/facebook/login/FacebookLogInException.java",
    "content": "package com.alexstyl.specialdates.facebook.login;\n\nfinal class FacebookLogInException extends Exception {\n    FacebookLogInException(String message) {\n        super(message);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/facebook/login/FacebookWebView.java",
    "content": "package com.alexstyl.specialdates.facebook.login;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.view.View;\nimport android.webkit.JavascriptInterface;\nimport android.webkit.WebSettings;\nimport android.webkit.WebView;\n\nimport com.alexstyl.specialdates.MementoApplication;\nimport com.alexstyl.specialdates.facebook.FacebookUserSettings;\n\nimport javax.inject.Inject;\n\npublic class FacebookWebView extends WebView {\n\n    private FacebookLogInCallback callback;\n    private FBImportClient client;\n    @Inject FacebookUserSettings facebookUserSettings;\n\n    public FacebookWebView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        setup();\n\n    }\n\n    public FacebookWebView(Context context, AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n        setup();\n    }\n\n    private void setup() {\n        ((MementoApplication) getContext().getApplicationContext()).getApplicationModule().inject(this);\n\n        clearCache(false);\n        setLayerType(View.LAYER_TYPE_SOFTWARE, null);\n\n        WebSettings settings = getSettings();\n        settings.setJavaScriptEnabled(true);\n\n        addJavascriptInterface(new FacebookJavaScriptInterface(), \"HTMLOUT\");\n        client = new FBImportClient(this);\n        setWebViewClient(client);\n    }\n\n    public void loadLogInPage() {\n        loadUrl(\"https://m.facebook.com/login\");\n    }\n\n    public void setCallback(FacebookLogInCallback callback) {\n        this.callback = callback;\n        client.setListener(callback);\n    }\n\n    private class FacebookJavaScriptInterface {\n\n        private UserCredentialsExtractorTask userCredentialsExtractorTask;\n\n        @JavascriptInterface\n        @SuppressWarnings(\"unused\")\n        public void processHTML(String html) {\n            if (userCredentialsExtractorTask == null) {\n                userCredentialsExtractorTask = new UserCredentialsExtractorTask(html, facebookUserSettings, callback);\n                userCredentialsExtractorTask.execute();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/facebook/login/UserCredentialsExtractorTask.java",
    "content": "package com.alexstyl.specialdates.facebook.login;\n\nimport android.os.AsyncTask;\n\nimport com.alexstyl.specialdates.facebook.FacebookUserSettings;\nimport com.alexstyl.specialdates.facebook.UserCredentials;\n\nimport javax.security.auth.login.LoginException;\n\nclass UserCredentialsExtractorTask extends AsyncTask<Void, Void, UserCredentials> {\n\n    private final CredentialsExtractor extractor = new CredentialsExtractor();\n\n    private final String pageSource;\n    private final FacebookLogInCallback callback;\n    private final FacebookUserSettings facebookUserSettings;\n\n    UserCredentialsExtractorTask(String pageSource, FacebookUserSettings facebookUserSettings, FacebookLogInCallback callback) {\n        this.pageSource = pageSource;\n        this.facebookUserSettings = facebookUserSettings;\n        this.callback = callback;\n    }\n\n    @Override\n    protected UserCredentials doInBackground(Void... params) {\n        UserCredentials userCredentials = extractor.extractCalendarURL(pageSource);\n        if (userCredentials != UserCredentials.ANNONYMOUS) {\n            facebookUserSettings.store(userCredentials);\n        }\n        return userCredentials;\n    }\n\n    @Override\n    protected void onPostExecute(UserCredentials userCredentials) {\n        if (userCredentials.isAnnonymous()) {\n            callback.onError(new LoginException(\"Couldn't find extract calendar\"));\n        } else {\n            callback.onUserLoggedIn(userCredentials);\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/home/DonationBannerView.kt",
    "content": "package com.alexstyl.specialdates.home\n\nimport android.content.Context\nimport android.graphics.Color\nimport android.support.v7.widget.LinearLayoutCompat\nimport android.util.AttributeSet\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.Button\nimport android.widget.LinearLayout\nimport com.alexstyl.specialdates.BuildConfig\nimport com.alexstyl.specialdates.R\nimport com.google.android.gms.ads.AdListener\nimport com.google.android.gms.ads.AdRequest\nimport com.google.android.gms.ads.AdView\n\nclass DonationBannerView(context: Context, attrs: AttributeSet?) : LinearLayoutCompat(context, attrs) {\n\n    private var closeView: View? = null\n    private var listener: OnCloseBannerListener? = null\n\n\n    override fun onFinishInflate() {\n        super.onFinishInflate()\n\n        LayoutInflater.from(context).inflate(R.layout.merge_donation_banner_view, this, true)\n        super.setOrientation(LinearLayout.HORIZONTAL)\n\n        setBackgroundColor(Color.WHITE)\n\n        val adView = findViewById<AdView>(R.id.banner_ad)\n\n        adView.adListener = object : AdListener() {\n            override fun onAdFailedToLoad(p0: Int) {\n                showAsCallToAction()\n            }\n        }\n\n        adView.loadAd(adRequest())\n\n        closeView = findViewById(R.id.banner_close)\n        closeView!!.setOnClickListener { listener?.onCloseButtonPressed() }\n    }\n\n    private fun showAsCallToAction() {\n        val supportButton = findViewById<Button>(R.id.banner_support_holder)\n        supportButton.visibility = View.VISIBLE\n        supportButton.setOnClickListener { listener?.onCloseButtonPressed() }\n\n        findViewById<ViewGroup>(R.id.banner_ad_holder).visibility = View.GONE\n\n    }\n\n    private fun adRequest(): AdRequest {\n        val builder = AdRequest.Builder()\n        if (BuildConfig.DEBUG) {\n            builder.addTestDevice(\"544D83E87B224A20DDBE6B1FE2710E74\")\n        }\n        return builder.build()\n    }\n\n    fun setOnCloseBannerListener(listener: OnCloseBannerListener) {\n        this.listener = listener\n    }\n\n    override fun setOrientation(orientation: Int) {\n        throw UnsupportedOperationException(DonationBannerView::class.java.toString() + \" can only be HORIZONTAL\")\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/home/HomeActivity.java",
    "content": "package com.alexstyl.specialdates.home;\n\nimport android.animation.Animator;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.support.design.widget.FloatingActionButton;\nimport android.support.design.widget.TabLayout;\nimport android.support.v4.view.ViewPager;\nimport android.view.View;\nimport android.view.animation.DecelerateInterpolator;\nimport android.widget.FrameLayout;\nimport android.widget.LinearLayout;\nimport android.widget.Toast;\n\nimport com.alexstyl.android.SimpleAnimatorListener;\nimport com.alexstyl.specialdates.AppComponent;\nimport com.alexstyl.specialdates.MementoApplication;\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.analytics.Analytics;\nimport com.alexstyl.specialdates.analytics.Screen;\nimport com.alexstyl.specialdates.dailyreminder.DailyReminderNotifier;\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.donate.DonateMonitor;\nimport com.alexstyl.specialdates.donate.DonationPreferences;\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsUpdater;\nimport com.alexstyl.specialdates.permissions.MementoPermissions;\nimport com.alexstyl.specialdates.ui.ViewFader;\nimport com.alexstyl.specialdates.ui.base.ThemedMementoActivity;\nimport com.alexstyl.specialdates.upcoming.DatePickerDialogFragment;\nimport com.alexstyl.specialdates.upcoming.view.ExposedSearchToolbar;\nimport com.google.android.gms.ads.MobileAds;\nimport com.novoda.notils.meta.AndroidUtils;\n\nimport javax.inject.Inject;\n\nimport org.jetbrains.annotations.Nullable;\n\nimport static android.view.View.OnClickListener;\nimport static com.novoda.notils.caster.Views.findById;\n\npublic class HomeActivity extends ThemedMementoActivity implements DatePickerDialogFragment.OnDateSetListener {\n\n    private static final int CODE_PERMISSION = 150;\n    public static final int PAGE_EVENTS = 0;\n    public static final int PAGE_CONTACTS = 1;\n    public static final int PAGE_SETTINGS = 2;\n    public static final int CODE_ADD_EVENT = 120;\n\n    private SearchTransitioner searchTransitioner;\n    private FloatingActionButton actionButton;\n\n    @Inject HomeNavigator navigator;\n    @Inject Analytics analytics;\n    @Inject DailyReminderNotifier dailyReminderNotifier;\n    @Inject DonationPreferences donationPreferences;\n    @Inject DonateMonitor donateMonitor;\n    @Inject MementoPermissions permissions;\n    @Inject PeopleEventsUpdater peopleEventsUpdater;\n\n    private ViewPager viewPager;\n    private DonationBannerView banner;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_home);\n\n        MobileAds.initialize(this, getString(R.string.admob_unit_id));\n\n        AppComponent applicationModule = ((MementoApplication) getApplication()).getApplicationModule();\n        applicationModule.inject(this);\n\n        analytics.trackScreen(Screen.HOME);\n\n        ExposedSearchToolbar toolbar = findById(this, R.id.home_toolbar);\n        toolbar.setOnClickListener(onToolbarClickListener);\n        setSupportActionBar(toolbar);\n\n        viewPager = findViewById(R.id.home_viewpager);\n        final HomeViewPagerAdapter adapter = new HomeViewPagerAdapter(getSupportFragmentManager());\n        viewPager.setAdapter(adapter);\n        viewPager.setOffscreenPageLimit(adapter.getCount());\n\n        LinearLayout content = findViewById(R.id.home_content);\n        FrameLayout toolbarHolder = findViewById(R.id.home_toolbar_holder);\n        searchTransitioner = new SearchTransitioner(this, navigator, content, toolbar, toolbarHolder, new ViewFader());\n\n        setTitle(R.string.app_name);\n\n        TabLayout tabLayout = findViewById(R.id.home_tabs);\n        tabLayout.setupWithViewPager(viewPager);\n        tabLayout.getTabAt(HomeActivity.PAGE_EVENTS).setIcon(getTintedDrawable(R.drawable.ic_events));\n        tabLayout.getTabAt(HomeActivity.PAGE_CONTACTS).setIcon(getTintedDrawable(R.drawable.ic_contacts));\n        tabLayout.getTabAt(HomeActivity.PAGE_SETTINGS).setIcon(getTintedDrawable(R.drawable.ic_settings));\n\n        actionButton = findViewById(R.id.home_add_event);\n        actionButton.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View view) {\n                navigator.toAddEvent(thisActivity(), CODE_ADD_EVENT);\n            }\n        });\n        viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {\n\n            @Override\n            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {\n                if (position == HomeActivity.PAGE_SETTINGS\n                        || (position == HomeActivity.PAGE_CONTACTS && positionOffset >= 0.5)) {\n                    actionButton.hide();\n                } else {\n                    actionButton.show();\n                }\n            }\n        });\n\n        banner = findViewById(R.id.home_ad_banner);\n        banner.setOnCloseBannerListener(new OnCloseBannerListener() {\n            @Override\n            public void onCloseButtonPressed() {\n                navigator.toDonate(HomeActivity.this);\n            }\n        });\n\n        if (ACTION_UPDATE_THEME.equals(getIntent().getAction())) {\n            viewPager.setCurrentItem(HomeActivity.PAGE_SETTINGS);\n        }\n    }\n\n    @Override\n    protected void onResume() {\n        super.onResume();\n        if (!permissions.canReadAndWriteContacts()) {\n            navigator.toContactPermission(this, CODE_PERMISSION);\n        }\n        if (viewPager.getCurrentItem() != PAGE_SETTINGS) {\n            actionButton.show();\n        }\n        searchTransitioner.onActivityResumed();\n        donateMonitor.addListener(donateMonitorListener);\n        banner.setVisibility(bannerVisibility());\n    }\n\n    @Override\n    protected void onStop() {\n        super.onStop();\n        donateMonitor.removeListener(donateMonitorListener);\n    }\n\n    @Override\n    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {\n        super.onActivityResult(requestCode, resultCode, data);\n        if (requestCode == CODE_PERMISSION) {\n            if (resultCode == RESULT_OK) {\n                peopleEventsUpdater\n                        .updateEvents()\n                        .subscribe();\n            } else {\n                finishAffinity();\n            }\n        }\n    }\n\n    private void hideBanner() {\n        banner\n                .animate()\n                .yBy(banner.getHeight())\n                .setInterpolator(new DecelerateInterpolator())\n                .setListener(new SimpleAnimatorListener() {\n                    @Override\n                    public void onAnimationEnd(Animator animator) {\n                        banner.setVisibility(View.GONE);\n                    }\n                }).start();\n    }\n\n    private int bannerVisibility() {\n        if (donationPreferences.hasDonated()) {\n            return View.GONE;\n        } else {\n            return View.VISIBLE;\n        }\n    }\n\n    @Override\n    public void onDateSelected(Date dateSelected) {\n        navigator.toDateDetails(dateSelected, this);\n    }\n\n    @Override\n    public boolean onSearchRequested() {\n        actionButton.hide();\n        searchTransitioner.transitionToSearch();\n        return true;\n    }\n\n    @Override\n    public void onUserInteraction() {\n        super.onUserInteraction();\n        dailyReminderNotifier.cancelAllEvents();\n    }\n\n    private final OnClickListener onToolbarClickListener = new OnClickListener() {\n        @Override\n        public void onClick(View v) {\n            AndroidUtils.toggleKeyboard(v.getContext());\n            onSearchRequested();\n        }\n    };\n\n    @Override\n    public void onBackPressed() {\n        if (viewPager.getCurrentItem() == HomeActivity.PAGE_EVENTS) {\n            super.onBackPressed();\n        } else {\n            viewPager.setCurrentItem(HomeActivity.PAGE_EVENTS);\n        }\n    }\n\n    public static Intent getStartIntent(Context context) {\n        return new Intent(context, HomeActivity.class);\n    }\n\n    private DonateMonitor.DonateMonitorListener donateMonitorListener = new DonateMonitor.DonateMonitorListener() {\n        @Override\n        public void onUserDonated() {\n            Toast.makeText(HomeActivity.this, R.string.thanks_for_support, Toast.LENGTH_SHORT).show();\n            hideBanner();\n        }\n    };\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/home/HomeNavigator.kt",
    "content": "package com.alexstyl.specialdates.home\n\nimport android.app.Activity\nimport android.content.ActivityNotFoundException\nimport android.content.Intent\nimport android.net.Uri\nimport com.alexstyl.specialdates.CrashAndErrorTracker\nimport com.alexstyl.specialdates.ShareAppIntentCreator\nimport com.alexstyl.specialdates.Strings\nimport com.alexstyl.specialdates.addevent.AddEventActivity\nimport com.alexstyl.specialdates.analytics.Analytics\nimport com.alexstyl.specialdates.analytics.Screen\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.donate.DonateActivity\nimport com.alexstyl.specialdates.events.namedays.activity.NamedaysOnADayActivity\nimport com.alexstyl.specialdates.facebook.FacebookProfileActivity\nimport com.alexstyl.specialdates.facebook.FacebookUserSettings\nimport com.alexstyl.specialdates.facebook.login.FacebookLogInActivity\nimport com.alexstyl.specialdates.permissions.ContactPermissionActivity\nimport com.alexstyl.specialdates.person.PersonActivity\nimport com.alexstyl.specialdates.search.SearchActivity\nimport com.alexstyl.specialdates.theming.AttributeExtractor\nimport com.google.android.gms.common.ConnectionResult\nimport com.google.android.gms.common.GoogleApiAvailability\nimport com.novoda.simplechromecustomtabs.SimpleChromeCustomTabs\n\nclass HomeNavigator(private val analytics: Analytics,\n                    private val strings: Strings,\n                    private val facebookUserSettings: FacebookUserSettings,\n                    private val tracker: CrashAndErrorTracker,\n                    private val attributeExtractor: AttributeExtractor) {\n\n    fun toDonate(activity: Activity) {\n        if (hasPlayStoreInstalled(activity)) {\n            val intent = DonateActivity.createIntent(activity)\n            activity.startActivity(intent)\n        } else {\n            SimpleChromeCustomTabs.getInstance()\n                    .withFallback { navigateToDonateWebsite(activity) }\n                    .withIntentCustomizer { simpleChromeCustomTabsIntentBuilder ->\n                        val toolbarColor = attributeExtractor.extractPrimaryColorFrom(activity)\n                        simpleChromeCustomTabsIntentBuilder.withToolbarColor(toolbarColor)\n                    }\n                    .navigateTo(SUPPORT_URL, activity)\n\n        }\n        analytics.trackScreen(Screen.DONATE)\n    }\n\n    private fun hasPlayStoreInstalled(activity: Activity): Boolean {\n        val googleApiAvailability = GoogleApiAvailability.getInstance()\n        val resultCode = googleApiAvailability.isGooglePlayServicesAvailable(activity)\n        return resultCode == ConnectionResult.SUCCESS\n    }\n\n    private fun navigateToDonateWebsite(activity: Activity) {\n        try {\n            val intent = Intent(Intent.ACTION_VIEW)\n            intent.data = SUPPORT_URL\n            activity.startActivity(intent)\n        } catch (e: ActivityNotFoundException) {\n            tracker.track(e)\n        }\n    }\n\n    fun toAddEvent(activity: Activity, code: Int) {\n        val intent = Intent(activity, AddEventActivity::class.java)\n        activity.startActivityForResult(intent, code)\n    }\n\n    fun toFacebookImport(activity: Activity) {\n        if (facebookUserSettings.isLoggedIn) {\n            val intent = Intent(activity, FacebookProfileActivity::class.java)\n            activity.startActivity(intent)\n        } else {\n            val intent = Intent(activity, FacebookLogInActivity::class.java)\n            activity.startActivity(intent)\n        }\n    }\n\n    fun toSearch(activity: Activity) {\n        val intent = Intent(activity, SearchActivity::class.java)\n        activity.startActivity(intent)\n        analytics.trackScreen(Screen.SEARCH)\n    }\n\n    fun toDateDetails(dateSelected: Date, activity: Activity) {\n        val intent = NamedaysOnADayActivity.getStartIntent(activity, dateSelected)\n        activity.startActivity(intent)\n        analytics.trackScreen(Screen.DATE_DETAILS)\n    }\n\n    fun toAppInvite(activity: Activity) {\n        val intent = ShareAppIntentCreator(strings).buildIntent()\n        val shareTitle = strings.inviteFriend()\n        activity.startActivity(Intent.createChooser(intent, shareTitle))\n        analytics.trackAppInviteRequested()\n    }\n\n    fun toGithubPage(activity: Activity) {\n        val intent = Intent(Intent.ACTION_VIEW)\n        intent.data = Uri.parse(\"https://github.com/alexstyl/Memento-Calendar\")\n        analytics.trackVisitGithub()\n        activity.startActivity(intent)\n    }\n\n    fun toContactDetails(contact: Contact, activity: Activity) {\n        val intent = PersonActivity.buildIntentFor(activity, contact)\n        activity.startActivity(intent)\n        analytics.trackContactDetailsViewed(contact)\n    }\n\n    fun toContactPermission(activity: Activity, requestCode: Int) {\n        val intent = Intent(activity, ContactPermissionActivity::class.java)\n        activity.startActivityForResult(intent, requestCode)\n        analytics.trackScreen(Screen.CONTACT_PERMISSION_REQUESTED)\n    }\n\n    companion object {\n        private val SUPPORT_URL = Uri.parse(\"https://g3mge.app.goo.gl/jdF1\")\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/home/HomeViewPagerAdapter.java",
    "content": "package com.alexstyl.specialdates.home;\n\nimport android.support.v4.app.Fragment;\nimport android.support.v4.app.FragmentManager;\nimport android.support.v4.app.FragmentPagerAdapter;\n\nimport com.alexstyl.specialdates.people.PeopleFragment;\nimport com.alexstyl.specialdates.settings.UserSettingsFragment;\nimport com.alexstyl.specialdates.upcoming.UpcomingEventsFragment;\n\nimport java.util.HashMap;\n\nclass HomeViewPagerAdapter extends FragmentPagerAdapter {\n\n    private HashMap<Integer, Fragment> pages = new HashMap<>();\n\n    private static final int PAGE_COUNT = 3;\n\n    HomeViewPagerAdapter(FragmentManager fragmentManager) {\n        super(fragmentManager);\n    }\n\n    @Override\n    public Fragment getItem(int position) {\n        Fragment fragment = pages.get(position);\n        if (fragment == null) {\n            fragment = createFragmentFor(position);\n            pages.put(position, fragment);\n        }\n        return fragment;\n    }\n\n    private Fragment createFragmentFor(int position) {\n        switch (position) {\n            case HomeActivity.PAGE_EVENTS:\n                return new UpcomingEventsFragment();\n            case HomeActivity.PAGE_CONTACTS:\n                return new PeopleFragment();\n            case HomeActivity.PAGE_SETTINGS:\n                return new UserSettingsFragment();\n        }\n        throw new IllegalArgumentException(\"Position \" + position + \" is invalid\");\n    }\n\n    @Override\n    public int getCount() {\n        return PAGE_COUNT;\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/home/OnCloseBannerListener.kt",
    "content": "package com.alexstyl.specialdates.home\n\ninterface OnCloseBannerListener {\n    fun onCloseButtonPressed()\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/home/SearchTransitioner.java",
    "content": "package com.alexstyl.specialdates.home;\n\nimport android.annotation.TargetApi;\nimport android.app.Activity;\nimport android.os.Build;\nimport android.support.transition.Fade;\nimport android.support.transition.Transition;\nimport android.support.transition.TransitionManager;\nimport android.support.v4.view.ViewCompat;\nimport android.view.ViewGroup;\nimport android.widget.FrameLayout;\n\nimport com.alexstyl.android.Version;\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.transition.FadeInTransition;\nimport com.alexstyl.specialdates.transition.FadeOutTransition;\nimport com.alexstyl.specialdates.transition.SimpleTransitionListener;\nimport com.alexstyl.specialdates.ui.ViewFader;\nimport com.alexstyl.specialdates.upcoming.view.ExposedSearchToolbar;\n\nimport static android.view.View.GONE;\nimport static android.view.View.VISIBLE;\n\nfinal class SearchTransitioner {\n\n    private final Activity activity;\n    private final HomeNavigator navigator;\n    private final ViewGroup activityContent;\n    private final ExposedSearchToolbar toolbar;\n    private final FrameLayout toolbarHolder;\n    private final ViewFader viewFader;\n\n    private final int toolbarMargin;\n    private boolean transitioning;\n\n    SearchTransitioner(Activity activity,\n                       HomeNavigator navigator,\n                       ViewGroup activityContent,\n                       ExposedSearchToolbar toolbar,\n                       FrameLayout toolbarHolder,\n                       ViewFader viewFader) {\n        this.activity = activity;\n        this.navigator = navigator;\n        this.activityContent = activityContent;\n        this.toolbar = toolbar;\n        this.toolbarHolder = toolbarHolder;\n        this.viewFader = viewFader;\n        this.toolbarMargin = activity.getResources().getDimensionPixelSize(R.dimen.padding_tight);\n    }\n\n    @TargetApi(Build.VERSION_CODES.LOLLIPOP)\n    void transitionToSearch() {\n        if (transitioning) {\n            return;\n        }\n        if (supportsTransitions()) {\n            Transition transition = FadeOutTransition.withAction(navigateToSearchWhenDone());\n            TransitionManager.beginDelayedTransition(toolbar, transition);\n            ViewCompat.setElevation(toolbarHolder, activity.getResources().getDimensionPixelSize(R.dimen.toolbar_elevation));\n            expandToolbar();\n            viewFader.hideContentOf(toolbar);\n\n            TransitionManager.beginDelayedTransition(activityContent, new Fade(Fade.OUT));\n            activityContent.setVisibility(GONE);\n        } else {\n            navigator.toSearch(activity);\n        }\n    }\n\n    private void expandToolbar() {\n        FrameLayout.LayoutParams frameLP = (FrameLayout.LayoutParams) toolbar.getLayoutParams();\n        frameLP.setMargins(0, 0, 0, 0);\n        toolbar.setLayoutParams(frameLP);\n    }\n\n    private Transition.TransitionListener navigateToSearchWhenDone() {\n        return new SimpleTransitionListener() {\n\n            @Override\n            public void onTransitionStart(Transition transition) {\n                transitioning = true;\n            }\n\n            @Override\n            public void onTransitionEnd(Transition transition) {\n                transitioning = false;\n                navigator.toSearch(activity);\n                activity.overridePendingTransition(0, 0);\n            }\n        };\n    }\n\n    private static boolean supportsTransitions() {\n        return Version.INSTANCE.hasKitKat();\n    }\n\n    @TargetApi(Build.VERSION_CODES.LOLLIPOP)\n    void onActivityResumed() {\n        if (supportsTransitions()) {\n            TransitionManager.beginDelayedTransition(toolbar, FadeInTransition.createTransition());\n            FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) toolbar.getLayoutParams();\n            layoutParams.setMargins(toolbarMargin, toolbarMargin, toolbarMargin, toolbarMargin);\n            viewFader.showContent(toolbar);\n            toolbar.setLayoutParams(layoutParams);\n\n            TransitionManager.beginDelayedTransition(activityContent, new Fade(Fade.IN));\n            activityContent.setVisibility(VISIBLE);\n            ViewCompat.setElevation(toolbarHolder, 0);\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/images/AndroidContactsImageDownloader.kt",
    "content": "package com.alexstyl.specialdates.images\n\nimport android.content.Context\nimport android.net.Uri\nimport android.provider.ContactsContract\nimport com.nostra13.universalimageloader.core.download.BaseImageDownloader\nimport java.io.InputStream\n\nclass AndroidContactsImageDownloader(context: Context) : BaseImageDownloader(context) {\n\n    override fun getStreamFromContent(imageUri: String?, extra: Any?): InputStream {\n        val res = context.contentResolver\n        val uri = Uri.parse(imageUri)\n\n        return if (imageUri != null && imageUri.startsWith(\"content://com.android.contacts/\")) {\n            ContactsContract.Contacts.openContactPhotoInputStream(res, uri, true)\n        } else res.openInputStream(uri)\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/images/CrossFadeBitmapDisplayer.java",
    "content": "package com.alexstyl.specialdates.images;\n\nimport android.content.res.Resources;\nimport android.graphics.Bitmap;\nimport android.graphics.drawable.BitmapDrawable;\nimport android.graphics.drawable.ColorDrawable;\nimport android.graphics.drawable.Drawable;\nimport android.graphics.drawable.TransitionDrawable;\nimport android.widget.ImageView;\n\nimport com.nostra13.universalimageloader.core.assist.LoadedFrom;\nimport com.nostra13.universalimageloader.core.display.BitmapDisplayer;\nimport com.nostra13.universalimageloader.core.imageaware.ImageAware;\n\n/**\n * A {@linkplain BitmapDisplayer} that cross fades the original set Drawable of the view with the newly loaded one.\n */\nclass CrossFadeBitmapDisplayer implements BitmapDisplayer {\n    private final int fadeInTime;\n    private final Resources resources;\n    private final ColorDrawable transparent;\n\n    CrossFadeBitmapDisplayer(Resources resources, int duration) {\n        this.fadeInTime = duration;\n        this.resources = resources;\n        this.transparent = new ColorDrawable(resources.getColor(android.R.color.transparent));\n    }\n\n    @Override\n    public void display(Bitmap bitmap, ImageAware imageAware, LoadedFrom loadedFrom) {\n        if (imageAware == null || imageAware.getWrappedView() == null) {\n            throw new IllegalStateException(\"Cannot use this displayer without a target\");\n        }\n        BitmapDrawable bitmapDrawable = new BitmapDrawable(resources, bitmap);\n        display(imageAware, loadedFrom, bitmapDrawable);\n    }\n\n    protected void display(ImageAware imageAware, LoadedFrom loadedFrom, Drawable drawable) {\n        if (loadedFrom == LoadedFrom.MEMORY_CACHE) {\n            imageAware.setImageDrawable(drawable);\n        } else {\n            ImageView imageView = (ImageView) imageAware.getWrappedView();\n            Drawable previous = imageView.getDrawable();\n            if (previous == null) {\n                previous = transparent;\n            }\n\n            TransitionDrawable transition = new TransitionDrawable(\n                    new Drawable[]{\n                            previous,\n                            drawable\n                    }\n            );\n\n            transition.setCrossFadeEnabled(true);\n            imageAware.setImageDrawable(transition);\n            transition.startTransition(fadeInTime);\n\n        }\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/images/CrossFadeCircleBitmapDisplayer.java",
    "content": "package com.alexstyl.specialdates.images;\n\nimport android.content.res.Resources;\nimport android.graphics.Bitmap;\n\nimport com.nostra13.universalimageloader.core.assist.LoadedFrom;\nimport com.nostra13.universalimageloader.core.display.CircleBitmapDisplayer;\nimport com.nostra13.universalimageloader.core.imageaware.ImageAware;\n\nclass CrossFadeCircleBitmapDisplayer extends CrossFadeBitmapDisplayer {\n\n    CrossFadeCircleBitmapDisplayer(Resources resources, int duration) {\n        super(resources, duration);\n    }\n\n    @Override\n    public void display(Bitmap bitmap, ImageAware imageAware, LoadedFrom loadedFrom) {\n        CircleBitmapDisplayer.CircleDrawable circleDrawable = new CircleBitmapDisplayer.CircleDrawable(bitmap, 0, 0);\n        display(imageAware, loadedFrom, circleDrawable);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/images/DecodedImage.java",
    "content": "package com.alexstyl.specialdates.images;\n\npublic final class DecodedImage {\n\n    public static final DecodedImage EMPTY = new DecodedImage(null);\n\n    private final byte[] bytes;\n\n    DecodedImage(byte[] bytes) {\n        this.bytes = bytes;\n    }\n\n    public byte[] getBytes() {\n        return bytes.clone();\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/images/ImageDecoder.kt",
    "content": "package com.alexstyl.specialdates.images\n\nimport android.graphics.Bitmap\nimport com.novoda.notils.logger.simple.Log\nimport java.io.ByteArrayOutputStream\nimport java.io.IOException\nimport java.net.URI\n\nclass ImageDecoder(private val imageLoader: ImageLoader) {\n\n    fun decodeFrom(imageUri: URI): DecodedImage? {\n        val bitmapOptional = imageLoader.load(imageUri).withSize(700, 700).synchronously()\n        return if (bitmapOptional.isPresent) {\n            decodeFrom(bitmapOptional.get())\n        } else {\n            null\n        }\n    }\n\n    private fun decodeFrom(bitmap: Bitmap): DecodedImage? {\n        val size = bitmap.width * bitmap.height * SIZE_MULTIPLIER\n        val stream = ByteArrayOutputStream(size)\n        try {\n            bitmap.compress(Bitmap.CompressFormat.PNG, FULL_QUALITY, stream)\n            stream.flush()\n            stream.close()\n            val bytes = stream.toByteArray()\n            return DecodedImage(bytes)\n        } catch (e: IOException) {\n            Log.w(\"Unable to serialize photo: \" + e.toString())\n            return null\n        }\n\n    }\n\n    companion object {\n        private const val FULL_QUALITY = 100\n        private const val SIZE_MULTIPLIER = 4\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/images/ImageLoadedConsumer.java",
    "content": "package com.alexstyl.specialdates.images;\n\nimport android.graphics.Bitmap;\n\npublic interface ImageLoadedConsumer {\n    void onImageLoaded(Bitmap loadedImage);\n    void onLoadingFailed();\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/images/ImageLoader.kt",
    "content": "package com.alexstyl.specialdates.images\n\nimport android.graphics.Bitmap\nimport android.support.annotation.Px\nimport android.widget.ImageView\n\nimport com.alexstyl.specialdates.Optional\n\nimport java.net.URI\n\ninterface ImageLoader {\n\n    fun load(imagePath: URI): Request\n\n    interface Request {\n\n        fun withSize(@Px width: Int, @Px height: Int): FixedSizeRequest\n\n        fun into(imageView: ImageView)\n\n        fun asCircle(): Request\n    }\n\n    interface FixedSizeRequest {\n        fun synchronously(): Optional<Bitmap>\n\n        fun into(consumer: ImageLoadedConsumer)\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/images/ImageModule.java",
    "content": "package com.alexstyl.specialdates.images;\n\nimport android.content.res.Resources;\n\nimport javax.inject.Singleton;\n\nimport dagger.Module;\nimport dagger.Provides;\n\n@Module\n@Singleton\npublic class ImageModule {\n\n    private static final int CROSSFADE_DURATION = 200;\n    private final Resources resources;\n\n    public ImageModule(Resources resources) {\n        this.resources = resources;\n    }\n\n    @Provides\n    @Singleton\n    ImageLoader providesImageLoader() {\n        return new UILImageLoader(\n                new CrossFadeBitmapDisplayer(resources, CROSSFADE_DURATION),\n                new CrossFadeCircleBitmapDisplayer(resources, CROSSFADE_DURATION)\n        );\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/images/NutraBaseImageDecoder.java",
    "content": "package com.alexstyl.specialdates.images;\n\nimport com.nostra13.universalimageloader.core.decode.BaseImageDecoder;\nimport com.nostra13.universalimageloader.core.decode.ImageDecodingInfo;\n\nimport java.io.IOException;\nimport java.io.InputStream;\n\npublic class NutraBaseImageDecoder extends BaseImageDecoder {\n\n    public NutraBaseImageDecoder(boolean loggingEnabled) {\n        super(loggingEnabled);\n    }\n\n    @Override\n    protected InputStream getImageStream(ImageDecodingInfo decodingInfo) throws IOException {\n        InputStream stream = decodingInfo.getDownloader()\n                .getStream(decodingInfo.getImageUri(), decodingInfo.getExtraForDownloader());\n        return stream == null ? null : new JpegClosedInputStream(stream);\n    }\n\n    private static final class JpegClosedInputStream extends InputStream {\n\n        private static final int JPEG_EOI_1 = 0xFF;\n        private static final int JPEG_EOI_2 = 0xD9;\n        private final InputStream inputStream;\n        private int bytesPastEnd;\n\n        private JpegClosedInputStream(final InputStream iInputStream) {\n            inputStream = iInputStream;\n            bytesPastEnd = 0;\n        }\n\n        @Override\n        public int read() throws IOException {\n            int buffer = inputStream.read();\n            if (buffer == -1) {\n                if (bytesPastEnd > 0) {\n                    buffer = JPEG_EOI_2;\n                } else {\n                    ++bytesPastEnd;\n                    buffer = JPEG_EOI_1;\n                }\n            }\n\n            return buffer;\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/images/SimpleImageLoadedConsumer.java",
    "content": "package com.alexstyl.specialdates.images;\n\nimport android.graphics.Bitmap;\n\npublic class SimpleImageLoadedConsumer implements ImageLoadedConsumer {\n\n    @Override\n    public void onImageLoaded(Bitmap loadedImage) {\n        // do nothing\n    }\n\n    @Override\n    public void onLoadingFailed() {\n        // do nothing\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/images/UILImageLoader.java",
    "content": "package com.alexstyl.specialdates.images;\n\nimport android.graphics.Bitmap;\nimport android.support.annotation.NonNull;\nimport android.support.annotation.Px;\nimport android.view.View;\nimport android.widget.ImageView;\n\nimport com.alexstyl.specialdates.Optional;\nimport com.nostra13.universalimageloader.core.DefaultConfigurationFactory;\nimport com.nostra13.universalimageloader.core.DisplayImageOptions;\nimport com.nostra13.universalimageloader.core.assist.FailReason;\nimport com.nostra13.universalimageloader.core.assist.ImageSize;\nimport com.nostra13.universalimageloader.core.display.BitmapDisplayer;\nimport com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener;\n\nimport java.net.URI;\n\nclass UILImageLoader implements com.alexstyl.specialdates.images.ImageLoader {\n\n    private final com.nostra13.universalimageloader.core.ImageLoader uil;\n    private final BitmapDisplayer defaultDisplayer;\n    private final BitmapDisplayer defaultCircleDisplayer;\n\n    UILImageLoader(CrossFadeBitmapDisplayer defaultDisplayer, CrossFadeCircleBitmapDisplayer circleDefaultDisplayer) {\n        this.defaultDisplayer = defaultDisplayer;\n        this.defaultCircleDisplayer = circleDefaultDisplayer;\n        this.uil = com.nostra13.universalimageloader.core.ImageLoader.getInstance();\n    }\n\n    @NonNull\n    @Override\n    public Request load(@NonNull final URI imagePath) {\n        final DisplayImageOptions.Builder builder = standardBuilder();\n        return new Request() {\n\n            @Override\n            public void into(@NonNull ImageView imageView) {\n                uil.displayImage(imagePath.toString(), imageView, builder.build());\n            }\n\n            @NonNull\n            @Override\n            public Request asCircle() {\n                builder.displayer(defaultCircleDisplayer);\n                return this;\n            }\n\n            @NonNull\n            @Override\n            public FixedSizeRequest withSize(@Px final int width, @Px final int height) {\n                builder.displayer(DefaultConfigurationFactory.createBitmapDisplayer());\n                return new FixedSizeRequest() {\n                    @NonNull\n                    @Override\n                    public Optional<Bitmap> synchronously() {\n                        Bitmap bitmap = uil.loadImageSync(imagePath.toString(), new ImageSize(width, height), builder.build());\n                        if (bitmap == null) {\n                            return Optional.Companion.absent();\n                        } else {\n                            return new Optional<>(bitmap);\n                        }\n                    }\n\n                    @Override\n                    public void into(@NonNull final ImageLoadedConsumer consumer) {\n                        builder.displayer(DefaultConfigurationFactory.createBitmapDisplayer());\n                        uil.loadImage(imagePath.toString(), builder.build(), new SimpleImageLoadingListener() {\n                            @Override\n                            public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {\n                                consumer.onImageLoaded(loadedImage);\n                            }\n\n                            @Override\n                            public void onLoadingFailed(String imageUri, View view, FailReason failReason) {\n                                consumer.onLoadingFailed();\n                            }\n                        });\n                    }\n                };\n            }\n        };\n    }\n\n    private DisplayImageOptions.Builder standardBuilder() {\n        return new DisplayImageOptions.Builder()\n                .displayer(defaultDisplayer)\n                .resetViewBeforeLoading(true)\n                .cacheOnDisk(true)\n                .cacheInMemory(true);\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/people/ImportFromFacebookViewHolder.kt",
    "content": "package com.alexstyl.specialdates.people\n\nimport android.support.v7.widget.RecyclerView\nimport android.view.View\nimport android.widget.TextView\n\ninternal class ImportFromFacebookViewHolder(rowView: View, private val label: TextView) : RecyclerView.ViewHolder(rowView) {\n\n    fun bind(viewModel: FacebookImportViewModel, listener: PeopleViewHolderListener) {\n        label.text = viewModel.label\n        itemView.setOnClickListener { listener.onFacebookImport() }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/people/NoContactViewHolder.kt",
    "content": "package com.alexstyl.specialdates.people\n\nimport android.support.v7.widget.RecyclerView\nimport android.view.View\n\nclass NoContactViewHolder(rowView: View) : RecyclerView.ViewHolder(rowView) {\n\n    fun bind(listener: PeopleViewHolderListener) {\n        itemView.setOnClickListener { listener.onAddContactClicked() }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/people/PeopleAdapter.java",
    "content": "package com.alexstyl.specialdates.people;\n\nimport android.support.v7.util.DiffUtil;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.TextView;\n\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.images.ImageLoader;\nimport com.alexstyl.specialdates.ui.widget.ColorImageView;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nclass PeopleAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {\n\n    private static final int VIEW_TYPE_PERSON = 0;\n    private static final int VIEW_TYPE_IMPORT_FACEBOOK = 1;\n    private static final int VIEW_TYPE_NO_CONTACTS = 2;\n\n    private final List<PeopleRowViewModel> people = new ArrayList<>();\n    private final LayoutInflater inflater;\n    private final PeopleViewHolderListener listener;\n    private final ImageLoader imageLoader;\n\n    PeopleAdapter(ImageLoader imageLoader, LayoutInflater inflater, PeopleViewHolderListener listener) {\n        this.imageLoader = imageLoader;\n        this.inflater = inflater;\n        this.listener = listener;\n    }\n\n    @Override\n    public int getItemViewType(int position) {\n        PeopleRowViewModel personViewModel = people.get(position);\n        if (personViewModel instanceof PersonViewModel) {\n            return VIEW_TYPE_PERSON;\n        }\n        if (personViewModel instanceof FacebookImportViewModel) {\n            return VIEW_TYPE_IMPORT_FACEBOOK;\n        }\n        if (personViewModel instanceof NoContactsViewModel) {\n            return VIEW_TYPE_NO_CONTACTS;\n        }\n        throw new IllegalStateException(\"Unhandled view type for \" + personViewModel.getClass());\n    }\n\n    @Override\n    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        if (viewType == VIEW_TYPE_PERSON) {\n            View rowView = inflater.inflate(R.layout.row_people, parent, false);\n\n            ColorImageView imageView = rowView.findViewById(R.id.people_avatar);\n            TextView nameView = rowView.findViewById(R.id.people_name);\n            return new PeopleViewHolder(rowView, imageLoader, imageView, nameView);\n        } else if (viewType == VIEW_TYPE_IMPORT_FACEBOOK) {\n            View rowView = inflater.inflate(R.layout.row_people_import_from_facebook, parent, false);\n            return new ImportFromFacebookViewHolder(rowView, (TextView) rowView.findViewById(R.id.row_people_facebook_import));\n        } else if (viewType == VIEW_TYPE_NO_CONTACTS) {\n            View rowView = inflater.inflate(R.layout.row_people_no_contacts, parent, false);\n            return new NoContactViewHolder(rowView);\n        }\n        throw new IllegalArgumentException(\"Cannot create holder for viewType \" + viewType);\n    }\n\n    @Override\n    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {\n        int itemViewType = getItemViewType(position);\n\n        if (itemViewType == VIEW_TYPE_PERSON) {\n            ((PeopleViewHolder) holder).bind((PersonViewModel) people.get(position), listener);\n        } else if (itemViewType == VIEW_TYPE_IMPORT_FACEBOOK) {\n            ((ImportFromFacebookViewHolder) holder).bind((FacebookImportViewModel) people.get(position), listener);\n        } else if (itemViewType == VIEW_TYPE_NO_CONTACTS) {\n            ((NoContactViewHolder) holder).bind(listener);\n        }\n    }\n\n    void updateWith(List<PeopleRowViewModel> viewModels) {\n        DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new PeopleDiffCallback(people, viewModels));\n        this.people.clear();\n        this.people.addAll(viewModels);\n        diffResult.dispatchUpdatesTo(this);\n    }\n\n    @Override\n    public int getItemCount() {\n        return people.size();\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/people/PeopleDiffCallback.kt",
    "content": "package com.alexstyl.specialdates.people\n\nimport android.support.v7.util.DiffUtil\n\nclass PeopleDiffCallback(private val oldViewModels: List<PeopleRowViewModel>,\n                         private val newViewModels: List<PeopleRowViewModel>)\n    : DiffUtil.Callback() {\n\n    override fun getOldListSize(): Int {\n        return oldViewModels.size\n    }\n\n    override fun getNewListSize(): Int {\n        return newViewModels.size\n    }\n\n    override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {\n        val oldViewModel = oldViewModels[oldItemPosition]\n        val newViewModel = newViewModels[newItemPosition]\n\n        if (oldViewModel is FacebookImportViewModel && newViewModel is FacebookImportViewModel) {\n            return true\n        }\n\n        if (oldViewModel is NoContactsViewModel && newViewModel is NoContactsViewModel) {\n            return true\n        }\n\n        if (oldViewModel is PersonViewModel && newViewModel is PersonViewModel) {\n            val (_, _, _, oldModelId, oldModelSource) = oldViewModels[oldItemPosition] as PersonViewModel\n            val (_, _, _, newModelId, newModelSource) = newViewModels[newItemPosition] as PersonViewModel\n            return oldModelId == newModelId && oldModelSource == newModelSource\n        }\n        return false\n    }\n\n    override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {\n        val oldViewModel = oldViewModels[oldItemPosition]\n        val newViewModel = newViewModels[newItemPosition]\n\n        if (oldViewModel is NoContactsViewModel && newViewModel is NoContactsViewModel) {\n            return true\n        }\n        if (oldViewModel is FacebookImportViewModel && newViewModel is FacebookImportViewModel) {\n            return oldViewModel == newViewModel\n        }\n\n        if (oldViewModel is PersonViewModel && newViewModel is PersonViewModel) {\n            val oldPersonViewModel = oldViewModels[oldItemPosition] as PersonViewModel\n            val newPersonViewModel = newViewModels[newItemPosition] as PersonViewModel\n\n            return oldPersonViewModel == newPersonViewModel\n        }\n        return false\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/people/PeopleFragment.java",
    "content": "package com.alexstyl.specialdates.people;\n\nimport android.os.Bundle;\nimport android.support.annotation.NonNull;\nimport android.support.annotation.Nullable;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ProgressBar;\n\nimport com.alexstyl.specialdates.MementoApplication;\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.UpcomingEventsView;\nimport com.alexstyl.specialdates.contact.Contact;\nimport com.alexstyl.specialdates.events.peopleevents.UpcomingEventsViewRefresher;\nimport com.alexstyl.specialdates.home.HomeActivity;\nimport com.alexstyl.specialdates.home.HomeNavigator;\nimport com.alexstyl.specialdates.images.ImageLoader;\nimport com.alexstyl.specialdates.ui.base.MementoFragment;\n\nimport javax.inject.Inject;\nimport java.util.List;\n\npublic class PeopleFragment extends MementoFragment implements PeopleView, UpcomingEventsView {\n\n    @Inject ImageLoader imageLoader;\n    @Inject HomeNavigator navigator;\n    @Inject PeoplePresenter presenter;\n    @Inject UpcomingEventsViewRefresher refresher;\n\n    private PeopleAdapter adapter;\n    private ProgressBar loadingView;\n    private RecyclerView recyclerView;\n\n    @Override\n    public void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        ((MementoApplication) getActivity().getApplication()).getApplicationModule().inject(this);\n    }\n\n    @Nullable\n    @Override\n    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {\n        View inflate = inflater.inflate(R.layout.fragment_people, container, false);\n\n        loadingView = inflate.findViewById(R.id.people_loading);\n        recyclerView = inflate.findViewById(R.id.people_list);\n        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false));\n        adapter = new PeopleAdapter(imageLoader, inflater, new PeopleViewHolderListener() {\n            @Override\n            public void onPersonClicked(Contact contact) {\n                navigator.toContactDetails(contact, getActivity());\n            }\n\n            @Override\n            public void onFacebookImport() {\n                navigator.toFacebookImport(getActivity());\n            }\n\n            @Override\n            public void onAddContactClicked() {\n                navigator.toAddEvent(getActivity(), HomeActivity.CODE_ADD_EVENT);\n            }\n        });\n        recyclerView.setAdapter(adapter);\n        recyclerView.addItemDecoration(\n                new PeopleItemDecorator(\n                        getResources().getDimensionPixelSize(R.dimen.people_import_bottom_spacing),\n                        getResources().getDimensionPixelSize(R.dimen.people_inbetween_spacing)\n                ));\n        return inflate;\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n        presenter.startPresentingInto(this);\n        refresher.addEventsView(this);\n    }\n\n    @Override\n    public void onPause() {\n        super.onPause();\n        presenter.stopPresenting();\n        refresher.removeView(this);\n    }\n\n    @Override\n    public void displayPeople(List<PeopleRowViewModel> viewModels) {\n        loadingView.setVisibility(View.GONE);\n        recyclerView.setVisibility(View.VISIBLE);\n        adapter.updateWith(viewModels);\n    }\n\n    @Override\n    public void showLoading() {\n        if (isDisplayNoData()) {\n            recyclerView.setVisibility(View.GONE);\n            loadingView.setVisibility(View.VISIBLE);\n        }\n    }\n\n    private boolean isDisplayNoData() {\n        return recyclerView.getChildCount() == 0;\n    }\n\n    @Override\n    public void reloadUpcomingEventsView() {\n        presenter.refreshData();\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/people/PeopleItemDecorator.java",
    "content": "package com.alexstyl.specialdates.people;\n\nimport android.graphics.Rect;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.View;\n\nclass PeopleItemDecorator extends RecyclerView.ItemDecoration {\n\n    private final int categoryMargin;\n    private final int itemInBetweenMargin;\n\n    PeopleItemDecorator(int categoryMargin, int itemInBetweenMargin) {\n        this.categoryMargin = categoryMargin;\n        this.itemInBetweenMargin = itemInBetweenMargin;\n    }\n\n    @Override\n    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {\n        if (parent.getChildViewHolder(view) instanceof ImportFromFacebookViewHolder) {\n            outRect.bottom = categoryMargin;\n        } else {\n            outRect.bottom = itemInBetweenMargin;\n        }\n\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/people/PeopleModule.java",
    "content": "package com.alexstyl.specialdates.people;\n\nimport com.alexstyl.specialdates.CrashAndErrorTracker;\nimport com.alexstyl.specialdates.Strings;\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsProvider;\nimport com.alexstyl.specialdates.facebook.FacebookUserSettings;\nimport com.alexstyl.specialdates.permissions.MementoPermissions;\n\nimport dagger.Module;\nimport dagger.Provides;\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.schedulers.Schedulers;\n\n@Module\npublic class PeopleModule {\n\n    @Provides\n    PeopleViewModelFactory viewModelFactory(Strings strings, FacebookUserSettings facebookPrefs) {\n        return new PeopleViewModelFactory(strings, facebookPrefs);\n    }\n\n    @Provides\n    PeoplePresenter presenter(MementoPermissions permissions,\n                              PeopleEventsProvider peopleEventsProvider,\n                              PeopleViewModelFactory viewModelFactory,\n                              CrashAndErrorTracker errorTracker) {\n        return new PeoplePresenter(\n                permissions,\n                peopleEventsProvider,\n                viewModelFactory,\n                errorTracker,\n                Schedulers.io(),\n                AndroidSchedulers.mainThread()\n        );\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/people/PeopleViewHolder.java",
    "content": "package com.alexstyl.specialdates.people;\n\nimport android.support.v7.widget.RecyclerView;\nimport android.view.View;\nimport android.widget.TextView;\n\nimport com.alexstyl.specialdates.images.ImageLoader;\nimport com.alexstyl.specialdates.ui.widget.ColorImageView;\n\nclass PeopleViewHolder extends RecyclerView.ViewHolder {\n\n    private final ColorImageView imageView;\n    private final TextView nameView;\n    private final ImageLoader imageLoader;\n\n    PeopleViewHolder(View rowView, ImageLoader imageLoader, ColorImageView imageView, TextView nameView) {\n        super(rowView);\n        this.imageLoader = imageLoader;\n        this.imageView = imageView;\n        this.nameView = nameView;\n    }\n\n    public void bind(final PersonViewModel viewModel, final PeopleViewHolderListener listener) {\n        nameView.setText(viewModel.getPersonName());\n        imageView.setCircleColorVariant((int) viewModel.getPersonId());\n        imageView.setLetter(viewModel.getPersonName(), true);\n        imageLoader.load(viewModel.getAvatarURI())\n                .asCircle()\n                .into(imageView.getImageView());\n\n        itemView.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View view) {\n                listener.onPersonClicked(viewModel.getContact());\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/permissions/AndroidPermissions.kt",
    "content": "package com.alexstyl.specialdates.permissions\n\nimport android.Manifest.permission.READ_CONTACTS\nimport android.Manifest.permission.READ_EXTERNAL_STORAGE\nimport android.Manifest.permission.WRITE_CONTACTS\nimport android.content.Context\nimport android.content.pm.PackageManager\nimport android.support.v4.app.ActivityCompat\nimport com.alexstyl.specialdates.CrashAndErrorTracker\n\nclass AndroidPermissions(private val tracker: CrashAndErrorTracker, private val context: Context) : MementoPermissions {\n\n    override fun canReadAndWriteContacts(): Boolean {\n        return canReadContacts() && hasPermission(context, WRITE_CONTACTS, tracker)\n    }\n\n    override fun canReadContacts(): Boolean {\n        return hasPermission(context, READ_CONTACTS, tracker)\n    }\n\n    override fun canReadExternalStorage(): Boolean {\n        return hasPermission(context, READ_EXTERNAL_STORAGE, tracker)\n    }\n\n    private fun hasPermission(context: Context, permission: String, tracker: CrashAndErrorTracker): Boolean {\n        return try {\n            ActivityCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED\n        } catch (ex: RuntimeException) {\n            // some devices randomly throw an exception to this point. just treat as if the permission is not there\n            tracker.track(ex)\n            false\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/permissions/ContactPermissionActivity.java",
    "content": "package com.alexstyl.specialdates.permissions;\n\nimport android.Manifest;\nimport android.annotation.TargetApi;\nimport android.content.pm.PackageManager;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.support.annotation.NonNull;\nimport android.view.View;\nimport android.widget.Button;\n\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.ui.base.ThemedMementoActivity;\nimport com.novoda.notils.caster.Views;\n\n@TargetApi(Build.VERSION_CODES.M) // Runtime permissions were added in M (SDK 23)\npublic class ContactPermissionActivity extends ThemedMementoActivity {\n\n    private static final int REQUEST_CONTACT_PERMISSION = 5;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        setContentView(R.layout.activity_contact_permission_request);\n        setResult(RESULT_CANCELED);\n\n        Button grantButton = Views.findById(this, R.id.contact_permission_grant_button);\n        grantButton.setOnClickListener(onGrantPermissionButtonClicked);\n    }\n\n    private final View.OnClickListener onGrantPermissionButtonClicked = new View.OnClickListener() {\n        @Override\n        public void onClick(View v) {\n            requestContactPermission();\n        }\n    };\n\n    private void requestContactPermission() {\n        requestPermissions(\n                new String[]{Manifest.permission.READ_CONTACTS,\n                        Manifest.permission.WRITE_CONTACTS},\n                REQUEST_CONTACT_PERMISSION\n        );\n    }\n\n    @Override\n    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults);\n        if (requestCode == REQUEST_CONTACT_PERMISSION && grantResults[0] == PackageManager.PERMISSION_GRANTED) {\n            setResult(RESULT_OK);\n            finish();\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/AndroidContactActions.kt",
    "content": "package com.alexstyl.specialdates.person\n\nimport android.app.Activity\nimport android.content.Intent\nimport android.net.Uri\nimport java.net.URI\n\nclass AndroidContactActions(val activity: Activity) : ContactActions {\n\n    override fun dial(phoneNumber: String) = {\n        val intent = Intent(Intent.ACTION_DIAL, Uri.parse(\"tel:$phoneNumber\"))\n        activity.startActivity(intent)\n    }\n\n    override fun message(phoneNumber: String) = {\n        val intent = Intent(Intent.ACTION_VIEW)\n        intent.data = Uri.parse(\"sms:$phoneNumber\")\n        activity.startActivity(intent)\n    }\n\n    override fun email(emailAdress: String) = {\n        val intent = Intent(Intent.ACTION_SENDTO)\n        intent.data = Uri.parse(\"mailto:\")\n        intent.putExtra(Intent.EXTRA_EMAIL, arrayOf(emailAdress))\n        activity.startActivity(intent)\n    }\n\n    override fun view(data: URI, mimetype: String) = {\n        val intent = Intent(Intent.ACTION_VIEW)\n        intent.setDataAndType(Uri.parse(data.toString()), mimetype)\n        activity.startActivity(intent)\n    }\n\n    override fun view(data: URI) = {\n        val intent = Intent(Intent.ACTION_VIEW)\n        intent.data = Uri.parse(data.toString())\n        activity.startActivity(intent)\n    }\n}\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/AndroidContactActionsProvider.kt",
    "content": "package com.alexstyl.specialdates.person\n\n\nimport android.content.ActivityNotFoundException\nimport android.content.ContentResolver\nimport android.content.ContentUris\nimport android.content.Context\nimport android.content.Intent\nimport android.content.pm.PackageManager\nimport android.content.res.Resources\nimport android.database.Cursor\nimport android.provider.ContactsContract.CommonDataKinds.Email\nimport android.provider.ContactsContract.CommonDataKinds.Phone\nimport android.provider.ContactsContract.Data\nimport android.view.View\nimport com.alexstyl.specialdates.CrashAndErrorTracker\nimport com.alexstyl.specialdates.R\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.contact.ContactSource\nimport com.alexstyl.specialdates.theming.AttributeExtractor\nimport com.alexstyl.specialdates.theming.DrawableTinter\nimport java.net.URI\n\n\nclass AndroidContactActionsProvider(\n        private val contentResolver: ContentResolver,\n        private val resources: Resources,\n        private val context: Context,\n        private val packageManager: PackageManager,\n        private val tracker: CrashAndErrorTracker)\n    : ContactActionsProvider {\n\n\n    companion object {\n        private const val WHATSAPP_VIDEO_CALL = \"vnd.android.cursor.item/vnd.com.whatsapp.video.call\"\n        private const val WHATSAPP_VOIP_CALL = \"vnd.android.cursor.item/vnd.com.whatsapp.voip.call\"\n        private const val VIBER_VOICE_MESSAGE = \"vnd.android.cursor.item/vnd.com.viber.voip.google_voice_message\"\n        private const val VIBER_NUMBER_CALL = \"vnd.android.cursor.item/vnd.com.viber.voip.viber_number_call\"\n        private const val VIBER_OUT_CALL = \"vnd.android.cursor.item/vnd.com.viber.voip.viber_out_call_viber\"\n\n        private const val WHATSAPP_MESSAGE = \"vnd.android.cursor.item/vnd.com.whatsapp.profile\"\n        private const val TELEGRAM_MESSAGE = \"vnd.android.cursor.item/vnd.org.telegram.messenger.android.profile\"\n        private const val VIBER_NUMBER_MESSAGE = \"vnd.android.cursor.item/vnd.com.viber.voip.viber_number_message\"\n\n\n        private const val CUSTOM_LABEL = Data.DATA3\n        private val PROJECTION = arrayOf(\n                Data._ID,\n                Phone.NUMBER, // works for Email.ADDRESS\n                Phone.TYPE, // works for Email.TYPE\n                CUSTOM_LABEL, // works for custom events label\n                Data.MIMETYPE\n        )\n\n        private val CUSTOM_CALL_ACTION_LIST = arrayOf(\n                WHATSAPP_VIDEO_CALL,\n                WHATSAPP_VOIP_CALL,\n                VIBER_VOICE_MESSAGE,\n                VIBER_NUMBER_CALL,\n                TELEGRAM_MESSAGE,\n                VIBER_OUT_CALL\n        )\n        private val CUSTOM_MESSAGING_ACTION_LIST = arrayOf(\n                WHATSAPP_MESSAGE,\n                TELEGRAM_MESSAGE,\n                VIBER_NUMBER_MESSAGE\n        )\n\n        private val tinter = DrawableTinter(AttributeExtractor())\n    }\n\n\n    override fun callActionsFor(contact: Contact, actions: ContactActions): List<ContactActionViewModel> {\n        ensureItsADeviceContact(contact)\n        val viewModels = ArrayList<ContactActionViewModel>()\n        val cursor = contentResolver.query(Data.CONTENT_URI,\n                PROJECTION,\n                Data.CONTACT_ID + \" = ? AND \" + Data.IN_VISIBLE_GROUP + \" = 1\",\n                arrayOf(\n                        contact.contactID.toString()\n                ),\n                Data.MIMETYPE\n        )\n        cursor.use { c ->\n            while (c.moveToNext()) {\n                val mimeType = c.getString(c.getColumnIndex(Data.MIMETYPE))\n                if (Phone.CONTENT_ITEM_TYPE == mimeType) {\n                    val phoneNumber = getPhoneNumberFrom(c)\n                    val customLabel = getCallLabelFrom(c)\n                    val action = ContactAction(phoneNumber, customLabel, actions.dial(phoneNumber))\n                    val icon = tinter.tintWithAccentColor(R.drawable.ic_call, context)\n                    val labelVisibility = if (customLabel.isEmpty()) View.GONE else View.VISIBLE\n                    val viewModel = ContactActionViewModel(action, labelVisibility, icon)\n                    viewModels.add(viewModel)\n                } else if (mimeType.isCustomCallType()) {\n                    try {\n                        val action = createActionFor(c, mimeType, actions)\n                        viewModels.add(action)\n                    } catch (ex: ActivityNotFoundException) {\n                        tracker.track(ex)\n                    }\n                }\n            }\n        }\n        return viewModels\n    }\n\n    override fun messagingActionsFor(contact: Contact, actions: ContactActions): List<ContactActionViewModel> {\n        ensureItsADeviceContact(contact)\n        val viewModels = ArrayList<ContactActionViewModel>()\n\n        val cursor = contentResolver.query(Data.CONTENT_URI,\n                PROJECTION,\n                Data.CONTACT_ID + \" = ? AND \" + Data.IN_VISIBLE_GROUP + \" = 1\",\n                arrayOf(\n                        contact.contactID.toString()\n                ),\n                Data.MIMETYPE\n        )\n        if (cursor != null) {\n            while (cursor.moveToNext()) {\n                val mimeType = cursor.getString(cursor.getColumnIndex(Data.MIMETYPE))\n                when {\n                    Phone.CONTENT_ITEM_TYPE == mimeType -> {\n                        val phoneNumber = getPhoneNumberFrom(cursor)\n                        val customLabel = getCallLabelFrom(cursor)\n                        val action = ContactAction(phoneNumber, customLabel, actions.message(phoneNumber))\n                        val icon = tinter.tintWithAccentColor(R.drawable.ic_message, context)\n                        val labelVisibility = if (customLabel.isEmpty()) View.GONE else View.VISIBLE\n                        viewModels.add(ContactActionViewModel(action, labelVisibility, icon))\n                    }\n                    Email.CONTENT_ITEM_TYPE == mimeType -> {\n                        val phoneNumber = getEmailAddressFrom(cursor)\n                        val customLabel = getEmailLabelFrom(cursor)\n                        val action = ContactAction(phoneNumber, customLabel, actions.email(phoneNumber))\n                        val icon = tinter.tintWithAccentColor(R.drawable.ic_email, context)\n                        val labelVisibility = if (customLabel.isEmpty()) View.GONE else View.VISIBLE\n                        viewModels.add(ContactActionViewModel(action, labelVisibility, icon))\n                    }\n                    mimeType.isCustomMessagingType() -> try {\n                        val action = createActionFor(cursor, mimeType, actions)\n                        viewModels.add(action)\n                    } catch (ex: ActivityNotFoundException) {\n                        tracker.track(ex)\n                    }\n                }\n            }\n            cursor.close()\n        }\n        return viewModels\n    }\n\n    private fun ensureItsADeviceContact(contact: Contact) {\n        if (contact.source != ContactSource.SOURCE_DEVICE) {\n            throw IllegalArgumentException(\"Can only create actions for Device (Android) contacts. Asked for [$contact] instead\")\n        }\n    }\n\n    @Throws(ActivityNotFoundException::class)\n    private fun createActionFor(cursor: Cursor, mimeType: String, executor: ContactActions): ContactActionViewModel {\n        val uri = ContentUris.withAppendedId(Data.CONTENT_URI, cursor.getLong(cursor.getColumnIndex(Data._ID)))\n        val intent = Intent(Intent.ACTION_VIEW)\n        intent.setDataAndType(uri, mimeType)\n        val resolveInfos = packageManager.queryIntentActivities(intent, 0)\n        if (resolveInfos != null && resolveInfos.isNotEmpty()) {\n            val customLabel = cursor.getString(cursor.getColumnIndex(CUSTOM_LABEL))\n            val viewAction = executor.view(URI.create(uri.toString()), mimeType)\n            val label = resolveInfos[0].loadLabel(packageManager)\n            val contactAction = ContactAction(customLabel, label.toString(), viewAction)\n            val icon = resolveInfos[0].loadIcon(packageManager)\n            return ContactActionViewModel(contactAction, View.VISIBLE, icon)\n        }\n        throw ActivityNotFoundException(\"Couldn't find activity for $mimeType\")\n    }\n\n\n    private fun getPhoneNumberFrom(cursor: Cursor) = cursor.getString(cursor.getColumnIndex(Phone.NUMBER))\n    private fun getEmailAddressFrom(cursor: Cursor) = cursor.getString(cursor.getColumnIndex(Email.ADDRESS))\n\n\n    private fun getCallLabelFrom(cursor: Cursor): String {\n        val type = cursor.getInt(cursor.getColumnIndex(Phone.TYPE))\n        return resources.getString(Phone.getTypeLabelResource(type))\n    }\n\n    private fun getEmailLabelFrom(cursor: Cursor): String {\n        val type = cursor.getInt(cursor.getColumnIndex(Phone.TYPE))\n        return resources.getString(Email.getTypeLabelResource(type))\n    }\n\n    private fun String.isCustomCallType(): Boolean = CUSTOM_CALL_ACTION_LIST.contains(this)\n\n    private fun String.isCustomMessagingType(): Boolean = CUSTOM_MESSAGING_ACTION_LIST.contains(this)\n\n}\n\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/AndroidPersonView.kt",
    "content": "package com.alexstyl.specialdates.person\n\nimport android.content.res.Resources\nimport android.graphics.Bitmap\nimport android.graphics.drawable.ColorDrawable\nimport android.graphics.drawable.Drawable\nimport android.graphics.drawable.TransitionDrawable\nimport android.support.annotation.ColorRes\nimport android.support.annotation.DrawableRes\nimport android.support.design.widget.AppBarLayout\nimport android.support.design.widget.TabLayout\nimport android.support.v4.content.res.ResourcesCompat\nimport android.view.View\nimport android.widget.ImageView\nimport android.widget.TextView\nimport com.alexstyl.android.Version\nimport com.alexstyl.specialdates.R\nimport com.alexstyl.specialdates.images.ImageLoadedConsumer\nimport com.alexstyl.specialdates.images.ImageLoader\nimport com.alexstyl.specialdates.theming.Themer\nimport com.nostra13.universalimageloader.core.assist.LoadedFrom\nimport com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer\nimport com.nostra13.universalimageloader.core.imageaware.ImageViewAware\n\nclass AndroidPersonView(private val personNameView: TextView,\n                        private val ageAndSignView: TextView,\n                        private val imageLoader: ImageLoader,\n                        private val avatarView: ImageView,\n                        private val adapter: ContactItemsAdapter,\n                        private val tabLayout: TabLayout,\n                        private val appBarLayout: AppBarLayout,\n                        private val toolbarGradient: ImageView,\n                        private val resources: Resources,\n                        private val onOffsetChangedListener: AppBarLayout.OnOffsetChangedListener,\n                        private val themer: Themer) : PersonView {\n\n    override fun displayPersonInfo(viewModel: PersonInfoViewModel) {\n        personNameView.text = viewModel.displayName\n        ageAndSignView.text = viewModel.ageAndStarSignlabel\n        ageAndSignView.visibility = viewModel.AgeAndStarSignVisibility\n\n        imageLoader.load(viewModel.image)\n                .withSize(avatarView.width, avatarView.height)\n                .into(object : ImageLoadedConsumer {\n\n                    override fun onImageLoaded(loadedImage: Bitmap) {\n                        if (Version.hasLollipop()) {\n                            appBarLayout.addOnOffsetChangedListener(onOffsetChangedListener)\n                        }\n                        FadeInBitmapDisplayer(ANIMATION_DURATION).display(loadedImage, ImageViewAware(avatarView), LoadedFrom.DISC_CACHE)\n                        val layers = arrayOfNulls<Drawable>(2)\n                        layers[0] = resources.getColorDrawable(android.R.color.transparent)\n                        layers[1] = resources.getDrawableCompat(R.drawable.black_to_transparent_gradient_facing_down)\n                        val transitionDrawable = TransitionDrawable(layers)\n                        toolbarGradient.setImageDrawable(transitionDrawable)\n                        transitionDrawable.startTransition(ANIMATION_DURATION)\n                        toolbarGradient.visibility = View.VISIBLE\n                    }\n\n                    override fun onLoadingFailed() {\n                        val layers = arrayOfNulls<Drawable>(2)\n                        layers[0] = resources.getColorDrawable(android.R.color.transparent)\n                        layers[1] = resources.getDrawableCompat(R.drawable.ic_person_96dp)\n                        val transitionDrawable = TransitionDrawable(layers)\n                        avatarView.setImageDrawable(transitionDrawable)\n                        transitionDrawable.startTransition(ANIMATION_DURATION)\n                        toolbarGradient.visibility = View.GONE\n                    }\n                })\n    }\n\n    override fun displayAvailableActions(viewModel: PersonAvailableActionsViewModel) {\n        adapter.displayEvents(viewModel)\n\n        updateTabIfNeeded(0, R.drawable.ic_gift)\n        updateTabIfNeeded(1, R.drawable.ic_call)\n        updateTabIfNeeded(2, R.drawable.ic_message)\n\n        if (tabLayout.tabCount <= 1) {\n            tabLayout.visibility = View.GONE\n        } else {\n            tabLayout.visibility = View.VISIBLE\n        }\n    }\n\n    override fun showPersonAsVisible() {\n        throw UnsupportedOperationException(\"Visibility is not currently available\")\n    }\n\n    override fun showPersonAsHidden() {\n        throw UnsupportedOperationException(\"Visibility is not currently available\")\n    }\n\n    private fun updateTabIfNeeded(index: Int, @DrawableRes iconResId: Int) {\n        if (tabLayout.getTabAt(index) != null) {\n            tabLayout.getTabAt(index)!!.icon = themer.getTintedDrawable(iconResId, personNameView.context)\n        }\n    }\n\n    companion object {\n        private const val ANIMATION_DURATION = 400\n    }\n\n\n}\n\nprivate fun Resources.getDrawableCompat(@DrawableRes drawableResId: Int): Drawable? =\n        ResourcesCompat.getDrawable(this, drawableResId, null)\n\nprivate fun Resources.getColorDrawable(@ColorRes colorRes: Int): Drawable? =\n        ColorDrawable(ResourcesCompat.getColor(this, colorRes, null))\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/BottomSheetIntentAdapter.java",
    "content": "package com.alexstyl.specialdates.person;\n\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport com.alexstyl.specialdates.R;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic final class BottomSheetIntentAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {\n\n\n    private final List<IntentOptionViewModel> viewModels;\n    private final BottomSheetIntentListener listener;\n\n    BottomSheetIntentAdapter(BottomSheetIntentListener listener, List<IntentOptionViewModel> viewModels) {\n        this.viewModels = new ArrayList<>();\n        this.viewModels.addAll(viewModels);\n        this.listener = listener;\n    }\n\n\n    @Override\n    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_image_option, parent, false);\n        ImageView iconView = view.findViewById(R.id.pick_image_activity_icon);\n        TextView labelView = view.findViewById(R.id.pick_image_activity_label);\n        return new IntentOptionViewHolder(view, iconView, labelView);\n    }\n\n    @Override\n    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {\n        IntentOptionViewModel viewModel = viewModels.get(position);\n        ((IntentOptionViewHolder) holder).bind(viewModel, listener);\n    }\n\n    @Override\n    public int getItemCount() {\n        return viewModels.size();\n    }\n\n}\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/BottomSheetIntentDialog.kt",
    "content": "package com.alexstyl.specialdates.person\n\nimport android.annotation.SuppressLint\nimport android.app.Activity\nimport android.app.Dialog\nimport android.content.Intent\nimport android.os.Bundle\nimport android.support.design.widget.BottomSheetDialog\nimport android.support.v7.widget.GridLayoutManager\nimport android.support.v7.widget.RecyclerView\nimport android.view.LayoutInflater\nimport android.widget.TextView\nimport com.alexstyl.specialdates.R\nimport com.alexstyl.specialdates.ui.base.MementoDialog\nimport com.alexstyl.specialdates.ui.widget.SpacesItemDecoration\nimport com.novoda.notils.caster.Classes\nimport com.novoda.notils.caster.Views.findById\n\n\nclass BottomSheetIntentDialog : MementoDialog() {\n\n    companion object {\n        private const val KEY_INTENTS = \"key:intents\"\n        private const val KEY_TITLE = \"key:title\"\n\n        fun newIntent(title: String, intents: ArrayList<Intent>): BottomSheetIntentDialog {\n            return BottomSheetIntentDialog().apply {\n                val bundle = Bundle()\n                bundle.putParcelableArrayList(KEY_INTENTS, intents)\n                bundle.putString(KEY_TITLE, title)\n                this.arguments = bundle\n            }\n        }\n    }\n\n    lateinit var listener: BottomSheetIntentListener\n\n    @Suppress(\"OverridingDeprecatedMember\", \"DEPRECATION\")\n    override fun onAttach(activity: Activity?) {\n        super.onAttach(activity)\n        this.listener = Classes.from(activity)\n    }\n\n    @Suppress(\"UNCHECKED_CAST\")\n    @SuppressLint(\"InflateParams\")\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val context = activity\n        val dialog = BottomSheetDialog(context!!)\n        val layoutInflater = LayoutInflater.from(context)\n        val view = layoutInflater.inflate(R.layout.dialog_bottom_dialog, null, false)\n\n        val title = view.findViewById<TextView>(R.id.bottom_sheet_title)\n        title.text = arguments?.getString(KEY_TITLE)\n\n        val grid = findById<RecyclerView>(view, R.id.bottom_sheet_grid)\n        val gridLayoutManager = GridLayoutManager(context, resources.getInteger(R.integer.bottom_sheet_span_count))\n        grid.addItemDecoration(SpacesItemDecoration(\n                resources.getDimensionPixelSize(R.dimen.add_event_image_option_vertical),\n                gridLayoutManager.spanCount\n        ))\n        grid.layoutManager = gridLayoutManager\n\n        val intents = arguments?.get(KEY_INTENTS) as ArrayList<Intent>\n\n        val createViewModelsFor = createViewModelsFor(intents)\n        val adapter = BottomSheetIntentAdapter(listener, createViewModelsFor)\n        grid.adapter = adapter\n\n        dialog.setContentView(view)\n        return dialog\n    }\n\n    private fun createViewModelsFor(intents: List<Intent>): List<IntentOptionViewModel> {\n        val packageManager = context!!.packageManager\n        val viewModels = ArrayList<IntentOptionViewModel>(intents.size)\n\n        for (intent in intents) {\n            val resolveInfos = packageManager.queryIntentActivities(intent, 0)\n            for (resolveInfo in resolveInfos) {\n                val icon = resolveInfo.loadIcon(packageManager)\n                val label = resolveInfo.loadLabel(packageManager).toString()\n                val launchingIntent = Intent(intent.action)\n                launchingIntent.data = intent.data\n                launchingIntent.setClassName(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name)\n                viewModels.add(IntentOptionViewModel(icon, label, launchingIntent))\n            }\n        }\n        return viewModels\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/BottomSheetIntentListener.java",
    "content": "package com.alexstyl.specialdates.person;\n\nimport android.content.Intent;\n\npublic interface BottomSheetIntentListener {\n    void onActivitySelected(Intent intent);\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/CallMethod.kt",
    "content": "package com.alexstyl.specialdates.person\n\nimport android.content.Intent\n\ndata class CallMethod(val title: String, val startIntent: Intent)\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/CallViewHolder.java",
    "content": "package com.alexstyl.specialdates.person;\n\nimport android.support.v7.widget.RecyclerView;\nimport android.view.View;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nclass CallViewHolder extends RecyclerView.ViewHolder {\n    private final ImageView iconView;\n    private final TextView callTypeView;\n    private final TextView numberView;\n\n    CallViewHolder(View view, TextView callTypeView, TextView numberView, ImageView iconView) {\n        super(view);\n        this.callTypeView = callTypeView;\n        this.numberView = numberView;\n        this.iconView = iconView;\n    }\n\n    public void bind(final ContactActionViewModel viewModel, final EventPressedListener listener) {\n        numberView.setText(viewModel.getValue());\n        callTypeView.setText(viewModel.getLabel());\n        callTypeView.setVisibility(viewModel.getLabelVisibility());\n\n        iconView.setImageDrawable(viewModel.getIcon());\n        itemView.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                listener.onContactActionPressed(viewModel);\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/CompositeContactActionsProvider.kt",
    "content": "package com.alexstyl.specialdates.person\n\nimport com.alexstyl.specialdates.contact.Contact\n\nclass CompositeContactActionsProvider(private val providers: Map<Int, ContactActionsProvider>) : ContactActionsProvider {\n\n    override fun callActionsFor(contact: Contact, actions: ContactActions): List<ContactActionViewModel> {\n        if (providers[contact.source] != null) {\n            return providers[contact.source]!!.callActionsFor(contact, actions)\n        }\n        return emptyList()\n    }\n\n    override fun messagingActionsFor(contact: Contact, actions: ContactActions): List<ContactActionViewModel> {\n        if (providers[contact.source] != null) {\n            return providers[contact.source]!!.messagingActionsFor(contact, actions)\n        }\n        return emptyList()\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/ContactAction.kt",
    "content": "package com.alexstyl.specialdates.person\n\ndata class ContactAction(val value: String, val label: String, val action: () -> Unit) {\n    fun run() {\n        action()\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/ContactActionViewModel.kt",
    "content": "package com.alexstyl.specialdates.person\n\nimport android.graphics.drawable.Drawable\nimport com.alexstyl.android.ViewVisibility\n\ndata class ContactActionViewModel(val action: ContactAction, @get:ViewVisibility val labelVisibility: Int, val icon: Drawable) : PersonDetailItem {\n    override val value: String\n        get() = action.value\n\n\n    override val label: String\n        get() = action.label\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/ContactActionsAdapter.java",
    "content": "package com.alexstyl.specialdates.person;\n\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport com.alexstyl.specialdates.R;\nimport com.novoda.notils.caster.Views;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class ContactActionsAdapter extends RecyclerView.Adapter<CallViewHolder> {\n\n    private final List<ContactActionViewModel> viewModels = new ArrayList<>();\n    private final EventPressedListener listener;\n\n    public ContactActionsAdapter(EventPressedListener listener) {\n        this.listener = listener;\n    }\n\n    @Override\n    public CallViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_person_action, parent, false);\n        TextView callTypeView = Views.findById(view, R.id.row_person_action_type);\n        TextView numberView = Views.findById(view, R.id.row_person_call_number);\n        ImageView iconView = Views.findById(view, R.id.row_person_call_icon);\n        return new CallViewHolder(view, callTypeView, numberView, iconView);\n    }\n\n    @Override\n    public void onBindViewHolder(CallViewHolder holder, int position) {\n        holder.bind(viewModels.get(position), listener);\n    }\n\n    @Override\n    public int getItemCount() {\n        return viewModels.size();\n    }\n\n    public void displayCallMethods(List<ContactActionViewModel> viewModels) {\n        this.viewModels.clear();\n        this.viewModels.addAll(viewModels);\n        notifyItemRangeChanged(0, viewModels.size());\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/ContactActionsPageViewHolder.kt",
    "content": "package com.alexstyl.specialdates.person\n\nclass ContactActionsPageViewHolder(val adapter: ContactActionsAdapter) : PageViewHolder<ContactActionViewModel> {\n\n    override fun bind(viewModel: List<ContactActionViewModel>) {\n        adapter.displayCallMethods(viewModel)\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/ContactActionsProvider.kt",
    "content": "package com.alexstyl.specialdates.person\n\nimport com.alexstyl.specialdates.contact.Contact\n\ninterface ContactActionsProvider {\n    fun callActionsFor(contact: Contact, actions: ContactActions): List<ContactActionViewModel>\n    fun messagingActionsFor(contact: Contact, actions: ContactActions): List<ContactActionViewModel>\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/ContactItemsAdapter.java",
    "content": "package com.alexstyl.specialdates.person;\n\nimport android.support.v4.view.PagerAdapter;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.alexstyl.specialdates.R;\nimport com.novoda.notils.caster.Views;\n\nimport java.util.Collections;\nimport java.util.List;\n\npublic class ContactItemsAdapter extends PagerAdapter {\n\n    private static final int PAGE_COUNT = 3;\n    private static final int PAGE_EVENTS = 0;\n    private static final int PAGE_CALLS = 1;\n    private static final int PAGE_MESSAGES = 2;\n\n    private final LayoutInflater inflater;\n    private final EventPressedListener listener;\n\n    private PersonAvailableActionsViewModel viewModel = new PersonAvailableActionsViewModel(Collections.<ContactEventViewModel>emptyList(),\n            Collections.<ContactActionViewModel>emptyList(), Collections.<ContactActionViewModel>emptyList());\n\n    ContactItemsAdapter(LayoutInflater inflater, EventPressedListener listener) {\n        this.inflater = inflater;\n        this.listener = listener;\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    @Override\n    public Object instantiateItem(ViewGroup viewGroup, int position) {\n        ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.page_person_items, viewGroup, false);\n        viewGroup.addView(layout);\n        RecyclerView recyclerView = Views.findById(layout, R.id.page_person_list);\n        recyclerView.setLayoutManager(new LinearLayoutManager(viewGroup.getContext(), LinearLayoutManager.VERTICAL, false));\n        if (viewModel == null) {\n            return layout;\n        }\n        if (position == PAGE_EVENTS) {\n            EventAdapter adapter = new EventAdapter();\n            PageViewHolder viewHolder = new EventPageViewHolder(adapter);\n            recyclerView.setAdapter(adapter);\n            viewHolder.bind(viewModel.getEvents());\n        } else if (position == PAGE_CALLS) {\n            ContactActionsAdapter adapter = new ContactActionsAdapter(listener);\n            PageViewHolder viewHolder = new ContactActionsPageViewHolder(adapter);\n            recyclerView.setAdapter(adapter);\n            viewHolder.bind(viewModel.getCalls());\n        } else if (position == PAGE_MESSAGES) {\n            ContactActionsAdapter adapter = new ContactActionsAdapter(listener);\n            PageViewHolder viewHolder = new ContactActionsPageViewHolder(adapter);\n            recyclerView.setAdapter(adapter);\n            viewHolder.bind(viewModel.getMessages());\n        }\n        return layout;\n    }\n\n    @Override\n    public void destroyItem(ViewGroup collection, int position, Object view) {\n        collection.removeView((View) view);\n    }\n\n    @Override\n    public int getCount() {\n        return pageCountOf(viewModel);\n    }\n\n    private int pageCountOf(PersonAvailableActionsViewModel viewModel) {\n        return count(viewModel.getCalls()) + count(viewModel.getMessages()) + count(viewModel.getEvents());\n    }\n\n    private int count(List<?> item) {\n        return item.isEmpty() ? 0 : 1;\n    }\n\n    @Override\n    public boolean isViewFromObject(View view, Object object) {\n        return view == object;\n    }\n\n    void displayEvents(PersonAvailableActionsViewModel viewModel) {\n        this.viewModel = viewModel;\n        notifyDataSetChanged();\n    }\n\n    @Override\n    public int getItemPosition(Object object) {\n        return POSITION_NONE;\n    }\n}\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/EventAdapter.java",
    "content": "package com.alexstyl.specialdates.person;\n\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.TextView;\n\nimport com.alexstyl.specialdates.R;\nimport com.novoda.notils.caster.Views;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class EventAdapter extends RecyclerView.Adapter<EventViewHolder> {\n\n    private final List<ContactEventViewModel> viewModels = new ArrayList<>();\n\n    @Override\n    public EventViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_person_event, parent, false);\n        TextView nameView = Views.findById(view, R.id.row_person_event_title);\n        TextView dateView = Views.findById(view, R.id.row_person_event_date);\n        return new EventViewHolder(view, nameView, dateView);\n    }\n\n    @Override\n    public void onBindViewHolder(EventViewHolder holder, int position) {\n        holder.bind(viewModels.get(position));\n    }\n\n    @Override\n    public int getItemCount() {\n        return viewModels.size();\n    }\n\n    public void displayEvents(List<ContactEventViewModel> viewModels) {\n        this.viewModels.clear();\n        this.viewModels.addAll(viewModels);\n        notifyItemRangeChanged(0, viewModels.size());\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/EventPageViewHolder.kt",
    "content": "package com.alexstyl.specialdates.person\n\nclass EventPageViewHolder(val adapter: EventAdapter) : PageViewHolder<ContactEventViewModel> {\n\n    override fun bind(viewModel: List<ContactEventViewModel>) {\n        adapter.displayEvents(viewModel)\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/EventPressedListener.java",
    "content": "package com.alexstyl.specialdates.person;\n\npublic interface EventPressedListener {\n    public void onContactActionPressed(ContactActionViewModel intent);\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/EventViewHolder.java",
    "content": "package com.alexstyl.specialdates.person;\n\nimport android.support.v7.widget.RecyclerView;\nimport android.view.View;\nimport android.widget.TextView;\n\nclass EventViewHolder extends RecyclerView.ViewHolder {\n    private final TextView eventNameView;\n    private final TextView eventDateView;\n\n    EventViewHolder(View itemView, TextView eventNameView, TextView eventDateView) {\n        super(itemView);\n        this.eventNameView = eventNameView;\n        this.eventDateView = eventDateView;\n    }\n\n    public void bind(ContactEventViewModel viewModel) {\n        eventDateView.setText(viewModel.getDateLabel());\n        eventNameView.setText(viewModel.getEvenName());\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/FacebookContactActionsProvider.kt",
    "content": "package com.alexstyl.specialdates.person\n\nimport android.content.res.Resources\nimport android.support.v4.content.res.ResourcesCompat\nimport android.view.View\nimport com.alexstyl.specialdates.R\nimport com.alexstyl.specialdates.Strings\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.contact.ContactSource.SOURCE_FACEBOOK\nimport java.net.URI\n\nclass FacebookContactActionsProvider(\n        private val strings: Strings,\n        private val resources: Resources)\n    : ContactActionsProvider {\n\n    override fun callActionsFor(contact: Contact, actions: ContactActions): List<ContactActionViewModel> {\n        ensureItsAFacebookContact(contact)\n        val action = ContactAction(\n                strings.call(),\n                strings.facebookMessenger(),\n                actions.view(URI.create(\"fb-messenger://user/\" + contact.contactID)) // TODO check what happens if no messenger installed\n        )\n        return ContactActionViewModel(\n                action,\n                View.VISIBLE,\n                ResourcesCompat.getDrawable(resources, R.drawable.ic_facebook_messenger, null)!!)\n                .toList()\n    }\n\n    override fun messagingActionsFor(contact: Contact, actions: ContactActions): List<ContactActionViewModel> {\n        ensureItsAFacebookContact(contact)\n        return arrayListOf(\n                goToWallAction(contact, actions),\n                messengerAction(contact, actions))\n    }\n\n    private fun messengerAction(contact: Contact, executor: ContactActions): ContactActionViewModel = ContactActionViewModel(\n            ContactAction(\n                    strings.viewConversation(),\n                    strings.facebookMessenger(),\n                    executor.view(URI.create(\"fb-messenger://user/\" + contact.contactID))\n            ),\n            View.VISIBLE,\n            ResourcesCompat.getDrawable(resources, R.drawable.ic_facebook_messenger, null)!!)\n\n    private fun goToWallAction(contact: Contact, executor: ContactActions): ContactActionViewModel = ContactActionViewModel(\n            ContactAction(\n                    strings.postOnFacebook(),\n                    strings.facebook(),\n                    executor.view(URI.create(\"https://www.facebook.com/profile.php?id=\" + contact.contactID))\n            ),\n            View.VISIBLE,\n            ResourcesCompat.getDrawable(resources, R.drawable.ic_f_icon, null)!!)\n\n    private fun ensureItsAFacebookContact(contact: Contact) {\n        if (contact.source != SOURCE_FACEBOOK) {\n            throw IllegalArgumentException(\"Can only create actions for Facebook contacts. Asked for [$contact] instead\")\n        }\n    }\n}\n\nprivate fun ContactActionViewModel.toList(): List<ContactActionViewModel> {\n    val arrayList = ArrayList<ContactActionViewModel>()\n    arrayList.add(this)\n    return arrayList\n}\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/IntentOptionViewHolder.java",
    "content": "package com.alexstyl.specialdates.person;\n\nimport android.support.v7.widget.RecyclerView;\nimport android.view.View;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport com.alexstyl.specialdates.addevent.bottomsheet.BottomSheetPicturesDialog.Listener;\n\nfinal class IntentOptionViewHolder extends RecyclerView.ViewHolder {\n\n    private final ImageView iconView;\n    private final TextView labelView;\n\n    IntentOptionViewHolder(View view, ImageView iconView, TextView labelView) {\n        super(view);\n        this.iconView = iconView;\n        this.labelView = labelView;\n    }\n\n    void bind(final IntentOptionViewModel viewModel, final BottomSheetIntentListener listener) {\n        iconView.setImageDrawable(viewModel.getActivityIcon());\n        labelView.setText(viewModel.getLabel());\n        itemView.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                listener.onActivitySelected(viewModel.getIntent());\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/IntentOptionViewModel.java",
    "content": "package com.alexstyl.specialdates.person;\n\nimport android.content.Intent;\nimport android.graphics.drawable.Drawable;\n\npublic final class IntentOptionViewModel {\n\n    private final Drawable icon;\n    private final String label;\n    private final Intent intent;\n\n    IntentOptionViewModel(Drawable icon, String label, Intent intent) {\n        this.icon = icon;\n        this.label = label;\n        this.intent = intent;\n    }\n\n    Drawable getActivityIcon() {\n        return icon;\n    }\n\n    String getLabel() {\n        return label;\n    }\n\n    Intent getIntent() {\n        return intent;\n    }\n\n    @Override\n    public boolean equals(Object o) {\n        if (this == o) {\n            return true;\n        }\n        if (o == null || getClass() != o.getClass()) {\n            return false;\n        }\n\n        IntentOptionViewModel that = (IntentOptionViewModel) o;\n\n        if (!icon.equals(that.icon)) {\n            return false;\n        }\n        if (!label.equals(that.label)) {\n            return false;\n        }\n        return intent.equals(that.intent);\n\n    }\n\n    @Override\n    public int hashCode() {\n        int result = icon.hashCode();\n        result = 31 * result + label.hashCode();\n        result = 31 * result + intent.hashCode();\n        return result;\n    }\n}\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/PageViewHolder.kt",
    "content": "package com.alexstyl.specialdates.person\n\ninternal interface PageViewHolder<in T : PersonDetailItem> {\n    fun bind(viewModel: List<T>)\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/PersonActivity.kt",
    "content": "package com.alexstyl.specialdates.person\n\nimport android.content.ActivityNotFoundException\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport android.support.design.widget.AppBarLayout\nimport android.support.design.widget.TabLayout\nimport android.support.v4.view.ViewPager\nimport android.view.LayoutInflater\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.widget.ImageView\nimport android.widget.TextView\nimport android.widget.Toast\nimport com.alexstyl.android.Version\nimport com.alexstyl.specialdates.CrashAndErrorTracker\nimport com.alexstyl.specialdates.ExternalNavigator\nimport com.alexstyl.specialdates.MementoApplication\nimport com.alexstyl.specialdates.Optional\nimport com.alexstyl.specialdates.R\nimport com.alexstyl.specialdates.analytics.Analytics\nimport com.alexstyl.specialdates.analytics.Screen\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.contact.ContactNotFoundException\nimport com.alexstyl.specialdates.contact.ContactSource\nimport com.alexstyl.specialdates.contact.ContactSource.SOURCE_DEVICE\nimport com.alexstyl.specialdates.contact.ContactsProvider\nimport com.alexstyl.specialdates.images.ImageLoader\nimport com.alexstyl.specialdates.ui.DummyHideStatusBarListener\nimport com.alexstyl.specialdates.ui.LolipopHideStatusBarListener\nimport com.alexstyl.specialdates.ui.base.ThemedMementoActivity\nimport com.alexstyl.specialdates.ui.widget.MementoToolbar\nimport com.novoda.notils.caster.Views\nimport javax.inject.Inject\n\nclass PersonActivity : ThemedMementoActivity(), BottomSheetIntentListener {\n\n    lateinit var analytics: Analytics\n        @Inject set\n    lateinit var imageLoader: ImageLoader\n        @Inject set\n    lateinit var contactsProvider: ContactsProvider\n        @Inject set\n    lateinit var tracker: CrashAndErrorTracker\n        @Inject set\n    lateinit var presenter: PersonPresenter\n        @Inject set\n\n    private var navigator: PersonDetailsNavigator? = null\n    private var displayingContact = Optional.absent<Contact>()\n    private var adapter: ContactItemsAdapter? = null\n\n    private val isVisibleContactOptional = Optional.absent<Boolean>()\n\n    private lateinit var personView: AndroidPersonView\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_person)\n\n        val applicationModule = (application as MementoApplication).applicationModule\n        applicationModule.inject(this)\n        analytics.trackScreen(Screen.PERSON)\n        navigator = PersonDetailsNavigator(ExternalNavigator(this, analytics, tracker))\n        val toolbar = Views.findById<MementoToolbar>(this, R.id.person_toolbar)\n        if (wasCalledFromMemento()) {\n            toolbar.displayNavigationIconAsUp()\n        } else {\n            toolbar.displayNavigationIconAsClose()\n        }\n\n        setSupportActionBar(toolbar)\n        title = null\n        adapter = ContactItemsAdapter(LayoutInflater.from(thisActivity()), EventPressedListener { (action) ->\n            try {\n                action.run()\n            } catch (ex: ActivityNotFoundException) {\n                Toast.makeText(thisActivity(), R.string.no_app_found, Toast.LENGTH_SHORT).show()\n                tracker.track(ex)\n            }\n        })\n\n        val appBarLayout = findViewById<AppBarLayout>(R.id.person_appbar)\n        val avatarView = findViewById<ImageView>(R.id.person_avatar)\n        val personNameView = findViewById<TextView>(R.id.person_name)\n        val ageAndSignView = findViewById<TextView>(R.id.person_age_and_sign)\n        val viewPager = findViewById<ViewPager>(R.id.person_viewpager)\n        val toolbarGradient = findViewById<ImageView>(R.id.person_toolbar_gradient)\n        val tabLayout = findViewById<TabLayout>(R.id.person_tabs)\n\n        viewPager.adapter = adapter\n        viewPager.offscreenPageLimit = 2\n\n        tabLayout.setupWithViewPager(viewPager, true)\n\n        val onOffsetChangedListener = if (Version.hasLollipop()) LolipopHideStatusBarListener(window) else DummyHideStatusBarListener()\n\n        personView = AndroidPersonView(\n                personNameView,\n                ageAndSignView, imageLoader, avatarView, adapter!!, tabLayout, appBarLayout,\n                toolbarGradient, resources,\n                onOffsetChangedListener,\n                themer)\n\n    }\n\n    override fun onResume() {\n        super.onResume()\n        displayingContact = extractContactFrom(intent)\n        if (displayingContact.isPresent) {\n            presenter.startPresentingInto(personView, displayingContact.get(), AndroidContactActions(this))\n        } else {\n            tracker.track(IllegalArgumentException(\"No contact to display\"))\n            finish()\n        }\n    }\n\n    private fun wasCalledFromMemento(): Boolean {\n        val extras = intent.extras\n        return extras != null && intent.extras.containsKey(EXTRA_CONTACT_ID)\n    }\n\n    private fun extractContactFrom(intent: Intent): Optional<Contact> {\n        val data = intent.data\n        if (data != null) {\n            val contactId = data.lastPathSegment.toLong()\n            return contactFor(contactId, SOURCE_DEVICE)\n        }\n\n        val contactID = intent.getLongExtra(EXTRA_CONTACT_ID, -1)\n        if (contactID == -1L) {\n            return Optional.absent()\n        }\n        @ContactSource val contactSource = intent.getIntExtra(EXTRA_CONTACT_SOURCE, -1)\n\n        return if (contactSource == -1) {\n            Optional.absent()\n        } else contactFor(contactID, contactSource)\n    }\n\n    private fun contactFor(contactID: Long, contactSource: Int): Optional<Contact> {\n        return try {\n            Optional(contactsProvider.getContact(contactID, contactSource))\n        } catch (e: ContactNotFoundException) {\n            tracker.track(e)\n            Optional.absent()\n        }\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu): Boolean {\n        menuInflater.inflate(R.menu.menu_person_details, menu)\n        return true\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        val itemId = item.itemId\n        if (itemId == android.R.id.home && !wasCalledFromMemento()) {\n            finish()\n            return true\n        } else if (itemId == R.id.menu_view_contact) {\n            navigator!!.toViewContact(displayingContact)\n        } else if (itemId == ID_TOGGLE_VISIBILITY) {\n            val isVisible = isVisibleContactOptional.get()\n            if (isVisible) {\n                presenter.hideContact(personView)\n            } else {\n                presenter.showContact(personView)\n            }\n\n        }\n        return super.onOptionsItemSelected(item)\n    }\n\n    override fun onPause() {\n        super.onPause()\n        presenter.stopPresenting()\n    }\n\n    override fun onActivitySelected(intent: Intent) {\n        try {\n            startActivity(intent)\n        } catch (ex: ActivityNotFoundException) {\n            Toast.makeText(this, R.string.no_app_found, Toast.LENGTH_LONG).show()\n        }\n    }\n\n    companion object {\n\n        private const val EXTRA_CONTACT_SOURCE = \"extra:source\"\n        private const val EXTRA_CONTACT_ID = \"extra:id\"\n\n        private const val ID_TOGGLE_VISIBILITY = 1023\n\n        fun buildIntentFor(context: Context, contact: Contact): Intent {\n            val intent = Intent(context, PersonActivity::class.java)\n            intent.putExtra(EXTRA_CONTACT_ID, contact.contactID)\n            intent.putExtra(EXTRA_CONTACT_SOURCE, contact.source)\n            return intent\n        }\n    }\n}\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/PersonAvailableActionsViewModel.kt",
    "content": "package com.alexstyl.specialdates.person\n\ndata class PersonAvailableActionsViewModel(val events: List<ContactEventViewModel>,\n                                           val calls: List<ContactActionViewModel>,\n                                           val messages: List<ContactActionViewModel>)\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/PersonDetailsNavigator.kt",
    "content": "package com.alexstyl.specialdates.person\n\n\nimport com.alexstyl.specialdates.ExternalNavigator\nimport com.alexstyl.specialdates.Optional\nimport com.alexstyl.specialdates.contact.Contact\n\ninternal class PersonDetailsNavigator(private val navigator: ExternalNavigator) {\n\n    fun toViewContact(displayingContact: Optional<Contact>) {\n        if (displayingContact.isPresent) {\n            navigator.toContactDetails(displayingContact.get())\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/PersonDetailsViewModelFactory.kt",
    "content": "package com.alexstyl.specialdates.person\n\nimport android.view.View\nimport com.alexstyl.specialdates.Strings\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.date.ContactEvent\nimport com.alexstyl.specialdates.date.Date\n\nclass PersonDetailsViewModelFactory(private val strings: Strings, private val ageCalculator: AgeCalculator) {\n\n    operator fun invoke(contact: Contact, dateOfBirth: ContactEvent?, isVisible: Boolean): PersonInfoViewModel {\n        val ageAndStarSignBuilder = StringBuilder()\n        if (dateOfBirth != null) {\n            ageAndStarSignBuilder.append(ageCalculator.ageOf(dateOfBirth.date))\n            if (ageAndStarSignBuilder.isNotEmpty()) {\n                ageAndStarSignBuilder.append(\", \")\n            }\n            ageAndStarSignBuilder.append(starSignOf(dateOfBirth.date))\n        }\n        return PersonInfoViewModel(contact.displayName.toString(),\n                ageAndStarSignBuilder.toString(),\n                if (ageAndStarSignBuilder.isEmpty()) View.GONE else View.VISIBLE,\n                contact.imagePath,\n                isVisible)\n    }\n\n    private fun starSignOf(birthday: Date): String {\n        val starSign = StarSign.forDateOfBirth(birthday)\n        return strings.nameOf(starSign) + \" \" + starSign.emoji\n    }\n}\n\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/PersonInfoViewModel.kt",
    "content": "package com.alexstyl.specialdates.person\n\nimport com.alexstyl.android.ViewVisibility\nimport java.net.URI\n\nclass PersonInfoViewModel(val displayName: String,\n                          val ageAndStarSignlabel: String,\n                          @ViewVisibility val AgeAndStarSignVisibility: Int,\n                          val image: URI,\n                          val isVisible: Boolean)\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/PersonModule.kt",
    "content": "package com.alexstyl.specialdates.person\n\nimport android.content.ContentResolver\nimport android.content.Context\nimport android.content.pm.PackageManager\nimport android.content.res.Resources\nimport android.support.v7.view.ContextThemeWrapper\nimport com.alexstyl.specialdates.CrashAndErrorTracker\nimport com.alexstyl.specialdates.Strings\nimport com.alexstyl.specialdates.contact.ContactSource.SOURCE_DEVICE\nimport com.alexstyl.specialdates.contact.ContactSource.SOURCE_FACEBOOK\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.DateLabelCreator\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsPersister\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsProvider\nimport com.alexstyl.specialdates.theming.ThemingPreferences\nimport dagger.Module\nimport dagger.Provides\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.schedulers.Schedulers\n\n@Module\nclass PersonModule {\n\n    @Provides\n    fun callProvider(contentResolver: ContentResolver,\n                     resources: Resources,\n                     context: Context,\n                     packageManager: PackageManager,\n                     tracker: CrashAndErrorTracker,\n                     strings: Strings): ContactActionsProvider {\n\n        val theme = ThemingPreferences.newInstance(context).selectedTheme\n        val wrapper = ContextThemeWrapper(context, theme.androidTheme())\n\n        return CompositeContactActionsProvider(\n                mapOf(\n                        Pair(SOURCE_DEVICE, AndroidContactActionsProvider(contentResolver, resources, wrapper, packageManager, tracker)),\n                        Pair(SOURCE_FACEBOOK, FacebookContactActionsProvider(strings, resources))\n                ))\n    }\n\n    @Provides\n    fun ageCalculator(): AgeCalculator {\n        return AgeCalculator(Date.today())\n    }\n\n    @Provides\n    fun personDetailsViewModelFactory(strings: Strings, ageCalculator: AgeCalculator): PersonDetailsViewModelFactory {\n        return PersonDetailsViewModelFactory(strings, ageCalculator)\n    }\n\n    @Provides\n    fun eventViewModelFactory(strings: Strings, dateLabelCreator: DateLabelCreator): EventViewModelFactory {\n        return EventViewModelFactory(strings, dateLabelCreator)\n    }\n\n    @Provides\n    fun presenter(peopleEventsProvider: PeopleEventsProvider,\n                  compositeContactActionsProvider: ContactActionsProvider,\n                  peoplePersister: PeopleEventsPersister,\n                  factory: PersonDetailsViewModelFactory,\n                  toEventViewModel: EventViewModelFactory): PersonPresenter {\n        return PersonPresenter(\n                peopleEventsProvider,\n                compositeContactActionsProvider,\n                factory, toEventViewModel, peoplePersister, Schedulers.io(),\n                AndroidSchedulers.mainThread()\n        )\n\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/PersonPresenter.kt",
    "content": "package com.alexstyl.specialdates.person\n\nimport com.alexstyl.specialdates.Optional\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.date.ContactEvent\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsPersister\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsProvider\nimport com.alexstyl.specialdates.events.peopleevents.StandardEventType\nimport io.reactivex.Observable\nimport io.reactivex.Scheduler\nimport io.reactivex.disposables.CompositeDisposable\nimport io.reactivex.functions.Function3\n\nclass PersonPresenter(private val provider: PeopleEventsProvider,\n                      private val compositeContactActionsProvider: ContactActionsProvider,\n                      private val toPersonViewModel: PersonDetailsViewModelFactory,\n                      private val toEventViewModel: EventViewModelFactory,\n                      private val persister: PeopleEventsPersister,\n                      private val workScheduler: Scheduler,\n                      private val resultScheduler: Scheduler) {\n\n\n    private var disposable = CompositeDisposable()\n\n    private var contactOptional = Optional.absent<Contact>()\n\n    fun startPresentingInto(personView: PersonView, contact: Contact, actions: ContactActions) {\n        contactOptional = Optional(contact)\n\n        disposable.add(\n                getEventsFor(contact)\n                        .map {\n\n                            val isVisible = persister.getVisibilityFor(contact)\n                            toPersonViewModel(contact, it.keepOnlyBirthday(), isVisible)\n                        }\n                        .subscribeOn(workScheduler)\n                        .observeOn(resultScheduler)\n                        .subscribe({\n                            personView.displayPersonInfo(it)\n                        }))\n\n\n        disposable.add(\n                Observable.combineLatest(\n                        eventsOf(contact),\n                        callActions(contact, actions),\n                        messagingActions(contact, actions),\n                        Function3\n                        <List<ContactEventViewModel>, List<ContactActionViewModel>, List<ContactActionViewModel>, PersonAvailableActionsViewModel>\n                        { t1, t2, t3 ->\n                            PersonAvailableActionsViewModel(t1, t2, t3)\n                        }\n                )\n                        .subscribeOn(workScheduler)\n                        .observeOn(resultScheduler)\n                        .subscribe({\n                            personView.displayAvailableActions(it)\n                        }))\n    }\n\n    private fun messagingActions(contact: Contact, actions: ContactActions): Observable<List<ContactActionViewModel>>? {\n        return Observable.fromCallable {\n            compositeContactActionsProvider.messagingActionsFor(contact, actions)\n        }\n    }\n\n    private fun callActions(contact: Contact, actions: ContactActions): Observable<List<ContactActionViewModel>>? {\n        return Observable.fromCallable {\n            compositeContactActionsProvider.callActionsFor(contact, actions)\n        }\n    }\n\n    private fun getEventsFor(contact: Contact) = Observable.fromCallable { provider.fetchEventsFor(contact) }\n\n\n    private fun eventsOf(contact: Contact) = getEventsFor(contact)\n            .map { toEventViewModel(it) }\n\n    private fun List<ContactEvent>.keepOnlyBirthday() = find { it.type == StandardEventType.BIRTHDAY }\n\n\n    fun stopPresenting() {\n        disposable.clear()\n    }\n\n    fun hideContact(personView: PersonView) {\n        if (!contactOptional.isPresent) {\n            return\n        }\n        disposable.add(Observable.fromCallable {\n            persister.markContactAsHidden(contactOptional.get())\n        }.observeOn(resultScheduler)\n                .subscribeOn(workScheduler)\n                .subscribe {\n                    personView.showPersonAsHidden()\n                })\n\n    }\n\n    fun showContact(personView: PersonView) {\n        if (!contactOptional.isPresent) {\n            return\n        }\n        disposable.add(\n                Observable.fromCallable {\n                    persister.markContactAsVisible(contactOptional.get())\n                }\n                        .observeOn(resultScheduler)\n                        .subscribeOn(workScheduler)\n                        .subscribe {\n                            personView.showPersonAsVisible()\n                        })\n    }\n}\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/person/PersonView.kt",
    "content": "package com.alexstyl.specialdates.person\n\ninterface PersonView {\n    fun displayPersonInfo(viewModel: PersonInfoViewModel)\n    fun displayAvailableActions(viewModel: PersonAvailableActionsViewModel)\n\n    fun showPersonAsVisible()\n    fun showPersonAsHidden()\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/receiver/BootCompleteReceiver.java",
    "content": "package com.alexstyl.specialdates.receiver;\n\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport android.content.Intent;\n\nimport com.alexstyl.specialdates.MementoApplication;\nimport com.alexstyl.specialdates.dailyreminder.DailyReminderScheduler;\nimport com.alexstyl.specialdates.dailyreminder.DailyReminderUserSettings;\nimport com.alexstyl.specialdates.events.peopleevents.UpcomingEventsViewRefresher;\n\nimport javax.inject.Inject;\n\npublic class BootCompleteReceiver extends BroadcastReceiver {\n\n    @Inject UpcomingEventsViewRefresher refresher;\n    @Inject DailyReminderUserSettings dailyReminderUserSettings;\n    @Inject DailyReminderScheduler scheduler;\n\n    @Override\n    public void onReceive(Context context, Intent intent) {\n\n        ((MementoApplication) context.getApplicationContext()).getApplicationModule().inject(this);\n        String action = intent.getAction();\n\n        if (Intent.ACTION_BOOT_COMPLETED.equals(action)\n                || Intent.ACTION_TIME_CHANGED.equals(action)) {\n            rescheduleDailyReminder(dailyReminderUserSettings);\n            refresher.refreshViews();\n        }\n    }\n\n    private void rescheduleDailyReminder(DailyReminderUserSettings userSettings) {\n        if (userSettings.isEnabled()) {\n            scheduler.scheduleReminderFor(userSettings.getTimeSet());\n        }\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/search/BackKeyEditText.java",
    "content": "package com.alexstyl.specialdates.search;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.view.KeyEvent;\nimport android.widget.EditText;\n\npublic class BackKeyEditText extends EditText {\n    public BackKeyEditText(Context context, AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    private OnBackKeyPressedListener listener;\n\n    public void setOnBackKeyPressedListener(OnBackKeyPressedListener listener) {\n        this.listener = listener;\n    }\n\n    @Override\n    public boolean onKeyPreIme(int keyCode, KeyEvent event) {\n        if (keyCode == KeyEvent.KEYCODE_BACK && listener.onBackButtonPressed()) {\n            return true;\n        }\n        return super.onKeyPreIme(keyCode, event);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/search/CaseInsensitiveComparator.java",
    "content": "package com.alexstyl.specialdates.search;\n\nimport com.alexstyl.specialdates.WordComparator;\n\nimport java.text.Collator;\n\nclass CaseInsensitiveComparator implements WordComparator {\n\n    private final Collator collator = Collator.getInstance();\n\n    CaseInsensitiveComparator() {\n        this.collator.setStrength(Collator.PRIMARY);\n    }\n\n    @Override\n    public boolean compare(String aWord, String anOtherWord) {\n        return collator.compare(aWord, anOtherWord) == 0;\n    }\n\n    @Override\n    public boolean compareUpToPoint(String aWord, String anOtherWord, int index) {\n        int myLength = aWord.length();\n        String theWord;\n        if (myLength > index) {\n            theWord = aWord.substring(0, index);\n        } else {\n            theWord = aWord;\n        }\n\n        int otherLength = anOtherWord.length();\n        String theOtherWord;\n        if (otherLength > index) {\n            theOtherWord = anOtherWord.substring(0, index);\n        } else {\n            theOtherWord = anOtherWord;\n        }\n        return collator.compare(theWord, theOtherWord) == 0;\n\n    }\n\n}\n\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/search/ContactEventViewModel.kt",
    "content": "package com.alexstyl.specialdates.search\n\nimport com.alexstyl.specialdates.contact.Contact\nimport java.net.URI\n\ndata class ContactEventViewModel(val contact: Contact,\n                                 val displayName: String,\n                                 val contactAvatarURI: URI,\n                                 val eventLabel: String,\n                                 val eventColor: Int,\n                                 val backgroundVariant: Int)\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/search/ContactEventViewModelFactory.kt",
    "content": "package com.alexstyl.specialdates.search\n\nimport com.alexstyl.resources.Colors\nimport com.alexstyl.specialdates.date.ContactEvent\nimport java.util.*\n\ninternal class ContactEventViewModelFactory(private val eventLabelCreator: ContactEventLabelCreator,\n                                            private val colors: Colors) {\n\n    fun createViewModelFrom(contactEvents: List<ContactWithEvents>): List<ContactEventViewModel> {\n        val models = ArrayList<ContactEventViewModel>()\n        for (contactEvent in contactEvents) {\n\n            val contact = contactEvent.contact\n\n            for (event in contactEvent.events) {\n                val eventLabel = eventLabelCreator.createFor(event)\n                val variant = getVariationFor(event)\n                models.add(ContactEventViewModel(\n                        contact,\n                        contact.displayName.toString(),\n                        contact.imagePath,\n                        eventLabel,\n                        colors.getColorFor(event.type),\n                        variant\n                ))\n            }\n        }\n        return models\n    }\n\n    private fun getVariationFor(event: ContactEvent): Int {\n        return event.contact.contactID.toInt()\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/search/DelayedTextWatcher.java",
    "content": "package com.alexstyl.specialdates.search;\n\nimport android.os.Handler;\nimport android.text.Editable;\nimport android.text.TextWatcher;\n\npublic class DelayedTextWatcher implements TextWatcher {\n\n    private static final long SHORT_DELAY = 50;\n\n    private final TextUpdatedCallback textWatchTextUpdatedCallback;\n    private final Handler handler;\n    private String text;\n\n    public static DelayedTextWatcher newInstance(TextUpdatedCallback textUpdatedCallback) {\n        Handler handler = new Handler();\n        return new DelayedTextWatcher(textUpdatedCallback, handler);\n    }\n\n    public DelayedTextWatcher(TextUpdatedCallback textWatchTextUpdatedCallback, Handler handler) {\n        this.textWatchTextUpdatedCallback = textWatchTextUpdatedCallback;\n        this.handler = handler;\n    }\n\n    private final Runnable timeEndRunnable = new Runnable() {\n        @Override\n        public void run() {\n            if (text.length() > 0) {\n                textWatchTextUpdatedCallback.onTextConfirmed(text);\n            } else {\n                textWatchTextUpdatedCallback.onEmptyTextConfirmed();\n            }\n        }\n    };\n\n    @Override\n    public void beforeTextChanged(CharSequence s, int start, int count, int after) {\n        handler.removeCallbacks(timeEndRunnable);\n        handler.postDelayed(timeEndRunnable, SHORT_DELAY);\n\n    }\n\n    @Override\n    public void onTextChanged(CharSequence s, int start, int before, int count) {\n\n    }\n\n    @Override\n    public void afterTextChanged(Editable s) {\n        text = s.toString().trim();\n        textWatchTextUpdatedCallback.onTextChanged(text);\n    }\n\n    public interface TextUpdatedCallback {\n        void onTextChanged(String text);\n\n        void onEmptyTextConfirmed();\n\n        void onTextConfirmed(String text);\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/search/MoreViewHolder.java",
    "content": "package com.alexstyl.specialdates.search;\n\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ProgressBar;\nimport android.widget.TextView;\n\nimport com.alexstyl.specialdates.R;\n\nfinal class MoreViewHolder extends RecyclerView.ViewHolder {\n\n    private final TextView mLabel;\n    private final ProgressBar mProgress;\n\n    static MoreViewHolder createFor(ViewGroup parent) {\n        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());\n        View view = layoutInflater.inflate(R.layout.card_load_more, parent, false);\n        return new MoreViewHolder(view);\n    }\n\n    private MoreViewHolder(View convertView) {\n        super(convertView);\n        this.mLabel = (TextView) convertView.findViewById(R.id.label_more);\n        this.mProgress = (ProgressBar) convertView.findViewById(R.id.progress);\n    }\n\n    void bind(boolean isLoadingMore) {\n        if (isLoadingMore) {\n            mProgress.setVisibility(View.VISIBLE);\n            mLabel.setVisibility(View.GONE);\n        } else {\n            mProgress.setVisibility(View.GONE);\n            mLabel.setVisibility(View.VISIBLE);\n        }\n    }\n}\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/search/NameSuggestionsAdapter.java",
    "content": "package com.alexstyl.specialdates.search;\n\nimport android.support.v7.widget.RecyclerView;\nimport android.view.ViewGroup;\nimport android.widget.Filter;\nimport android.widget.Filterable;\n\nimport com.alexstyl.specialdates.SoundWordComparator;\nimport com.alexstyl.specialdates.WordComparator;\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.events.namedays.NamedayLocale;\nimport com.alexstyl.specialdates.events.namedays.NamedayUserSettings;\nimport com.alexstyl.specialdates.events.namedays.calendar.NamedayCalendar;\nimport com.alexstyl.specialdates.events.namedays.calendar.resource.NamedayCalendarProvider;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nfinal class NameSuggestionsAdapter extends RecyclerView.Adapter<SuggstedNameViewHolder> implements Filterable {\n\n    private final OnNameSelectedListener listener;\n    private final NamesFilter filter;\n    private final List<String> displayingNames;\n\n    public static NameSuggestionsAdapter newInstance(OnNameSelectedListener onNameSelectedListener,\n                                                     NamedayUserSettings namedayPreferences,\n                                                     NamedayCalendarProvider namedayCalendarProvider) {\n        NamedayLocale locale = namedayPreferences.getSelectedLanguage();\n        WordComparator compatator;\n        if (locale.isComparedBySound()) {\n            compatator = new SoundWordComparator();\n        } else {\n            compatator = new CaseInsensitiveComparator();\n        }\n        int year = Date.Companion.today().getYear();\n        NamedayCalendar namedayCalendar = namedayCalendarProvider.loadNamedayCalendarForLocale(locale, year);\n        ArrayList<String> names = namedayCalendar.getAllNames();\n        return new NameSuggestionsAdapter(new NameFilter(names, compatator), onNameSelectedListener);\n    }\n\n    private NameSuggestionsAdapter(NameFilter nameFilter, OnNameSelectedListener onNameSelectedListener) {\n        this.listener = onNameSelectedListener;\n        this.displayingNames = new ArrayList<>();\n        this.filter = new NamesFilter(this, nameFilter);\n    }\n\n    @Override\n    public SuggstedNameViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        return SuggstedNameViewHolder.createFor(parent);\n    }\n\n    @Override\n    public void onBindViewHolder(SuggstedNameViewHolder holder, int position) {\n        holder.bind(displayingNames.get(position), listener);\n    }\n\n    @Override\n    public int getItemCount() {\n        return displayingNames.size();\n    }\n\n    @Override\n    public Filter getFilter() {\n        return filter;\n    }\n\n    void clearNames() {\n        this.displayingNames.clear();\n        notifyDataSetChanged();\n    }\n\n    void updateNames(ArrayList<String> names) {\n        displayingNames.clear();\n        displayingNames.addAll(names);\n        notifyDataSetChanged();\n    }\n\n    void setTextTyped(String textTyped) {\n        filter.ignoreResults(textTyped);\n    }\n\n    interface OnNameSelectedListener {\n        void onNameSelected(String name);\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/search/NamedayCard.java",
    "content": "package com.alexstyl.specialdates.search;\n\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.events.namedays.NameCelebrations;\n\npublic class NamedayCard {\n\n    private NameCelebrations namedays;\n\n    public void setNameday(NameCelebrations nameday) {\n        this.namedays = nameday;\n    }\n\n    public boolean isAvailable() {\n        return namedays != null && namedays.size() > 0;\n    }\n\n    public Date getDate(int i) {\n        return namedays.getDate(i);\n    }\n\n    public void clear() {\n        this.namedays = null;\n    }\n\n    public String getName() {\n        return namedays.getName();\n    }\n\n    public int size() {\n        return namedays.size();\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/search/NamedaysLoader.java",
    "content": "package com.alexstyl.specialdates.search;\n\nimport android.content.Context;\n\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.events.namedays.NameCelebrations;\nimport com.alexstyl.specialdates.events.namedays.NamedayLocale;\nimport com.alexstyl.specialdates.events.namedays.NamedayUserSettings;\nimport com.alexstyl.specialdates.events.namedays.calendar.NamedayCalendar;\nimport com.alexstyl.specialdates.events.namedays.calendar.resource.NamedayCalendarProvider;\nimport com.alexstyl.specialdates.ui.loader.SimpleAsyncTaskLoader;\n\nfinal class NamedaysLoader extends SimpleAsyncTaskLoader<NameCelebrations> {\n\n    private final NamedayUserSettings namedayUserSettings;\n    private final String searchQuery;\n    private final int year;\n    private final NamedayCalendarProvider calendarProvider;\n\n    private NamedayCalendar namedayCalendar;\n\n    public static NamedaysLoader newInstance(Context context,\n                                             String searchQuery,\n                                             NamedayUserSettings namedayPreferences,\n                                             NamedayCalendarProvider calendarProvider) {\n        int year = Date.Companion.today().getYear();\n        return new NamedaysLoader(context, namedayPreferences, searchQuery, calendarProvider, year);\n    }\n\n    private NamedaysLoader(Context context, NamedayUserSettings namedayUserSettings, String searchQuery, NamedayCalendarProvider calendarProvider, int year) {\n        super(context);\n        this.namedayUserSettings = namedayUserSettings;\n        this.searchQuery = searchQuery;\n        this.calendarProvider = calendarProvider;\n        this.year = year;\n    }\n\n    @Override\n    public NameCelebrations loadInBackground() {\n        return getNamedays(searchQuery);\n    }\n\n    private NameCelebrations getNamedays(String searchQuery) {\n        if (namedayUserSettings.isEnabled()) {\n            return getNamedayCalendar().getAllNamedays(searchQuery);\n        }\n        return new NameCelebrations(searchQuery);\n    }\n\n    private NamedayCalendar getNamedayCalendar() {\n        if (namedayCalendar == null) {\n            NamedayLocale locale = namedayUserSettings.getSelectedLanguage();\n            namedayCalendar = calendarProvider.loadNamedayCalendarForLocale(locale, year);\n        }\n        return namedayCalendar;\n\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/search/NamesFilter.java",
    "content": "package com.alexstyl.specialdates.search;\n\nimport android.widget.Filter;\n\nimport com.alexstyl.specialdates.Optional;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nfinal class NamesFilter extends Filter {\n\n    private static final Optional<String> NO_IGNORED_RESULT = Optional.Companion.absent();\n    private final NameSuggestionsAdapter adapter;\n    private final NameFilter nameFilter;\n    private Optional<String> ignoredResult = NO_IGNORED_RESULT;\n\n    NamesFilter(NameSuggestionsAdapter adapter, NameFilter nameFilter) {\n        this.adapter = adapter;\n        this.nameFilter = nameFilter;\n    }\n\n    @Override\n    protected FilterResults performFiltering(CharSequence constraint) {\n        FilterResults results = new FilterResults();\n        if (constraint == null) {\n            List<String> allNames = nameFilter.getAllNames();\n            results.values = allNames;\n            results.count = allNames.size();\n        } else {\n            List<String> names = nameFilter.performFiltering(constraint);\n            results.count = names.size();\n            results.values = names;\n        }\n        return results;\n    }\n\n    @Override\n    protected void publishResults(CharSequence typedName, FilterResults results) {\n        if (results.values == null) {\n            // This is a fallback in case anything breaks the filtering\n            results.values = nameFilter.getAllNames();\n        }\n        ArrayList<String> names = (ArrayList<String>) results.values;\n        if (ignoredResult.isPresent()) {\n            names.remove(ignoredResult.get());\n        }\n        adapter.updateNames(names);\n    }\n\n    @Override\n    public CharSequence convertResultToString(Object resultValue) {\n        return resultValue.toString();\n    }\n\n    void ignoreResults(String ignoredResult) {\n        if (ignoredResult.length() > 0) {\n            this.ignoredResult = new Optional<>(ignoredResult);\n        } else {\n            this.ignoredResult = NO_IGNORED_RESULT;\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/search/NoResultsViewHolder.java",
    "content": "package com.alexstyl.specialdates.search;\n\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.alexstyl.specialdates.R;\n\nfinal class NoResultsViewHolder extends RecyclerView.ViewHolder {\n\n    static NoResultsViewHolder createFor(ViewGroup parent) {\n        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());\n        View view = layoutInflater.inflate(R.layout.row_no_search_results, parent, false);\n        return new NoResultsViewHolder(view);\n    }\n\n    private NoResultsViewHolder(final View convertView) {\n        super(convertView);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/search/OnBackKeyPressedListener.java",
    "content": "package com.alexstyl.specialdates.search;\n\npublic interface OnBackKeyPressedListener {\n    /**\n     * @return Return true if the event has been handled\n     */\n    boolean onBackButtonPressed();\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/search/SearchActivity.java",
    "content": "package com.alexstyl.specialdates.search;\n\nimport android.os.Bundle;\nimport android.support.annotation.NonNull;\nimport android.support.transition.Fade;\nimport android.support.transition.Transition;\nimport android.support.transition.TransitionManager;\nimport android.support.v4.app.LoaderManager;\nimport android.support.v4.content.Loader;\nimport android.support.v7.widget.GridLayoutManager;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.text.Editable;\nimport android.text.InputType;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.view.ViewGroup;\nimport android.view.ViewTreeObserver;\n\nimport com.alexstyl.resources.Colors;\nimport com.alexstyl.specialdates.AppComponent;\nimport com.alexstyl.specialdates.CrashAndErrorTracker;\nimport com.alexstyl.specialdates.MementoApplication;\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.Strings;\nimport com.alexstyl.specialdates.analytics.Analytics;\nimport com.alexstyl.specialdates.analytics.Screen;\nimport com.alexstyl.specialdates.contact.Contact;\nimport com.alexstyl.specialdates.contact.ContactsProvider;\nimport com.alexstyl.specialdates.date.AndroidDateLabelCreator;\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.date.DateLabelCreator;\nimport com.alexstyl.specialdates.events.namedays.NameCelebrations;\nimport com.alexstyl.specialdates.events.namedays.NamedayUserSettings;\nimport com.alexstyl.specialdates.events.namedays.calendar.resource.NamedayCalendarProvider;\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsProvider;\nimport com.alexstyl.specialdates.images.ImageLoader;\nimport com.alexstyl.specialdates.permissions.MementoPermissions;\nimport com.alexstyl.specialdates.transition.FadeInTransition;\nimport com.alexstyl.specialdates.transition.FadeOutTransition;\nimport com.alexstyl.specialdates.transition.SimpleTransitionListener;\nimport com.alexstyl.specialdates.ui.ViewFader;\nimport com.alexstyl.specialdates.ui.base.ThemedMementoActivity;\nimport com.alexstyl.specialdates.ui.widget.SpacesItemDecoration;\nimport com.novoda.notils.caster.Views;\nimport com.novoda.notils.meta.AndroidUtils;\nimport com.novoda.notils.text.SimpleTextWatcher;\n\nimport javax.inject.Inject;\n\nimport static android.view.View.GONE;\n\npublic class SearchActivity extends ThemedMementoActivity {\n\n    private static final String KEY_QUERY = \"alexstyl:key_query\";\n    private static final int ID_CONTACTS = 31;\n    private static final int ID_NAMEDAYS = 32;\n    private static final int INITAL_COUNT = 5;\n    private static final int HALF = 2;\n    private static final int COLUMNS = 3;\n\n    private int searchCounter = INITAL_COUNT;\n    private SearchBar searchbar;\n    private RecyclerView namesSuggestionsView;\n    private SearchResultAdapter adapter;\n    private NameSuggestionsAdapter namesAdapter;\n    private String searchQuery;\n\n    private ViewFader fader = new ViewFader();\n    private ViewGroup content;\n    private RecyclerView resultView;\n    private PeopleEventsSearch peopleEventsSearch;\n    private ContactEventViewModelFactory viewModelFactory;\n    @Inject Analytics analytics;\n    @Inject Strings strings;\n    @Inject Colors colors;\n    @Inject ImageLoader imageLoader;\n    @Inject NamedayUserSettings namedayUserSettings;\n    @Inject ContactsProvider contactsProvider;\n    @Inject DateLabelCreator labelCreator;\n    @Inject PeopleEventsProvider peopleEventsProvider;\n    @Inject NamedayCalendarProvider namedayCalendarProvider;\n    @Inject NamedayCalendarProvider calendarProvider;\n    @Inject CrashAndErrorTracker tracker;\n    @Inject SearchNavigator navigator;\n    @Inject MementoPermissions permissions;\n\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_search);\n\n        AppComponent applicationModule = ((MementoApplication) getApplication()).getApplicationModule();\n        applicationModule.inject(this);\n\n        peopleEventsSearch = new PeopleEventsSearch(peopleEventsProvider, NameMatcher.INSTANCE);\n        DateLabelCreator dateLabelCreator = new AndroidDateLabelCreator(this);\n        viewModelFactory = new ContactEventViewModelFactory(new ContactEventLabelCreator(Date.Companion.today(), strings, dateLabelCreator), colors);\n\n        analytics.trackScreen(Screen.SEARCH);\n\n        searchbar = Views.findById(this, R.id.search_searchbar);\n        setSupportActionBar(searchbar);\n        content = Views.findById(this, R.id.search_content);\n\n        resultView = Views.findById(this, R.id.search_results);\n        resultView.setHasFixedSize(true);\n\n        int spacingInPixels = getResources().getDimensionPixelSize(R.dimen.search_result_card_vertical_padding) / HALF;\n        resultView.addItemDecoration(new SpacesItemDecoration(spacingInPixels, COLUMNS));\n\n        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(context());\n        resultView.setLayoutManager(mLayoutManager);\n\n        namesSuggestionsView = Views.findById(this, R.id.search_nameday_suggestions);\n\n        if (savedInstanceState != null) {\n            searchQuery = savedInstanceState.getString(KEY_QUERY);\n        }\n\n        setupSearchField();\n\n        adapter = new SearchResultAdapter(imageLoader, labelCreator);\n        adapter.setSearchResultClickListener(listener);\n        resultView.setAdapter(adapter);\n\n        searchbar.setOnBackKeyPressedListener(onBackKeyPressedListener);\n\n        setupSearchbarHint(namedayUserSettings);\n\n        if (namedayUserSettings.isEnabled()) {\n            GridLayoutManager namedayManager = new GridLayoutManager(context(), 1, RecyclerView.HORIZONTAL, false);\n            namesAdapter = NameSuggestionsAdapter.newInstance(onNameSelectedListener, namedayUserSettings, namedayCalendarProvider);\n            namesSuggestionsView.setHasFixedSize(true);\n            namesSuggestionsView.setLayoutManager(namedayManager);\n            namesSuggestionsView.setAdapter(namesAdapter);\n\n            searchbar.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);\n            searchbar.setOnFocusChangeListener(new ToggleVisibilityOnFocus(namesSuggestionsView));\n        } else {\n            namesSuggestionsView.setVisibility(GONE);\n        }\n\n        if (savedInstanceState == null) {\n            fader.hideContentOf(searchbar);\n            ViewTreeObserver viewTreeObserver = searchbar.getViewTreeObserver();\n            viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {\n                @Override\n                public void onGlobalLayout() {\n                    searchbar.getViewTreeObserver().removeOnGlobalLayoutListener(this);\n                    animateShowSearch();\n                }\n\n                private void animateShowSearch() {\n                    TransitionManager.beginDelayedTransition(searchbar, FadeInTransition.createTransition());\n                    fader.showContent(searchbar);\n                }\n            });\n        }\n    }\n\n    @Override\n    protected void onResume() {\n        super.onResume();\n        searchbar.requestFocus();\n        if (!permissions.canReadAndWriteContacts()) {\n            navigator.toContactPermission(this);\n        }\n    }\n\n    private void setupSearchbarHint(NamedayUserSettings preferences) {\n        SearchHintCreator searchHintCreator = new SearchHintCreator(getResources(), preferences);\n        searchbar.setHint(searchHintCreator.createHint());\n    }\n\n    @Override\n    public boolean onCreateOptionsMenu(Menu menu) {\n        getMenuInflater().inflate(R.menu.menu_search, menu);\n        return true;\n    }\n\n    @Override\n    public boolean onPrepareOptionsMenu(Menu menu) {\n        super.onPrepareOptionsMenu(menu);\n        MenuItem clearMenuItem = menu.findItem(R.id.action_clear);\n        clearMenuItem.setVisible(searchbar.hasText());\n        return true;\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(@NonNull MenuItem item) {\n        switch (item.getItemId()) {\n            case android.R.id.home:\n                finish();\n                return true;\n            case R.id.action_clear:\n                onClearPressed();\n                return true;\n            default:\n                return super.onOptionsItemSelected(item);\n        }\n    }\n\n    @Override\n    public void finish() {\n        if (supportsTransitions()) {\n            AndroidUtils.requestHideKeyboard(this, searchbar);\n            exitTransitionWithAction(new Runnable() {\n                @Override\n                public void run() {\n                    SearchActivity.super.finish();\n                    overridePendingTransition(0, 0);\n                }\n            });\n        } else {\n            super.finish();\n        }\n    }\n\n    private void exitTransitionWithAction(final Runnable endingAction) {\n        Transition transition = FadeOutTransition.withAction(new SimpleTransitionListener() {\n            @Override\n            public void onTransitionEnd(Transition transition) {\n                endingAction.run();\n            }\n        });\n\n        TransitionManager.beginDelayedTransition(searchbar, transition);\n        fader.hideContentOf(searchbar);\n\n        TransitionManager.beginDelayedTransition(content, new Fade(Fade.OUT));\n    }\n\n    private void onClearPressed() {\n        searchbar.clearText();\n        AndroidUtils.toggleKeyboard(this);\n    }\n\n    @Override\n    public void onSaveInstanceState(Bundle outState) {\n        super.onSaveInstanceState(outState);\n        outState.putString(KEY_QUERY, searchQuery);\n    }\n\n    private void startSearching() {\n        getSupportLoaderManager().restartLoader(ID_CONTACTS, null, contactSearchCallbacks);\n        getSupportLoaderManager().restartLoader(ID_NAMEDAYS, null, namedayLoaderCallbacks);\n    }\n\n    private void clearResults() {\n        adapter.clearResults();\n        if (namedayUserSettings.isEnabled()) {\n            namesAdapter.clearNames();\n        }\n    }\n\n    private void resetSearchCounter() {\n        searchCounter = INITAL_COUNT;\n    }\n\n    private void updateNameSuggestions(String text) {\n        if (namedayUserSettings.isEnabled()) {\n            namesAdapter.getFilter().filter(text);\n        }\n    }\n\n    private void setupSearchField() {\n        searchbar.addTextWatcher(DelayedTextWatcher.newInstance(textUpdatedTextUpdatedCallback));\n        if (namedayUserSettings.isEnabled()) {\n            searchbar.addTextWatcher(new SimpleTextWatcher() {\n                @Override\n                public void afterTextChanged(Editable s) {\n                    super.afterTextChanged(s);\n                    namesAdapter.setTextTyped(s.toString());\n                }\n            });\n        }\n    }\n\n    private final NameSuggestionsAdapter.OnNameSelectedListener onNameSelectedListener = new NameSuggestionsAdapter.OnNameSelectedListener() {\n        @Override\n        public void onNameSelected(String name) {\n            AndroidUtils.requestHideKeyboard(context(), searchbar);\n            onNameSet(name);\n            resultView.requestFocus();\n        }\n    };\n\n    private void onNameSet(String name) {\n        // setting the text to the EditText will trigger the search for the name\n        searchbar.setText(name);\n        if (namedayUserSettings.isEnabled()) {\n            namesAdapter.clearNames();\n        }\n    }\n\n    private final SearchResultAdapter.SearchResultClickListener listener = new SearchResultAdapter.SearchResultClickListener() {\n\n        @Override\n        public void onContactClicked(Contact contact) {\n            navigator.toContactDetails(contact, thisActivity());\n        }\n\n        @Override\n        public void onNamedayClicked(Date date) {\n            navigator.toNamedays(date, thisActivity());\n        }\n\n    };\n\n    private final LoaderManager.LoaderCallbacks<NameCelebrations> namedayLoaderCallbacks = new LoaderManager.LoaderCallbacks<NameCelebrations>() {\n\n        @Override\n        public Loader<NameCelebrations> onCreateLoader(int id, Bundle args) {\n            return NamedaysLoader.newInstance(context(), searchQuery, namedayUserSettings, calendarProvider);\n        }\n\n        @Override\n        public void onLoadFinished(@NonNull Loader<NameCelebrations> loader, NameCelebrations results) {\n            adapter.setNamedays(results);\n        }\n\n        @Override\n        public void onLoaderReset(@NonNull Loader<NameCelebrations> loader) {\n            adapter.setNamedays(new NameCelebrations(\"\"));\n        }\n    };\n\n    private final DelayedTextWatcher.TextUpdatedCallback textUpdatedTextUpdatedCallback = new DelayedTextWatcher.TextUpdatedCallback() {\n        @Override\n        public void onTextChanged(String text) {\n            searchQuery = text;\n            updateNameSuggestions(text);\n            resetSearchCounter();\n            invalidateOptionsMenu();\n        }\n\n        @Override\n        public void onEmptyTextConfirmed() {\n            clearResults();\n            invalidateOptionsMenu();\n        }\n\n        @Override\n        public void onTextConfirmed(String text) {\n            startSearching();\n        }\n    };\n\n    private final LoaderManager.LoaderCallbacks<SearchResults> contactSearchCallbacks = new LoaderManager.LoaderCallbacks<SearchResults>() {\n\n        @Override\n        public Loader<SearchResults> onCreateLoader(int id, Bundle args) {\n            adapter.notifyIsLoadingMore();\n            return new SearchLoader(context(), peopleEventsSearch, searchQuery, searchCounter, viewModelFactory);\n        }\n\n        @Override\n        public void onLoadFinished(@NonNull Loader<SearchResults> loader, SearchResults searchResults) {\n            if (loader.getId() == ID_CONTACTS) {\n                adapter.updateSearchResults(searchResults);\n            }\n        }\n\n        @Override\n        public void onLoaderReset(@NonNull Loader<SearchResults> loader) {\n            if (loader.getId() == ID_CONTACTS) {\n                adapter.notifyIsLoadingMore();\n            }\n        }\n    };\n\n    private final OnBackKeyPressedListener onBackKeyPressedListener = new OnBackKeyPressedListener() {\n        @Override\n        public boolean onBackButtonPressed() {\n            if (searchbar.hasText()) {\n                return false;\n            } else {\n                finish();\n                return true;\n            }\n        }\n    };\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/search/SearchBar.java",
    "content": "package com.alexstyl.specialdates.search;\n\nimport android.content.Context;\nimport android.graphics.Color;\nimport android.graphics.drawable.Drawable;\nimport android.support.annotation.Nullable;\nimport android.support.v7.widget.Toolbar;\nimport android.text.Editable;\nimport android.text.TextWatcher;\nimport android.util.AttributeSet;\nimport android.view.KeyEvent;\nimport android.view.inputmethod.EditorInfo;\nimport android.view.inputmethod.InputMethodManager;\nimport android.widget.TextView;\n\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.theming.AttributeExtractor;\nimport com.alexstyl.specialdates.theming.DrawableTinter;\nimport com.novoda.notils.caster.Views;\n\npublic class SearchBar extends Toolbar {\n\n    private BackKeyEditText editText;\n\n    public SearchBar(Context context, @Nullable AttributeSet attrs) {\n        super(context, attrs);\n        inflate(getContext(), R.layout.merge_searchbar, this);\n        editText = Views.findById(this, R.id.toolbar_search_edittext);\n        setBackgroundColor(Color.WHITE);\n        addTintedUpNavigation();\n\n        editText.setOnEditorActionListener(onEditorActionListener);\n    }\n\n    private void addTintedUpNavigation() {\n        DrawableTinter drawableTinter = new DrawableTinter(new AttributeExtractor());\n        Drawable backDrawable = getResources().getDrawable(R.drawable.ic_arrow_back_white_24dp).mutate();\n        Drawable tintedUpDrawable = drawableTinter.tintWithAccentColor(backDrawable, getContext());\n        setNavigationIcon(tintedUpDrawable);\n    }\n\n    public void addTextWatcher(TextWatcher textWatcher) {\n        editText.addTextChangedListener(textWatcher);\n    }\n\n    public void setInputType(int typeTextFlag) {\n        editText.setInputType(typeTextFlag);\n    }\n\n    private final TextView.OnEditorActionListener onEditorActionListener = new TextView.OnEditorActionListener() {\n        @Override\n        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {\n            if (actionId == EditorInfo.IME_ACTION_SEARCH) {\n                InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);\n                imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);\n                editText.requestFocus();\n                return true;\n            }\n            return false;\n        }\n    };\n\n    public void setOnBackKeyPressedListener(OnBackKeyPressedListener listener) {\n        editText.setOnBackKeyPressedListener(listener);\n    }\n\n    public void setText(String text) {\n        editText.setText(text);\n    }\n\n    public void clearText() {\n        editText.setText(null);\n    }\n\n    public boolean hasText() {\n        return editText.length() > 0;\n    }\n\n    public void setHint(String hint) {\n        editText.setHint(hint);\n    }\n\n    public Editable getText() {\n        return editText.getText();\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/search/SearchHintCreator.java",
    "content": "package com.alexstyl.specialdates.search;\n\nimport android.content.res.Resources;\n\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.events.namedays.NamedayUserSettings;\n\nclass SearchHintCreator {\n\n    private final Resources resources;\n    private final NamedayUserSettings namedayPreferences;\n\n    SearchHintCreator(Resources resources, NamedayUserSettings namedayPreferences) {\n        this.resources = resources;\n        this.namedayPreferences = namedayPreferences;\n    }\n\n    String createHint() {\n        boolean enabled = namedayPreferences.isEnabled();\n        if (enabled) {\n            return resources.getString(R.string.search_hint_contacts_and_namedays);\n        } else {\n            return resources.getString(R.string.search_hint_contacts);\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/search/SearchLoader.java",
    "content": "package com.alexstyl.specialdates.search;\n\nimport android.content.Context;\n\nimport com.alexstyl.specialdates.ui.loader.SimpleAsyncTaskLoader;\n\nimport java.util.List;\n\nclass SearchLoader extends SimpleAsyncTaskLoader<SearchResults> {\n\n    private final String searchQuery;\n    private final int searchCounter;\n\n    private final PeopleEventsSearch peopleEventsSearch;\n    private final ContactEventViewModelFactory viewModelFactory;\n\n    SearchLoader(Context context,\n                 PeopleEventsSearch peopleEventsSearch,\n                 String query,\n                 int searchCounter,\n                 ContactEventViewModelFactory viewModelFactory) {\n        super(context);\n        this.searchQuery = query;\n        this.searchCounter = searchCounter;\n        this.peopleEventsSearch = peopleEventsSearch;\n        this.viewModelFactory = viewModelFactory;\n    }\n\n    @Override\n    public SearchResults loadInBackground() {\n        List<ContactWithEvents> contactEvents = peopleEventsSearch.searchForContacts(searchQuery, searchCounter);\n        List<ContactEventViewModel> viewModels = viewModelFactory.createViewModelFrom(contactEvents);\n        boolean canLoadMore = viewModels.size() > searchCounter;\n\n        return new SearchResults(searchQuery, viewModels, canLoadMore);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/search/SearchModule.java",
    "content": "package com.alexstyl.specialdates.search;\n\nimport com.alexstyl.specialdates.analytics.Analytics;\n\nimport dagger.Module;\nimport dagger.Provides;\n\n@Module\npublic class SearchModule {\n\n    @Provides\n    SearchNavigator navigator(Analytics analytics) {\n        return new SearchNavigator(analytics);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/search/SearchNavigator.kt",
    "content": "package com.alexstyl.specialdates.search\n\nimport android.app.Activity\nimport android.content.Intent\nimport com.alexstyl.specialdates.analytics.Analytics\nimport com.alexstyl.specialdates.analytics.Screen\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.events.namedays.activity.NamedaysOnADayActivity\nimport com.alexstyl.specialdates.permissions.ContactPermissionActivity\nimport com.alexstyl.specialdates.person.PersonActivity\n\ninternal class SearchNavigator(private val analytics: Analytics) {\n\n    fun toContactDetails(contact: Contact, activity: Activity) {\n        val intent = PersonActivity.buildIntentFor(activity, contact)\n        activity.startActivity(intent)\n        analytics.trackContactDetailsViewed(contact)\n    }\n\n    fun toNamedays(date: Date, activity: Activity) {\n        val currentYearDate = Date.on(date.dayOfMonth, date.month, Date.CURRENT_YEAR)\n        val intent = NamedaysOnADayActivity.getStartIntent(activity, currentYearDate)\n        activity.startActivity(intent)\n    }\n\n    fun toContactPermission(activity: Activity) {\n        val intent = Intent(activity, ContactPermissionActivity::class.java)\n        analytics.trackScreen(Screen.CONTACT_PERMISSION_REQUESTED)\n        activity.startActivity(intent)\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/search/SearchResultAdapter.java",
    "content": "package com.alexstyl.specialdates.search;\n\nimport android.support.v7.widget.RecyclerView;\nimport android.text.TextUtils;\nimport android.view.ViewGroup;\n\nimport com.alexstyl.specialdates.contact.Contact;\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.date.DateLabelCreator;\nimport com.alexstyl.specialdates.events.namedays.NameCelebrations;\nimport com.alexstyl.specialdates.images.ImageLoader;\nimport com.novoda.notils.exception.DeveloperError;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nfinal class SearchResultAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {\n\n    private final List<ContactEventViewModel> searchResults = new ArrayList<>();\n\n    private NamedayCard namedayCard = new NamedayCard();\n\n    private boolean isLoadingMore;\n    private boolean canLoadMore = false;\n    private final ImageLoader imageLoader;\n    private String searchQuery;\n    private final DateLabelCreator labelCreator;\n\n    SearchResultAdapter(ImageLoader imageLoader, DateLabelCreator labelCreator) {\n        this.imageLoader = imageLoader;\n        this.labelCreator = labelCreator;\n    }\n\n    void updateSearchResults(SearchResults searchResults) {\n        this.searchQuery = searchResults.getSearchQuery();\n        this.searchResults.clear();\n        this.searchResults.addAll(searchResults.getViewModels());\n\n        if (this.canLoadMore != searchResults.canLoadMore()) {\n            this.canLoadMore = searchResults.canLoadMore();\n        }\n        notifyDataSetChanged();\n    }\n\n    public void setNamedays(NameCelebrations namedays) {\n        namedayCard.setNameday(namedays);\n        notifyDataSetChanged();\n    }\n\n    void notifyIsLoadingMore() {\n        isLoadingMore = true;\n        notifyDataSetChanged();\n    }\n\n    void clearResults() {\n        this.searchResults.clear();\n        this.namedayCard.clear();\n        this.isLoadingMore = false;\n        this.canLoadMore = false;\n        notifyDataSetChanged();\n    }\n\n    interface SearchResultClickListener {\n\n        void onContactClicked(Contact contact);\n\n        void onNamedayClicked(Date date);\n    }\n\n    private SearchResultClickListener listener;\n\n    void setSearchResultClickListener(SearchResultClickListener l) {\n        this.listener = l;\n    }\n\n    private static final int VIEWTYPE_CONTACTVIEW = 0;\n    private static final int VIEWTYPE_NAMEDAYS_VIEW = 1;\n    private static final int VIEWTYPE_LOAD_MORE = 2;\n    private static final int VIEWTYPE_NO_RESULTS = 3;\n\n    @Override\n    public int getItemViewType(int position) {\n\n        if (loadMoreCardAt(position)) {\n            return VIEWTYPE_LOAD_MORE;\n        }\n        if (namedayCardAt(position)) {\n            return VIEWTYPE_NAMEDAYS_VIEW;\n        }\n        if (containsNoResults()) {\n            return VIEWTYPE_NO_RESULTS;\n        }\n        return VIEWTYPE_CONTACTVIEW;\n    }\n\n    private boolean loadMoreCardAt(int position) {\n        return canLoadMore && position == getItemCount() - 1;\n    }\n\n    private boolean namedayCardAt(int position) {\n        return namedayCard.isAvailable() && position == 0;\n    }\n\n    private boolean containsNoResults() {\n        return searchResults.size() == 0 && !namedayCard.isAvailable();\n    }\n\n    @Override\n    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n\n        if (viewType == VIEWTYPE_CONTACTVIEW) {\n            return SearchResultContactViewHolder.createFor(parent, imageLoader);\n        }\n        if (viewType == VIEWTYPE_NAMEDAYS_VIEW) {\n            return SearchResultNamedayViewHolder.createFor(parent, labelCreator);\n        }\n\n        if (viewType == VIEWTYPE_LOAD_MORE) {\n            return MoreViewHolder.createFor(parent);\n        }\n        if (viewType == VIEWTYPE_NO_RESULTS) {\n            return NoResultsViewHolder.createFor(parent);\n        }\n\n        throw new DeveloperError(\"No Holder created for type \" + viewType);\n    }\n\n    @Override\n    public void onBindViewHolder(RecyclerView.ViewHolder vh, int position) {\n\n        int type = getItemViewType(position);\n        if (type == VIEWTYPE_CONTACTVIEW) {\n            if (isDisplayingNamedayCard()) {\n                // nameday adds one more row\n                position = position - 1;\n            }\n            ContactEventViewModel viewModel = searchResults.get(position);\n            SearchResultContactViewHolder viewHolder = (SearchResultContactViewHolder) vh;\n            viewHolder.bind(viewModel, listener);\n        } else if (type == VIEWTYPE_NAMEDAYS_VIEW) {\n            ((SearchResultNamedayViewHolder) vh).bind(namedayCard, listener);\n        } else if (type == VIEWTYPE_LOAD_MORE) {\n            ((MoreViewHolder) vh).bind(isLoadingMore);\n        } else if (type == VIEWTYPE_NO_RESULTS) {\n            // no special binding needed\n        } else {\n            throw new DeveloperError(\"Unhandled type \" + type);\n        }\n\n    }\n\n    private boolean isDisplayingNamedayCard() {\n        return namedayCard.isAvailable();\n    }\n\n    @Override\n    public int getItemCount() {\n        return searchResults.size()\n                + (namedayCard.isAvailable() ? 1 : 0)\n                + (canLoadMore ? 1 : 0)\n                + (shouldDisplayEmptyRow() ? 1 : 0);\n    }\n\n    private boolean shouldDisplayEmptyRow() {\n        return hasSearchQuery() && (!canLoadMore && containsNoResults());\n    }\n\n    private boolean hasSearchQuery() {\n        return !TextUtils.isEmpty(searchQuery);\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/search/SearchResultContactViewHolder.java",
    "content": "package com.alexstyl.specialdates.search;\n\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.TextView;\n\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.images.ImageLoader;\nimport com.alexstyl.specialdates.ui.widget.ColorImageView;\n\nfinal class SearchResultContactViewHolder extends RecyclerView.ViewHolder {\n\n    private final ColorImageView avatar;\n    private final TextView displayName;\n    private final TextView eventLabel;\n    private final ImageLoader imageLoader;\n\n    public static SearchResultContactViewHolder createFor(ViewGroup parent, ImageLoader imageLoader) {\n        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());\n        View view = layoutInflater.inflate(R.layout.row_search_result_contact_event, parent, false);\n        return new SearchResultContactViewHolder(view, imageLoader);\n    }\n\n    private SearchResultContactViewHolder(View convertView, ImageLoader imageLoader) {\n        super(convertView);\n        this.imageLoader = imageLoader;\n        this.displayName = convertView.findViewById(R.id.search_result_contact_name);\n        this.eventLabel = convertView.findViewById(R.id.search_result_event_label);\n        this.avatar = convertView.findViewById(R.id.search_result_avatar);\n    }\n\n    void bind(final ContactEventViewModel viewModel, final SearchResultAdapter.SearchResultClickListener listener) {\n        avatar.setCircleColorVariant(viewModel.getBackgroundVariant());\n        avatar.setLetter(viewModel.getDisplayName(), true);\n        \n        displayName.setText(viewModel.getDisplayName());\n        imageLoader\n                .load(viewModel.getContactAvatarURI())\n                .asCircle()\n                .into(avatar.getImageView());\n        eventLabel.setText(viewModel.getEventLabel());\n        eventLabel.setTextColor(viewModel.getEventColor());\n        itemView.setOnClickListener(\n                new View.OnClickListener() {\n                    @Override\n                    public void onClick(View v) {\n                        listener.onContactClicked(viewModel.getContact());\n                    }\n                }\n        );\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/search/SearchResultNamedayViewHolder.java",
    "content": "package com.alexstyl.specialdates.search;\n\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.LinearLayout;\nimport android.widget.TextView;\n\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.date.DateLabelCreator;\n\nfinal class SearchResultNamedayViewHolder extends RecyclerView.ViewHolder {\n\n    private final TextView name;\n    private final LinearLayout datesLayout;\n    private final LayoutInflater inflater;\n    private final DateLabelCreator labelCreator;\n\n    static SearchResultNamedayViewHolder createFor(ViewGroup parent, DateLabelCreator labelCreator) {\n        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());\n        View view = layoutInflater.inflate(R.layout.card_nameday_single, parent, false);\n        return new SearchResultNamedayViewHolder(view, layoutInflater, labelCreator);\n    }\n\n    private SearchResultNamedayViewHolder(View convertView, LayoutInflater layoutInflater, DateLabelCreator labelCreator) {\n        super(convertView);\n        this.name = (TextView) convertView.findViewById(R.id.name_celebrating);\n        this.datesLayout = (LinearLayout) convertView.findViewById(R.id.dates);\n        this.inflater = layoutInflater;\n        this.labelCreator = labelCreator;\n    }\n\n    public void bind(NamedayCard dates, final SearchResultAdapter.SearchResultClickListener searchResultListener) {\n        name.setText(dates.getName());\n        this.datesLayout.removeAllViews();\n        for (int i = 0; i < dates.size(); i++) {\n            View view = inflater.inflate(R.layout.nameday_date, datesLayout, false);\n            TextView dateView = (TextView) view.findViewById(android.R.id.text1);\n\n            final Date date = dates.getDate(i);\n            String prettyDate = labelCreator.createWithYearPreferred(date);\n            dateView.setText(prettyDate);\n            if (searchResultListener != null) {\n                view.setOnClickListener(\n                        new View.OnClickListener() {\n                            @Override\n                            public void onClick(View v) {\n                                searchResultListener.onNamedayClicked(date);\n                            }\n                        }\n                );\n            }\n\n            datesLayout.addView(dateView);\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/search/SearchResults.java",
    "content": "package com.alexstyl.specialdates.search;\n\nimport java.util.List;\n\nfinal class SearchResults {\n\n    private final String searchQuery;\n    private final List<ContactEventViewModel> contacts;\n    private final boolean canLoadMore;\n\n    SearchResults(String searchQuery, List<ContactEventViewModel> contacts, boolean canLoadMore) {\n        this.searchQuery = searchQuery;\n        this.contacts = contacts;\n        this.canLoadMore = canLoadMore;\n    }\n\n    boolean canLoadMore() {\n        return canLoadMore;\n    }\n\n    List<ContactEventViewModel> getViewModels() {\n        return contacts;\n    }\n\n    String getSearchQuery() {\n        return searchQuery;\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/search/SuggstedNameViewHolder.java",
    "content": "package com.alexstyl.specialdates.search;\n\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.TextView;\n\nimport com.alexstyl.specialdates.R;\n\nfinal class SuggstedNameViewHolder extends RecyclerView.ViewHolder {\n\n    private final TextView nameView;\n\n    public static SuggstedNameViewHolder createFor(ViewGroup parent) {\n        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());\n        View view = layoutInflater.inflate(R.layout.row_suggested_name, parent, false);\n        return new SuggstedNameViewHolder(view);\n    }\n\n    private SuggstedNameViewHolder(View itemView) {\n        super(itemView);\n        nameView = itemView.findViewById(R.id.suggested_name_text);\n    }\n\n    public void bind(final String name, final NameSuggestionsAdapter.OnNameSelectedListener listener) {\n        nameView.setText(name);\n        nameView.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                listener.onNameSelected(name);\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/search/ToggleVisibilityOnFocus.java",
    "content": "package com.alexstyl.specialdates.search;\n\nimport android.view.View;\n\nimport static android.view.View.GONE;\nimport static android.view.View.VISIBLE;\n\npublic class ToggleVisibilityOnFocus implements View.OnFocusChangeListener {\n    private final View view;\n\n    public ToggleVisibilityOnFocus(View view) {\n        this.view = view;\n    }\n\n    @Override\n    public void onFocusChange(View v, boolean hasFocus) {\n        if (hasFocus) {\n            view.setVisibility(VISIBLE);\n        } else {\n            view.setVisibility(GONE);\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/settings/ClickableRingtonePreference.java",
    "content": "package com.alexstyl.specialdates.settings;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\n\npublic class ClickableRingtonePreference extends android.preference.RingtonePreference {\n    private OnPreferenceClickListener onPreferenceClickListener;\n\n    public ClickableRingtonePreference(Context context, AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    @Override\n    public void setOnPreferenceClickListener(OnPreferenceClickListener onPreferenceClickListener) {\n        // don't call super. We'll handle the clicks ourselves\n        this.onPreferenceClickListener = onPreferenceClickListener;\n    }\n\n    @Override\n    protected void onClick() {\n        if (!onPreferenceClickListener.onPreferenceClick(this)) {\n            super.onClick();\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/settings/DailyReminderActivity.java",
    "content": "package com.alexstyl.specialdates.settings;\n\nimport android.os.Bundle;\n\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.ui.base.MementoPreferenceActivity;\nimport com.alexstyl.specialdates.ui.widget.MementoToolbar;\nimport com.novoda.notils.caster.Views;\n\npublic class DailyReminderActivity extends MementoPreferenceActivity {\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_dailyreminder);\n\n        MementoToolbar toolbar = Views.findById(this, R.id.memento_toolbar);\n        setSupportActionBar(toolbar);\n        toolbar.displayNavigationIconAsUp();\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/settings/DailyReminderFragment.kt",
    "content": "package com.alexstyl.specialdates.settings\n\nimport android.Manifest\nimport android.app.Activity\nimport android.content.Context\nimport android.content.pm.PackageManager\nimport android.media.RingtoneManager\nimport android.net.Uri\nimport android.os.Bundle\nimport android.os.Vibrator\nimport android.preference.CheckBoxPreference\nimport android.preference.Preference\nimport android.preference.Preference.OnPreferenceChangeListener\nimport android.preference.RingtonePreference\nimport android.text.format.DateFormat\nimport com.alexstyl.android.preferences.widget.TimePreference\nimport com.alexstyl.specialdates.CrashAndErrorTracker\nimport com.alexstyl.specialdates.MementoApplication\nimport com.alexstyl.specialdates.R\nimport com.alexstyl.specialdates.TimeOfDay\nimport com.alexstyl.specialdates.analytics.Analytics\nimport com.alexstyl.specialdates.dailyreminder.DailyReminderOreoChannelCreator\nimport com.alexstyl.specialdates.dailyreminder.DailyReminderScheduler\nimport com.alexstyl.specialdates.dailyreminder.DailyReminderUserSettings\nimport com.alexstyl.specialdates.permissions.MementoPermissions\nimport com.alexstyl.specialdates.ui.base.MementoPreferenceFragment\nimport java.net.URI\nimport java.util.Calendar\nimport javax.inject.Inject\n\nclass DailyReminderFragment : MementoPreferenceFragment() {\n\n    private lateinit var enablePreference: CheckBoxPreference\n    private lateinit var timePreference: TimePreference\n\n    private var ringtoneLegacyPreference: ClickableRingtonePreference? = null\n\n    lateinit var permissions: MementoPermissions\n        @Inject set\n    lateinit var dailyReminderScheduler: DailyReminderScheduler\n        @Inject set\n    lateinit var analytics: Analytics\n        @Inject set\n    lateinit var tracker: CrashAndErrorTracker\n        @Inject set\n    lateinit var preferences: DailyReminderUserSettings\n        @Inject set\n    lateinit var navigator: DailyReminderNavigator\n        @Inject set\n    lateinit var channelCreator: DailyReminderOreoChannelCreator\n        @Inject set\n\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        val applicationModule = (activity!!.application as MementoApplication).applicationModule\n        applicationModule.inject(this)\n\n        addPreferencesFromResource(R.xml.preference_dailyreminder)\n\n        enablePreference = findPreferenceOrThrow(R.string.key_daily_reminder)\n        enablePreference.onPreferenceChangeListener = OnPreferenceChangeListener { _, newValue ->\n            val isEnabled = newValue as Boolean\n            preferences.setEnabled(isEnabled)\n\n            if (isEnabled) {\n                analytics.trackDailyReminderEnabled()\n                dailyReminderScheduler.scheduleReminderFor(preferences.getTimeSet())\n            } else {\n                analytics.trackDailyReminderDisabled()\n                dailyReminderScheduler.cancelReminder()\n            }\n            true\n        }\n\n        timePreference = findPreferenceOrThrow(R.string.key_daily_reminder_time)\n        timePreference.onPreferenceChangeListener = OnPreferenceChangeListener { _, newValue ->\n            val time = newValue as IntArray\n            val timeOfDay = TimeOfDay(time[0], time[1])\n            updateTimeSet(timeOfDay)\n            analytics.trackDailyReminderTimeUpdated(timeOfDay)\n            preferences.setDailyReminderTime(timeOfDay)\n            dailyReminderScheduler.scheduleReminderFor(timeOfDay)\n            true\n        }\n\n        ringtoneLegacyPreference = findPreference(R.string.key_daily_reminder_ringtone)\n        ringtoneLegacyPreference?.onPreferenceClickListener = Preference.OnPreferenceClickListener {\n            if (permissions.canReadExternalStorage()) {\n                // the permission exists. Let the system handle the event\n                false\n            } else {\n                requestPermissions(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), EXTERNAL_STORAGE_REQUEST_CODE)\n                true\n            }\n        }\n        ringtoneLegacyPreference?.onPreferenceChangeListener = OnPreferenceChangeListener { _, newValue ->\n            val ringtoneUri = URI.create(newValue as String)\n            ringtoneLegacyPreference?.updateRingtoneSummaryWith(ringtoneUri)\n            true\n        }\n\n        val setVibrationPreference = findPreference<Preference>(R.string.key_daily_reminder_vibrate_enabled)\n        setVibrationPreference?.apply {\n            if (hasNoVibratorHardware()) {\n                preferenceScreen.removePreference(this)\n            }\n        }\n\n        findPreference(getString(R.string.key_daily_reminder_vibrate_enabled))?.apply {\n            if (hasNoVibratorHardware()) {\n                preferenceScreen.removePreference(this)\n            }\n        }\n\n        findPreference<Preference>(R.string.key_daily_reminder_advanced_settings)?.setOnPreferenceClickListener { _ ->\n            navigator.openAdvancedSettings(activity as Activity)\n            true\n        }\n\n    }\n\n    private fun hasNoVibratorHardware(): Boolean {\n        val vibrator = activity!!.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator\n        return !vibrator.hasVibrator()\n    }\n\n    override fun onResume() {\n        super.onResume()\n        enablePreference.isChecked = preferences.isEnabled()\n        ringtoneLegacyPreference?.updateRingtoneSummaryWith(preferences.getRingtone())\n\n        val timeOfDay = preferences.getTimeSet()\n        updateTimeSet(timeOfDay)\n    }\n\n\n    private fun updateTimeSet(time: TimeOfDay) {\n        val timeString = getStringHour(time)\n        val summary = String.format(getString(R.string.daily_reminder_time_summary), timeString)\n        timePreference.summary = summary\n\n    }\n\n    private fun getStringHour(time: TimeOfDay): String {\n        val cal = Calendar.getInstance()\n        cal.set(Calendar.HOUR_OF_DAY, time.hours)\n        cal.set(Calendar.MINUTE, time.minutes)\n        return getHour(activity, cal).toString()\n    }\n\n    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n        if (requestCode == EXTERNAL_STORAGE_REQUEST_CODE && grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {\n            ringtoneLegacyPreference!!.onClick()\n        }\n    }\n\n    private fun RingtonePreference.updateRingtoneSummaryWith(ringtoneUri: URI) {\n        var name: String? = null\n        if (ringtoneUri.toString().isNotEmpty()) {\n            val ringtone = RingtoneManager.getRingtone(activity, Uri.parse(ringtoneUri.toString()))\n            if (ringtone != null) {\n                name = ringtone.getTitle(activity)\n            }\n        } else {\n            name = getString(R.string.no_sound)\n        }\n        summary = name\n    }\n\n    companion object {\n\n        private const val EXTERNAL_STORAGE_REQUEST_CODE = 15\n\n        // Char sequence for a 12 hour format.\n        private const val DEFAULT_FORMAT_12_HOUR = \"hh:mm a\"\n        // Char sequence for a 24 hour format.\n        private const val DEFAULT_FORMAT_24_HOUR = \"kk:mm\"\n\n        fun getHour(context: Context?, cal: Calendar): CharSequence {\n            val is24Hour = DateFormat.is24HourFormat(context)\n            return if (is24Hour) {\n                DateFormat.format(DEFAULT_FORMAT_24_HOUR, cal)\n            } else {\n                DateFormat.format(DEFAULT_FORMAT_12_HOUR, cal)\n            }\n\n        }\n    }\n}\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/settings/DailyReminderNavigator.kt",
    "content": "package com.alexstyl.specialdates.settings\n\nimport android.annotation.TargetApi\nimport android.app.Activity\nimport android.content.Intent\nimport android.os.Build\nimport android.provider.Settings\nimport com.alexstyl.specialdates.MementoConstants\n\n@TargetApi(Build.VERSION_CODES.O)\nclass DailyReminderNavigator {\n\n    fun openAdvancedSettings(activity: Activity) {\n        activity.startActivity(\n                Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS)\n                        .putExtra(Settings.EXTRA_APP_PACKAGE, MementoConstants.PACKAGE)\n        )\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/settings/MementoThemeNameComparator.java",
    "content": "package com.alexstyl.specialdates.settings;\n\nimport android.content.res.Resources;\n\nimport com.alexstyl.specialdates.theming.MementoTheme;\n\nimport java.util.Comparator;\n\nclass MementoThemeNameComparator implements Comparator<MementoTheme> {\n    private Resources resources;\n\n    MementoThemeNameComparator(Resources resources) {\n        this.resources = resources;\n    }\n\n    @Override\n    public int compare(MementoTheme first, MementoTheme second) {\n        return nameOf(first).compareTo(nameOf(second));\n    }\n\n    private String nameOf(MementoTheme theme) {\n        return resources.getString(theme.getThemeName());\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/settings/NamedayListPreference.java",
    "content": "\npackage com.alexstyl.specialdates.settings;\n\nimport android.content.Context;\nimport android.preference.ListPreference;\nimport android.preference.Preference;\nimport android.support.annotation.StringRes;\nimport android.util.AttributeSet;\n\nimport com.alexstyl.specialdates.AppComponent;\nimport com.alexstyl.specialdates.MementoApplication;\nimport com.alexstyl.specialdates.Strings;\nimport com.alexstyl.specialdates.events.namedays.NamedayLocale;\nimport com.alexstyl.specialdates.events.namedays.NamedayUserSettings;\n\nimport javax.inject.Inject;\nimport java.util.Arrays;\nimport java.util.Comparator;\n\npublic class NamedayListPreference extends ListPreference {\n\n    @Inject NamedayUserSettings userSettings;\n    @Inject Strings strings;\n\n    public NamedayListPreference(Context context, AttributeSet attrs) {\n        super(context, attrs);\n\n        AppComponent applicationModule = ((MementoApplication) context.getApplicationContext()).getApplicationModule();\n        applicationModule.inject(this);\n\n        NamedayLocale[] locales = NamedayLocale.values();\n        Arrays.sort(locales, COUNTRY_CODE_COMPARATOR);\n        setEntriesAndValues(locales);\n\n        NamedayLocale defaultLocale = userSettings.getSelectedLanguage();\n        setDefaultValue(defaultLocale.getCountryCode());\n    }\n\n    private void setEntriesAndValues(NamedayLocale[] locales) {\n        CharSequence[] entries = new CharSequence[locales.length];\n        CharSequence[] entryValues = new CharSequence[locales.length];\n        for (int i = 0; i < locales.length; i++) {\n            entries[i] = locales[i].getCountryCode();\n            entryValues[i] = strings.localeName(locales[i]);\n        }\n        setEntries(entryValues);\n        setEntryValues(entries);\n    }\n\n    private static final Comparator<NamedayLocale> COUNTRY_CODE_COMPARATOR = new Comparator<NamedayLocale>() {\n        @Override\n        public int compare(NamedayLocale o1, NamedayLocale o2) {\n            return o1.getCountryCode().compareTo(o2.getCountryCode());\n        }\n    };\n\n    void setOnNamedayLocaleChangeListener(final OnNamedayLocaleChangeListener onNamedayLocaleChangeListener) {\n        setOnPreferenceChangeListener(new OnPreferenceChangeListener() {\n            @Override\n            public boolean onPreferenceChange(Preference preference, Object newValue) {\n                NamedayLocale namedayLocale = NamedayLocale.from((String) newValue);\n                return onNamedayLocaleChangeListener.onNamedayChanged(namedayLocale);\n            }\n        });\n    }\n\n    interface OnNamedayLocaleChangeListener {\n        boolean onNamedayChanged(NamedayLocale locale);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/settings/OnlyGreekSupportedDialog.java",
    "content": "package com.alexstyl.specialdates.settings;\n\nimport android.app.Dialog;\nimport android.os.Bundle;\nimport android.support.annotation.NonNull;\nimport android.support.v7.app.AlertDialog;\n\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.ui.base.MementoDialog;\n\npublic class OnlyGreekSupportedDialog extends MementoDialog {\n\n    @NonNull\n    @Override\n    public Dialog onCreateDialog(Bundle savedInstanceState) {\n        return new AlertDialog.Builder(getActivity())\n                .setMessage(R.string.bankholidays_preferences_only_greek_supported_message)\n                .setPositiveButton(android.R.string.ok, null).create();\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/settings/PreferenceNotFoundException.kt",
    "content": "package com.alexstyl.specialdates.settings\n\nclass PreferenceNotFoundException : Throwable() \n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/settings/ThemeSelectAdapter.java",
    "content": "package com.alexstyl.specialdates.settings;\n\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.BaseAdapter;\n\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.theming.AttributeExtractor;\nimport com.alexstyl.specialdates.theming.MementoTheme;\n\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.Comparator;\nimport java.util.List;\n\nclass ThemeSelectAdapter extends BaseAdapter {\n\n    private final List<MementoTheme> themes;\n    private final AttributeExtractor extractor;\n\n    ThemeSelectAdapter(Comparator<MementoTheme> themeNameComparator) {\n        this.themes = Arrays.asList(MementoTheme.values());\n        Collections.sort(themes, themeNameComparator);\n        extractor = new AttributeExtractor();\n    }\n\n    @Override\n    public View getView(int position, View convertView, ViewGroup parent) {\n        ThemeViewHolder viewHolder;\n        if (convertView == null) {\n            convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_theme_select, parent, false);\n            viewHolder = new ThemeViewHolder(convertView, extractor);\n            convertView.setTag(viewHolder);\n        } else {\n            viewHolder = (ThemeViewHolder) convertView.getTag();\n        }\n        viewHolder.bind(getItem(position));\n        return convertView;\n    }\n\n    @Override\n    public int getCount() {\n        return themes.size();\n    }\n\n    @Override\n    public MementoTheme getItem(int position) {\n        return themes.get(position);\n    }\n\n    @Override\n    public long getItemId(int position) {\n        return position;\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/settings/ThemeSelectDialog.java",
    "content": "package com.alexstyl.specialdates.settings;\n\nimport android.app.Activity;\nimport android.app.Dialog;\nimport android.content.DialogInterface;\nimport android.os.Bundle;\nimport android.support.annotation.NonNull;\nimport android.support.v7.app.AlertDialog;\n\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.theming.MementoTheme;\nimport com.alexstyl.specialdates.ui.base.MementoDialog;\n\npublic class ThemeSelectDialog extends MementoDialog {\n\n    private OnThemeSelectedListener listener;\n\n    @Override\n    public void onAttach(Activity activity) {\n        super.onAttach(activity);\n    }\n\n    @NonNull\n    @Override\n    public Dialog onCreateDialog(Bundle savedInstanceState) {\n        final ThemeSelectAdapter adapter = new ThemeSelectAdapter(new MementoThemeNameComparator(getResources()));\n        return new AlertDialog.Builder(getActivity())\n                .setTitle(R.string.theme_preference_title)\n                .setAdapter(adapter, new DialogInterface.OnClickListener() {\n                    @Override\n                    public void onClick(DialogInterface dialog, int which) {\n                        listener.onThemeSelected(adapter.getItem(which));\n                    }\n                })\n                .setNegativeButton(android.R.string.cancel, null)\n                .create();\n    }\n\n    public void setOnThemeSelectedListener(OnThemeSelectedListener listener) {\n        this.listener = listener;\n    }\n\n    public interface OnThemeSelectedListener {\n        void onThemeSelected(MementoTheme theme);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/settings/ThemeViewHolder.java",
    "content": "package com.alexstyl.specialdates.settings;\n\nimport android.support.v7.view.ContextThemeWrapper;\nimport android.view.View;\nimport android.widget.TextView;\n\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.theming.AttributeExtractor;\nimport com.alexstyl.specialdates.theming.MementoTheme;\nimport com.novoda.notils.caster.Views;\n\npublic class ThemeViewHolder {\n\n    private final AttributeExtractor extractor;\n    private final TextView themeName;\n    private final View primaryColorView;\n    private final View accentColorView;\n\n    public ThemeViewHolder(View convertView, AttributeExtractor extractor) {\n        this.extractor = extractor;\n        this.themeName = Views.findById(convertView, R.id.themeSelect_name);\n        this.primaryColorView = Views.findById(convertView, R.id.themeSelect_primary_color);\n        this.accentColorView = Views.findById(convertView, R.id.themeSelect_accent_color);\n    }\n\n    public void bind(MementoTheme theme) {\n        ContextThemeWrapper wrapper = new ContextThemeWrapper(themeName.getContext(), theme.androidTheme());\n\n        int primaryColor = extractor.extractPrimaryColorFrom(wrapper);\n        primaryColorView.setBackgroundColor(primaryColor);\n\n        int accentColor = extractor.extractAccentColorFrom(wrapper);\n\n        boolean darkIcons = extractor.extractDarkIconsFrom(wrapper);\n        themeName.setTextColor(wrapper.getResources().getColor(darkIcons ? android.R.color.black : android.R.color.white));\n\n        accentColorView.setBackgroundColor(accentColor);\n\n        themeName.setText(theme.getThemeName());\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/settings/UserSettingsFragment.java",
    "content": "package com.alexstyl.specialdates.settings;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.preference.Preference;\n\nimport com.alexstyl.specialdates.AppComponent;\nimport com.alexstyl.specialdates.CrashAndErrorTracker;\nimport com.alexstyl.specialdates.MementoApplication;\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.Strings;\nimport com.alexstyl.specialdates.analytics.Analytics;\nimport com.alexstyl.specialdates.dailyreminder.DailyReminderOreoChannelCreator;\nimport com.alexstyl.specialdates.donate.AndroidDonationConstants;\nimport com.alexstyl.specialdates.donate.AndroidDonationService;\nimport com.alexstyl.specialdates.donate.DonateMonitor;\nimport com.alexstyl.specialdates.donate.Donation;\nimport com.alexstyl.specialdates.donate.DonationCallbacks;\nimport com.alexstyl.specialdates.donate.DonationPreferences;\nimport com.alexstyl.specialdates.donate.DonationService;\nimport com.alexstyl.specialdates.donate.util.IabHelper;\nimport com.alexstyl.specialdates.events.SettingsPresenter;\nimport com.alexstyl.specialdates.events.namedays.NamedayLocale;\nimport com.alexstyl.specialdates.events.namedays.NamedayUserSettings;\nimport com.alexstyl.specialdates.theming.MementoTheme;\nimport com.alexstyl.specialdates.theming.ThemingPreferences;\nimport com.alexstyl.specialdates.ui.base.MementoPreferenceFragment;\nimport com.alexstyl.specialdates.ui.base.ThemedMementoActivity;\nimport com.novoda.notils.caster.Classes;\n\nimport javax.inject.Inject;\n\npublic final class UserSettingsFragment extends MementoPreferenceFragment {\n\n    private static final String FM_THEME_TAG = \"fm_theme\";\n\n    private NamedayListPreference namedayLanguageListPreferences;\n    private ThemingPreferences themingPreferences;\n    private Preference appThemePreference;\n    private ThemedMementoActivity activity;\n    private DonationService donationService;\n    @Inject Analytics analytics;\n    @Inject Strings strings;\n    @Inject NamedayUserSettings namedaysPreferences;\n    @Inject CrashAndErrorTracker tracker;\n    @Inject DonateMonitor donateMonitor;\n    @Inject SettingsPresenter eventPresenter;\n    @Inject DailyReminderOreoChannelCreator dailyReminderOreoChannelCreator;\n\n    @Override\n    public void onAttach(Activity activity) {\n        super.onAttach(activity);\n        this.activity = Classes.from(activity);\n    }\n\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        AppComponent applicationModule = ((MementoApplication) getActivity().getApplication()).getApplicationModule();\n        applicationModule.inject(this);\n\n        addPreferencesFromResource(R.xml.preference_main);\n        themingPreferences = ThemingPreferences.Companion.newInstance(getActivity());\n\n        dailyReminderOreoChannelCreator.createDailyReminderChannel();\n\n        appThemePreference = findPreference(R.string.key_app_theme_id);\n        appThemePreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {\n            @Override\n            public boolean onPreferenceClick(Preference preference) {\n                ThemeSelectDialog dialog = new ThemeSelectDialog();\n                dialog.setOnThemeSelectedListener(themeSelectedListener);\n                dialog.show(getFragmentManager(), FM_THEME_TAG);\n                return true;\n            }\n        });\n\n        findPreference(R.string.key_enable_bank_holidays).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {\n            @Override\n            public boolean onPreferenceChange(Preference preference, Object o) {\n                eventPresenter.updateEventOptions();\n                return true;\n            }\n        });\n\n        Preference bankholidaysLanguage = findPreference(R.string.key_bankholidays_language);\n        bankholidaysLanguage.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {\n            @Override\n            public boolean onPreferenceClick(Preference preference) {\n                new OnlyGreekSupportedDialog().show(getFragmentManager(), \"OnlyGreek\");\n                return true;\n            }\n        });\n\n        findPreference(R.string.key_enable_namedays).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {\n            @Override\n            public boolean onPreferenceChange(Preference preference, Object newValue) {\n                boolean enabled = (boolean) newValue;\n                tracker.onNamedayLocaleChanged(enabled ? getLocale() : null);\n                eventPresenter.refreshPeopleEvents();\n                return true;\n            }\n        });\n\n        namedayLanguageListPreferences = findPreference(R.string.key_namedays_language);\n        namedayLanguageListPreferences.setOnNamedayLocaleChangeListener(\n                new NamedayListPreference.OnNamedayLocaleChangeListener() {\n\n                    @Override\n                    public boolean onNamedayChanged(NamedayLocale locale) {\n                        namedaysPreferences.setSelectedLanguage(locale.getCountryCode());\n                        namedayLanguageListPreferences.setSummary(strings.localeName(locale));\n                        eventPresenter.refreshPeopleEvents();\n                        return true;\n                    }\n                }\n        );\n        findPreference(R.string.key_namedays_contacts_only).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {\n            @Override\n            public boolean onPreferenceChange(Preference preference, Object newValue) {\n                namedaysPreferences.setEnabledForContactsOnly((boolean) newValue);\n                eventPresenter.updateEventOptions();\n                return true;\n            }\n        });\n        findPreference(R.string.key_namedays_full_name).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {\n            @Override\n            public boolean onPreferenceChange(Preference preference, Object o) {\n                eventPresenter.refreshPeopleEvents();\n                return true;\n            }\n        });\n\n        final Preference restorePreference = findPreference(\"key_donate_restore\");\n        donationService = new AndroidDonationService(\n                new IabHelper(getActivity(), AndroidDonationConstants.PUBLIC_KEY),\n                getActivity(),\n                DonationPreferences.newInstance(getActivity()),\n                analytics,\n                tracker,\n                donateMonitor\n        );\n        donationService.setup(new DonationCallbacks() {\n            @Override\n            public void onDonateException(String message) {\n                getPreferenceScreen().removePreference(restorePreference);\n            }\n\n            @Override\n            public void onDonationFinished(Donation donation) {\n                // do nothing\n            }\n        });\n        restorePreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {\n            @Override\n            public boolean onPreferenceClick(Preference preference) {\n                donationService.restoreDonations();\n                return true;\n            }\n        });\n        eventPresenter.startMonitoring();\n        reattachThemeDialogIfNeeded();\n    }\n\n    private void reattachThemeDialogIfNeeded() {\n        ThemeSelectDialog themeSelectDialog = (ThemeSelectDialog) getFragmentManager().findFragmentByTag(FM_THEME_TAG);\n        if (themeSelectDialog != null) {\n            themeSelectDialog.setOnThemeSelectedListener(themeSelectedListener);\n        }\n    }\n\n    private NamedayLocale getLocale() {\n        return namedaysPreferences.getSelectedLanguage();\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n        namedayLanguageListPreferences.setSummary(strings.localeName(namedaysPreferences.getSelectedLanguage()));\n        appThemePreference.setSummary(themingPreferences.getSelectedTheme().getThemeName());\n    }\n\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n        eventPresenter.stopMonitoring();\n        donationService.dispose();\n    }\n\n    private final ThemeSelectDialog.OnThemeSelectedListener themeSelectedListener = new ThemeSelectDialog.OnThemeSelectedListener() {\n        @Override\n        public void onThemeSelected(MementoTheme theme) {\n            analytics.trackThemeSelected(getString(theme.getThemeName()));\n            themingPreferences.setSelectedTheme(theme);\n            activity.applyNewTheme();\n        }\n    };\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/support/AskForSupport.kt",
    "content": "package com.alexstyl.specialdates.support\n\nimport android.app.Activity\nimport android.content.Intent\nimport android.text.format.DateUtils\n\nclass AskForSupport(private val preferences: CallForRatingPreferences) {\n\n    private val isTimeToAskAgain: Boolean\n        get() {\n            if (preferences.isTriggered) {\n                preferences.resetTrigger()\n                return true\n            }\n            val timeSinceLastRate = System.currentTimeMillis() - preferences.lastAskTimeAsked()\n            return timeSinceLastRate > RETRY_INTERVAL\n        }\n\n    fun shouldAskForRating(): Boolean {\n        return !preferences.hasUserRated() && isTimeToAskAgain\n    }\n\n    fun onRateEnd() {\n        preferences.setHasUserRated(true)\n    }\n\n    fun requestForRatingSooner() {\n        preferences.triggerNextTime()\n    }\n\n    fun askForRatingFromUser(activity: Activity) {\n        val intent = Intent(activity, RateDialog::class.java)\n        activity.startActivity(intent)\n        preferences.setLastAskTimedNow()\n    }\n\n    companion object {\n        private const val RETRY_INTERVAL = DateUtils.DAY_IN_MILLIS\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/support/CallForRatingPreferences.java",
    "content": "package com.alexstyl.specialdates.support;\n\nimport com.alexstyl.specialdates.EasyPreferences;\nimport com.alexstyl.specialdates.R;\n\npublic class CallForRatingPreferences {\n\n    private final EasyPreferences preferences;\n\n    public CallForRatingPreferences(EasyPreferences preferences) {\n        this.preferences = preferences;\n    }\n\n    boolean hasUserRated() {\n        return preferences.getBoolean(R.string.key_has_user_rated, false);\n    }\n\n    void setHasUserRated(boolean value) {\n        preferences.setBoolean(R.string.key_has_user_rated, value);\n    }\n\n    long lastAskTimeAsked() {\n        long previousTime = preferences.getLong(R.string.key_rate_previous_time_asked, -1);\n        if (previousTime == -1) {\n            preferences.setLong(R.string.key_rate_previous_time_asked, System.currentTimeMillis());\n            previousTime = System.currentTimeMillis();\n        }\n        return previousTime;\n    }\n\n    void triggerNextTime() {\n        preferences.setBoolean(R.string.key_rate_triggered, true);\n    }\n\n    void resetTrigger() {\n        preferences.setBoolean(R.string.key_rate_triggered, false);\n    }\n\n    boolean isTriggered() {\n        return preferences.getBoolean(R.string.key_rate_triggered, false);\n    }\n\n    void setLastAskTimedNow() {\n        preferences.setLong(R.string.key_rate_previous_time_asked, System.currentTimeMillis());\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/support/Emoticon.java",
    "content": "package com.alexstyl.specialdates.support;\n\nimport com.alexstyl.android.Version;\n\npublic enum Emoticon {\n    SMILEY(\"\\uD83D\\uDE03\", \":)\");\n\n    private final String emoji;\n    private final String smiley;\n\n    Emoticon(String emoji, String smiley) {\n        this.emoji = emoji;\n        this.smiley = smiley;\n    }\n\n    public String asText() {\n        if (supportsEmojis()) {\n            return emoji;\n        }\n        return smiley;\n    }\n\n    private boolean supportsEmojis() {\n        return Version.INSTANCE.hasKitKat();\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/support/OnSupportCardClickListener.java",
    "content": "package com.alexstyl.specialdates.support;\n\nimport android.view.View;\n\npublic interface OnSupportCardClickListener {\n\n    void onSupportCardClicked(View v);\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/support/RateDialog.java",
    "content": "package com.alexstyl.specialdates.support;\n\nimport android.os.Bundle;\nimport android.view.View;\nimport android.view.animation.Animation;\nimport android.view.animation.AnimationUtils;\nimport android.widget.ImageView;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport com.alexstyl.specialdates.AppComponent;\nimport com.alexstyl.specialdates.CrashAndErrorTracker;\nimport com.alexstyl.specialdates.ExternalNavigator;\nimport com.alexstyl.specialdates.MementoApplication;\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.analytics.Analytics;\nimport com.alexstyl.specialdates.ui.base.MementoActivity;\nimport com.novoda.notils.caster.Views;\n\nimport javax.inject.Inject;\n\npublic class RateDialog extends MementoActivity {\n\n    private final String smiley = \" \" + Emoticon.SMILEY.asText();\n    @Inject AskForSupport askForSupport;\n    private ExternalNavigator externalNavigator;\n    @Inject Analytics analytics;\n    @Inject CrashAndErrorTracker tracker;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_rate_dialog);\n        AppComponent applicationModule = ((MementoApplication) getApplication()).getApplicationModule();\n        applicationModule.inject(this);\n\n        externalNavigator = new ExternalNavigator(this, analytics, tracker);\n        Views.findById(this, R.id.support_rate_button).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                externalNavigator.toPlayStore();\n                Toast.makeText(context(), R.string.support_thanks_for_rating, Toast.LENGTH_LONG).show();\n                askForSupport.onRateEnd();\n                finish();\n            }\n        });\n\n        Views.findById(this, R.id.support_cancel_button).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                askForSupport.onRateEnd();\n                finish();\n            }\n        });\n\n        TextView textDescription = Views.findById(this, R.id.support_description);\n        textDescription.append(smiley);\n\n        ImageView imageView = Views.findById(this, R.id.support_heroimage);\n        Animation pulse = AnimationUtils.loadAnimation(imageView.getContext(), R.anim.heartbeat);\n        imageView.startAnimation(pulse);\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/theming/AttributeExtractor.java",
    "content": "package com.alexstyl.specialdates.theming;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.support.annotation.ColorInt;\nimport android.util.TypedValue;\n\nimport com.alexstyl.specialdates.R;\n\npublic class AttributeExtractor {\n\n    private static final int[] SECONDARY = new int[]{R.attr.colorSecondary};\n\n    private static final int[] PRIMARY_DARK = new int[]{R.attr.colorPrimaryDark};\n    private static final int[] ACCENT = new int[]{R.attr.colorAccent};\n    private static final int[] DARK_ICONS = new int[]{R.attr.useDarkIcons};\n    private static final int[] TOOLBAR_ICONS_COLOR = new int[]{R.attr.toolbarIconColor};\n\n    @ColorInt\n    public int extractPrimaryColorFrom(Context context) {\n        TypedValue typedValue = new TypedValue();\n        TypedArray a = context.obtainStyledAttributes(typedValue.data, PRIMARY_DARK);\n        int color = a.getColor(0, 0);\n        a.recycle();\n        return color;\n    }\n\n    @ColorInt\n    public int extractSecondaryColorFrom(Context context) {\n        TypedValue typedValue = new TypedValue();\n        TypedArray a = context.obtainStyledAttributes(typedValue.data, SECONDARY);\n        int color = a.getColor(0, 0);\n        a.recycle();\n        return color;\n    }\n\n    public boolean extractDarkIconsFrom(Context context) {\n        TypedValue typedValue = new TypedValue();\n        TypedArray a = context.obtainStyledAttributes(typedValue.data, DARK_ICONS);\n        boolean useDarkColors = a.getBoolean(0, false);\n        a.recycle();\n        return useDarkColors;\n    }\n\n    @ColorInt\n    public int extractAccentColorFrom(Context context) {\n        TypedValue typedValue = new TypedValue();\n        TypedArray a = context.obtainStyledAttributes(typedValue.data, ACCENT);\n        int color = a.getColor(0, 0);\n        a.recycle();\n        return color;\n    }\n\n    @ColorInt\n    public int extractToolbarIconColors(Context context) {\n        TypedValue typedValue = new TypedValue();\n        TypedArray a = context.obtainStyledAttributes(typedValue.data, TOOLBAR_ICONS_COLOR);\n        int color = a.getColor(0, 0);\n        a.recycle();\n        return color;\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/theming/DrawableTinter.java",
    "content": "package com.alexstyl.specialdates.theming;\n\nimport android.content.Context;\nimport android.graphics.PorterDuff;\nimport android.graphics.drawable.Drawable;\nimport android.support.annotation.DrawableRes;\n\npublic class DrawableTinter {\n    private final AttributeExtractor extractor;\n\n    public DrawableTinter(AttributeExtractor extractor) {\n        this.extractor = extractor;\n    }\n\n    public Drawable tintWithAccentColor(@DrawableRes int drawableResId, Context context) {\n        Drawable mutateableDrawable = context.getResources().getDrawable(drawableResId).mutate();\n        int accentColor = extractor.extractAccentColorFrom(context);\n        mutateableDrawable.setColorFilter(accentColor, PorterDuff.Mode.SRC_IN);\n        return mutateableDrawable;\n    }\n\n    public Drawable tintWithAccentColor(Drawable drawable, Context context) {\n        int accentColor = extractor.extractAccentColorFrom(context);\n        drawable.setColorFilter(accentColor, PorterDuff.Mode.SRC_IN);\n        return drawable;\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/theming/MementoTheme.kt",
    "content": "package com.alexstyl.specialdates.theming\n\nimport android.support.annotation.StringRes\nimport android.support.annotation.StyleRes\nimport com.alexstyl.specialdates.R\n\nenum class MementoTheme(val id: Int, @param:StringRes @field:StringRes\n@get:StringRes\nval themeName: Int, @param:StyleRes @field:StyleRes private val styleResId: Int) {\n    CHERRY_RED(0, R.string.theme_BloodyCherry, R.style.Theme_Memento_BloodyCherry),\n    NAVY_BLUE(1, R.string.theme_NavyBlue, R.style.Theme_Memento_NavyBlue),\n    GLOSS_PINK(2, R.string.theme_GlossPink, R.style.Theme_Memento_GlossPink),\n    EGGPLANT_GREEN(3, R.string.theme_Eggplant, R.style.Theme_Memento_Eggplant),\n    MONOCHROME(4, R.string.theme_Monochrome, R.style.Theme_Memento_Monochrome),\n    SYSTEMO(5, R.string.theme_Systemo, R.style.Theme_Memento_Systemo),\n    AMBER(6, R.string.theme_Amber, R.style.Theme_Memento_Amber);\n\n    @StyleRes\n    fun androidTheme(): Int {\n        return styleResId\n    }\n\n    companion object {\n\n        fun fromId(themeId: Int): MementoTheme {\n            return values()\n                    .find { it.id == themeId } ?: throw IllegalArgumentException(\"No theme exists with id $themeId\")\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/theming/ThemeMonitor.java",
    "content": "package com.alexstyl.specialdates.theming;\n\npublic final class ThemeMonitor {\n\n    private final MementoTheme theme;\n    private final ThemingPreferences preferences;\n\n    public static ThemeMonitor startMonitoring(ThemingPreferences preferences) {\n        MementoTheme currentTheme = preferences.getSelectedTheme();\n        return new ThemeMonitor(currentTheme, preferences);\n    }\n\n    private ThemeMonitor(MementoTheme theme, ThemingPreferences preferences) {\n        this.theme = theme;\n        this.preferences = preferences;\n    }\n\n    public boolean hasThemeChanged() {\n        MementoTheme newTheme = preferences.getSelectedTheme();\n        return newTheme != theme;\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/theming/Themer.kt",
    "content": "package com.alexstyl.specialdates.theming\n\nimport android.app.Activity\nimport android.content.Context\nimport android.content.res.ColorStateList\nimport android.content.res.Resources\nimport android.graphics.drawable.Drawable\nimport android.support.annotation.DrawableRes\nimport android.support.v4.content.res.ResourcesCompat\nimport android.support.v4.graphics.drawable.DrawableCompat\nimport android.view.WindowManager\nimport com.alexstyl.android.Version\n\nclass Themer(private val preferences: ThemingPreferences,\n             private val attributeExtractor: AttributeExtractor,\n             private val resources: Resources) {\n\n    fun applyThemeTo(activity: Activity) {\n        val theme = preferences.selectedTheme\n        activity.setTheme(theme.androidTheme())\n\n        if (Version.hasLollipop()) {\n            val window = activity.window\n            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)\n\n            val primaryDark = attributeExtractor.extractPrimaryColorFrom(activity)\n            window.statusBarColor = primaryDark\n        }\n    }\n\n    fun getTintedDrawable(@DrawableRes drawableResId: Int, themeContext: Context): Drawable {\n        val wrappedDrawable = DrawableCompat.wrap(ResourcesCompat.getDrawable(resources, drawableResId, null)!!)\n        val color = attributeExtractor.extractToolbarIconColors(themeContext)\n        DrawableCompat.setTintList(wrappedDrawable, ColorStateList.valueOf(color))\n        return wrappedDrawable\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/theming/ThemingModule.java",
    "content": "package com.alexstyl.specialdates.theming;\n\nimport android.content.Context;\nimport android.content.res.Resources;\n\nimport dagger.Module;\nimport dagger.Provides;\n\n@Module\npublic class ThemingModule {\n\n    @Provides\n    Themer themer(ThemingPreferences preferences, AttributeExtractor attributeExtractor, Resources resources) {\n        return new Themer(preferences, attributeExtractor, resources);\n    }\n\n    @Provides\n    AttributeExtractor attributeExtractor() {\n        return new AttributeExtractor();\n    }\n\n    @Provides\n    ThemingPreferences themingPreferences(Context context) {\n        return ThemingPreferences.Companion.newInstance(context);\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/theming/ThemingPreferences.kt",
    "content": "package com.alexstyl.specialdates.theming\n\nimport android.content.Context\n\nimport com.alexstyl.specialdates.EasyPreferences\nimport com.alexstyl.specialdates.R\n\nclass ThemingPreferences private constructor(private val preferences: EasyPreferences) {\n\n    var selectedTheme: MementoTheme\n        get() {\n            val themeId = preferences.getInt(R.string.key_app_theme_id, DEFAULT_THEME.id)\n            return MementoTheme.fromId(themeId)\n        }\n        set(selectedTheme) = preferences.setInteger(R.string.key_app_theme_id, selectedTheme.id)\n\n    companion object {\n\n        private val DEFAULT_THEME = MementoTheme.CHERRY_RED\n\n        fun newInstance(context: Context): ThemingPreferences {\n            return ThemingPreferences(EasyPreferences.createForDefaultPreferences(context))\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/transition/FadeInTransition.java",
    "content": "package com.alexstyl.specialdates.transition;\n\nimport android.support.transition.AutoTransition;\nimport android.support.transition.Transition;\n\npublic final class FadeInTransition extends AutoTransition {\n\n    private static final int FADE_IN_DURATION = 200;\n\n    private FadeInTransition() {\n        // hide this\n    }\n\n    public static Transition createTransition() {\n        AutoTransition transition = new AutoTransition();\n        transition.setDuration(FADE_IN_DURATION);\n        return transition;\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/transition/FadeOutTransition.java",
    "content": "package com.alexstyl.specialdates.transition;\n\nimport android.support.transition.AutoTransition;\nimport android.support.transition.Transition;\n\npublic final class FadeOutTransition extends AutoTransition {\n\n    private FadeOutTransition() {\n        // hide this\n    }\n\n    private static final int FADE_OUT_DURATION = 250;\n\n    /**\n     * Creates a AutoTransition that calls the {@linkplain Transition.TransitionListener#onTransitionEnd(Transition)}\n     * of the passing DonationCallbacks when complete\n     */\n    public static Transition withAction(TransitionListener finishingAction) {\n        AutoTransition transition = new AutoTransition();\n        transition.setDuration(FADE_OUT_DURATION);\n        transition.addListener(finishingAction);\n        return transition;\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/transition/SimpleTransitionListener.java",
    "content": "package com.alexstyl.specialdates.transition;\n\nimport android.support.transition.Transition;\n\nimport static android.support.transition.Transition.TransitionListener;\n\npublic class SimpleTransitionListener implements TransitionListener {\n    @Override\n    public void onTransitionStart(Transition transition) {\n        // do nothing\n    }\n\n    @Override\n    public void onTransitionPause(Transition transition) {\n        // do nothing\n    }\n\n    @Override\n    public void onTransitionResume(Transition transition) {\n        // do nothing\n    }\n\n    @Override\n    public void onTransitionEnd(Transition transition) {\n        // do nothing\n    }\n\n    @Override\n    public void onTransitionCancel(Transition transition) {\n        // do nothing\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/ui/DummyHideStatusBarListener.java",
    "content": "package com.alexstyl.specialdates.ui;\n\nimport android.support.design.widget.AppBarLayout;\n\npublic final class DummyHideStatusBarListener implements AppBarLayout.OnOffsetChangedListener {\n\n    @Override\n    public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {\n        // does nothing\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/ui/HorizontalDivider.java",
    "content": "package com.alexstyl.specialdates.ui;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.alexstyl.specialdates.R;\n\npublic class HorizontalDivider extends View {\n\n    public HorizontalDivider(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        int dividerHeight = getResources().getDimensionPixelSize(R.dimen.horizontal_divider_height);\n        setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, dividerHeight));\n\n        int dividerColor = getResources().getColor(R.color.divider_grey);\n        setBackgroundColor(dividerColor);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/ui/LolipopHideStatusBarListener.java",
    "content": "package com.alexstyl.specialdates.ui;\n\nimport android.graphics.Color;\nimport android.os.Build;\nimport android.support.annotation.ColorInt;\nimport android.support.annotation.RequiresApi;\nimport android.support.design.widget.AppBarLayout;\nimport android.view.Window;\n\n@RequiresApi(Build.VERSION_CODES.LOLLIPOP)\npublic final class LolipopHideStatusBarListener implements AppBarLayout.OnOffsetChangedListener {\n\n    private static final int STATE_DEFAULT = 1;\n    private static final int STATE_TRANSPARENT = 2;\n    private static final int MAX_OFFSET = -800;\n\n    private final Window window;\n    @ColorInt\n    private final int defaultColor;\n    @ColorInt\n    private final int targetColor;\n\n    private int state = 0;\n\n    public LolipopHideStatusBarListener(Window window) {\n        this.window = window;\n        this.defaultColor = window.getStatusBarColor();\n        this.targetColor = Color.TRANSPARENT;\n\n    }\n\n    @Override\n    public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {\n        if (state != STATE_DEFAULT && verticalOffset == MAX_OFFSET) {\n            window.setStatusBarColor(defaultColor);\n            state = STATE_DEFAULT;\n        } else if (state != STATE_TRANSPARENT) {\n            window.setStatusBarColor(targetColor);\n            state = STATE_TRANSPARENT;\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/ui/MementoCardView.java",
    "content": "package com.alexstyl.specialdates.ui;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.graphics.PorterDuff;\nimport android.util.AttributeSet;\nimport android.widget.FrameLayout;\n\nimport com.alexstyl.specialdates.R;\n\npublic class MementoCardView extends FrameLayout {\n\n    public MementoCardView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n\n        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MementoCardView, 0, 0);\n        int cardColor = typedArray.getColor(R.styleable.MementoCardView_cardBackgroundColor, 0);\n        typedArray.recycle();\n\n        super.setBackgroundResource(R.drawable.card_no_paddings);\n        if (isAValidColor(cardColor)) {\n            getBackground().setColorFilter(cardColor, PorterDuff.Mode.MULTIPLY);\n        }\n    }\n\n    private boolean isAValidColor(int backgroundColor) {\n        return backgroundColor != 0;\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/ui/ViewFader.java",
    "content": "package com.alexstyl.specialdates.ui;\n\nimport android.view.ViewGroup;\n\nimport static android.view.View.GONE;\nimport static android.view.View.VISIBLE;\n\npublic final class ViewFader {\n\n    public void hideContentOf(ViewGroup viewGroup) {\n        for (int i = 0; i < viewGroup.getChildCount(); i++) {\n            viewGroup.getChildAt(i).setVisibility(GONE);\n        }\n    }\n\n    public void showContent(ViewGroup viewGroup) {\n        for (int i = 0; i < viewGroup.getChildCount(); i++) {\n            viewGroup.getChildAt(i).setVisibility(VISIBLE);\n        }\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/ui/base/MementoActivity.kt",
    "content": "package com.alexstyl.specialdates.ui.base\n\nimport android.app.Activity\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport android.support.v4.app.NavUtils\nimport android.support.v4.app.TaskStackBuilder\nimport android.support.v7.app.AppCompatActivity\nimport android.view.KeyEvent\nimport android.view.MenuItem\nimport com.alexstyl.android.Version\n\nopen class MementoActivity : AppCompatActivity() {\n\n    private fun shouldUseHomeAsUp(): Boolean = parentActivityIntent != null\n\n    override fun onPostCreate(savedInstanceState: Bundle?) {\n        super.onPostCreate(savedInstanceState)\n        if (shouldUseHomeAsUp()) {\n            val bar = supportActionBar\n            if (bar != null) {\n                bar.setHomeButtonEnabled(true)\n                bar.setDisplayHomeAsUpEnabled(true)\n            }\n        }\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        if (item.itemId == android.R.id.home) {\n            navigateUpToParent()\n            return true\n        }\n        return super.onOptionsItemSelected(item)\n    }\n\n    fun navigateUpToParent() {\n        val upIntent = NavUtils.getParentActivityIntent(this) ?: return\n        if (NavUtils.shouldUpRecreateTask(this, upIntent) || isTaskRoot) {\n            TaskStackBuilder.create(this)\n                    .addNextIntentWithParentStack(upIntent)\n                    .startActivities()\n        } else {\n            NavUtils.navigateUpTo(this, upIntent)\n        }\n    }\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n        super.onActivityResult(requestCode, resultCode, data)\n        val fragments = supportFragmentManager.fragments\n        if (fragments != null) {\n            for (fragment in fragments) {\n                fragment?.onActivityResult(requestCode, resultCode, data)\n            }\n        }\n    }\n\n\n    protected fun context(): Context = this\n\n    protected fun supportsTransitions(): Boolean = Version.hasKitKat()\n\n    protected fun thisActivity(): Activity = this\n\n    override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {\n        return if (keyCode == KeyEvent.KEYCODE_MENU) {\n            onKeyMenuPressed()\n        } else {\n            super.onKeyDown(keyCode, event)\n        }\n    }\n\n    open fun onKeyMenuPressed(): Boolean = false\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/ui/base/MementoDialog.java",
    "content": "package com.alexstyl.specialdates.ui.base;\n\nimport android.content.ContentResolver;\nimport android.content.Context;\nimport android.support.v4.app.DialogFragment;\n\nimport com.alexstyl.specialdates.MementoApplication;\n\npublic class MementoDialog extends DialogFragment {\n\n    protected ContentResolver getContentResolver() {\n        return getActivity().getContentResolver();\n    }\n\n    protected Context getThemedContext() {\n        return getActivity();\n    }\n\n    protected MementoApplication getApplication() {\n        return ((MementoApplication) getActivity().getApplication());\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/ui/base/MementoFragment.java",
    "content": "package com.alexstyl.specialdates.ui.base;\n\nimport android.app.Activity;\nimport android.content.ContentResolver;\nimport android.support.v4.app.Fragment;\n\npublic class MementoFragment extends Fragment {\n\n    private MementoActivity mActivity;\n\n    public MementoActivity getMementoActivity() {\n        return mActivity;\n    }\n\n    @Override\n    public void onAttach(Activity activity) {\n        if (!(activity instanceof MementoActivity)) {\n            throw new IllegalStateException(MementoFragment.class.getSimpleName()\n                                                    + \" must be attached to a BaseActivity.\");\n        }\n        mActivity = (MementoActivity) activity;\n\n        super.onAttach(activity);\n    }\n\n    protected ContentResolver getContentResolver() {\n        return getActivity().getContentResolver();\n    }\n\n    protected void setActivityTitle(String title) {\n        if (getActivity() != null) {\n            getActivity().setTitle(title);\n        }\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/ui/base/MementoPreferenceActivity.kt",
    "content": "package com.alexstyl.specialdates.ui.base\n\nimport android.content.Intent\n\nopen class MementoPreferenceActivity : ThemedMementoActivity() {\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n        super.onActivityResult(requestCode, resultCode, data)\n        val fragments = supportFragmentManager.fragments\n        if (fragments != null) {\n            for (frag in fragments) {\n                frag.onActivityResult(requestCode, resultCode, data)\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/ui/base/MementoPreferenceFragment.kt",
    "content": "package com.alexstyl.specialdates.ui.base\n\nimport android.preference.Preference\nimport android.preference.PreferenceCategory\nimport android.support.annotation.StringRes\nimport android.support.v4.preference.PreferenceFragment\nimport com.alexstyl.android.Version\nimport com.alexstyl.specialdates.util.GreekNameUtils\n\nopen class MementoPreferenceFragment : PreferenceFragment() {\n\n    override fun addPreferencesFromResource(preferencesResId: Int) {\n        super.addPreferencesFromResource(preferencesResId)\n        if (GreekNameUtils.isGreekLocaleSelected(activity)) {\n            fixCategoryTitles()\n        }\n    }\n\n    private fun fixCategoryTitles() {\n        val count = preferenceScreen.preferenceCount\n        for (i in 0 until count) {\n            val preference = preferenceScreen.getPreference(i)\n            val category = preference as? PreferenceCategory\n            if (category != null && category.title != null) {\n\n                val title = category.title.toString()\n                val accentLessTitle = GreekNameUtils.removeAccents(title)\n                category.title = accentLessTitle\n            }\n        }\n    }\n\n    fun <T : Preference> findPreference(@StringRes keyId: Int): T? {\n        return findPreference(getString(keyId)) as T?\n    }\n\n    fun <T : Preference> findPreferenceOrThrow(@StringRes keyId: Int): T {\n        @Suppress(\"UNCHECKED_CAST\")\n        return findPreference(getString(keyId)) as T\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/ui/base/ThemedMementoActivity.kt",
    "content": "package com.alexstyl.specialdates.ui.base\n\nimport android.content.Intent\nimport android.content.res.ColorStateList\nimport android.graphics.drawable.Drawable\nimport android.os.Bundle\nimport android.support.annotation.DrawableRes\nimport android.support.annotation.LayoutRes\nimport android.support.v4.content.res.ResourcesCompat\nimport android.support.v4.graphics.drawable.DrawableCompat\nimport android.support.v7.view.ContextThemeWrapper\nimport android.view.LayoutInflater\nimport android.view.Menu\nimport com.alexstyl.specialdates.MementoApplication\nimport com.alexstyl.specialdates.home.HomeActivity\nimport com.alexstyl.specialdates.theming.AttributeExtractor\nimport com.alexstyl.specialdates.theming.MementoTheme\nimport com.alexstyl.specialdates.theming.Themer\nimport javax.inject.Inject\n\nopen class ThemedMementoActivity : MementoActivity() {\n\n    lateinit var themer: Themer\n        @Inject set\n    lateinit var attributeExtractor: AttributeExtractor\n        @Inject set\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        (application as MementoApplication).applicationModule.inject(this)\n        themer.applyThemeTo(this)\n        super.onCreate(savedInstanceState)\n    }\n\n    fun setContentView(@LayoutRes layoutResID: Int, theme: MementoTheme) {\n        val wrapper = ContextThemeWrapper(this, theme.androidTheme())\n        val inflate = LayoutInflater.from(wrapper).inflate(layoutResID, null, false)\n        setContentView(inflate)\n    }\n\n    fun applyNewTheme() {\n        val intent = Intent(ACTION_UPDATE_THEME)\n        intent.setClass(this, HomeActivity::class.java)\n        finish()\n        startActivity(intent)\n        overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out)\n    }\n\n    override fun onPrepareOptionsMenu(menu: Menu?): Boolean {\n        for (i in 0 until menu?.size()!!) {\n            val item = menu.getItem(i)\n            if (item.icon == null) {\n                continue\n            }\n            val wrappedDrawable = DrawableCompat.wrap(item.icon)\n            val color = attributeExtractor!!.extractToolbarIconColors(this)\n            DrawableCompat.setTintList(wrappedDrawable, ColorStateList.valueOf(color))\n        }\n        return super.onPrepareOptionsMenu(menu)\n    }\n\n    fun getTintedDrawable(@DrawableRes drawableResId: Int): Drawable = themer.getTintedDrawable(drawableResId, this)\n\n    companion object {\n        /**\n         * Intent action that the theme of the app was just updated\n         */\n        const val ACTION_UPDATE_THEME = \"ACTION_UPDATE_THEME\"\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/ui/dialog/ProgressFragmentDialog.java",
    "content": "package com.alexstyl.specialdates.ui.dialog;\n\nimport android.app.Dialog;\nimport android.app.ProgressDialog;\nimport android.os.Bundle;\nimport android.text.TextUtils;\n\nimport com.alexstyl.specialdates.ui.base.MementoDialog;\n\n/**\n * FragmentDialog displaying a ProgressDialog\n * <p>Created by Alex on 6/11/2014.\n * </p>\n */\npublic class ProgressFragmentDialog extends MementoDialog {\n\n    private static final String ARG_MESSAGE = \"alexstyl:message\";\n    private static final String ARG_ONE_SHOT = \"alexstyl:one_shot\";\n\n    @Override\n    public Dialog onCreateDialog(Bundle savedInstanceState) {\n\n\n        ProgressDialog dialog = new ProgressDialog(getActivity());\n            String message = getArguments().getString(ARG_MESSAGE);\n            if (!TextUtils.isEmpty(message)) {\n                dialog.setMessage(message);\n        }\n        return dialog;\n    }\n\n    public static ProgressFragmentDialog newInstance(String message, boolean oneShot) {\n        ProgressFragmentDialog dialog = new ProgressFragmentDialog();\n        Bundle args = new Bundle(2);\n        args.putBoolean(ARG_ONE_SHOT, oneShot);\n        if (!TextUtils.isEmpty(message)) {\n            args.putString(ARG_MESSAGE, message);\n        }\n        dialog.setArguments(args);\n        return dialog;\n    }\n\n    @Override\n    public void onStop() {\n        super.onStop();\n        if (getArguments().getBoolean(ARG_ONE_SHOT)) {\n            dismissAllowingStateLoss();\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/ui/loader/SimpleAsyncTaskLoader.java",
    "content": "package com.alexstyl.specialdates.ui.loader;\n\nimport android.content.Context;\nimport android.support.v4.content.AsyncTaskLoader;\n\n@SuppressWarnings(\"all\")\npublic abstract class SimpleAsyncTaskLoader<T> extends AsyncTaskLoader<T> {\n\n    public SimpleAsyncTaskLoader(Context context) {\n        super(context);\n    }\n\n    private T mData;\n\n    @Override\n    public void deliverResult(T data) {\n        if (isReset()) {\n            // The Loader has been reset; ignore the result and invalidate the data.\n            releaseResources(data);\n            return;\n        }\n\n        // Hold a reference to the old data so it doesn't get garbage collected.\n        // We must protect it until the new data has been delivered.\n        T oldData = mData;\n        mData = data;\n\n        if (isStarted()) {\n            // If the Loader is in a started state, deliver the results to the\n            // client. The superclass method does this for us.\n            super.deliverResult(data);\n        }\n\n        // Invalidate the old data as we don't need it any more.\n        if (oldData != null && oldData != data) {\n            releaseResources(oldData);\n        }\n    }\n\n    private void releaseResources(T oldData) {\n\n    }\n\n    @Override\n    protected void onStartLoading() {\n        if (mData != null) {\n            // Deliver any previously loaded data immediately.\n            deliverResult(mData);\n        }\n\n        if (takeContentChanged() || mData == null) {\n            // When the observer detects a change, it should call onContentChanged()\n            // on the Loader, which will cause the next call to takeContentChanged()\n            // to return true. If this is ever the case (or if the current data is\n            // null), we force a new load.\n            forceLoad();\n        }\n    }\n\n    @Override\n    protected void onStopLoading() {\n        // The Loader is in a stopped state, so we should attempt to cancel the\n        // current load (if there is one).\n        cancelLoad();\n\n        // Note that we leave the observer as is. Loaders in a stopped state\n        // should still monitor the data source for changes so that the Loader\n        // will know to force a new load if it is ever started again.\n    }\n\n    @Override\n    protected void onReset() {\n        // Ensure the loader has been stopped.\n        onStopLoading();\n\n        // At this point we can release the resources associated with 'mData'.\n        if (mData != null) {\n            releaseResources(mData);\n            mData = null;\n        }\n\n        // The Loader is being reset, so we should stop monitoring for changes.\n        onUnregisterObserver();\n    }\n\n    final public T getCachedData() {\n        return mData;\n    }\n\n    /**\n     * Called whenever it's time to stop monitoring changes on the loaders data source\n     */\n    protected void onUnregisterObserver() {\n\n    }\n\n    @Override\n    public void onCanceled(T data) {\n        // Attempt to cancel the current asynchronous load.\n        super.onCanceled(data);\n\n        // The load has been canceled, so we should release the resources\n        // associated with 'data'.\n        releaseResources(data);\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/ui/widget/AndroidLetterPainter.java",
    "content": "package com.alexstyl.specialdates.ui.widget;\n\nimport android.content.res.Resources;\nimport android.support.annotation.ColorInt;\n\nimport com.alexstyl.specialdates.R;\n\npublic class AndroidLetterPainter implements LetterPainter {\n\n    private final Resources resources;\n\n    AndroidLetterPainter(Resources resources) {\n        this.resources = resources;\n    }\n\n    /**\n     * The different color variants to draw\n     */\n    private static final int[] BACKGROUND_VARIANTS = {\n            R.color.avatar_variant_1,\n            R.color.avatar_variant_2,\n            R.color.avatar_variant_3,\n            R.color.avatar_variant_4,\n            R.color.avatar_variant_5,\n    };\n\n    private static final int VARIANT_COUNT = BACKGROUND_VARIANTS.length;\n\n    @Override\n    @ColorInt\n    public int getVariant(int i2) {\n        int variant = Math.abs(i2);\n        variant = normalise(variant);\n        return resources.getColor(BACKGROUND_VARIANTS[variant]);\n    }\n\n    private static int normalise(int variant) {\n        if (variant >= VARIANT_COUNT) {\n            variant = (variant % VARIANT_COUNT);\n            if (variant >= VARIANT_COUNT) {\n                variant = variant / VARIANT_COUNT;\n            }\n        }\n        return variant;\n    }\n\n}\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/ui/widget/AvatarLayout.java",
    "content": "package com.alexstyl.specialdates.ui.widget;\n\nimport android.annotation.TargetApi;\nimport android.content.Context;\nimport android.os.Build;\nimport android.util.AttributeSet;\nimport android.view.View;\nimport android.widget.LinearLayout;\n\npublic class AvatarLayout extends LinearLayout {\n\n    public AvatarLayout(Context context) {\n        super(context);\n    }\n\n    public AvatarLayout(Context context, AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    @TargetApi(Build.VERSION_CODES.HONEYCOMB)\n    public AvatarLayout(Context context, AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n\n        super.setOrientation(HORIZONTAL);\n    }\n\n    @Override\n    public void setOrientation(int orientation) {\n\n    }\n\n    @Override\n    public ColorImageView getChildAt(int index) {\n        return (ColorImageView) super.getChildAt(index);\n    }\n\n    @Override\n    protected void onLayout(boolean changed, int l, int t, int r, int b) {\n        super.onLayout(changed, l, t, r, b);\n        int width = r - l;\n\n        int childCount = getChildCount();\n        int childrenSize = 0;\n        for (int i = childCount; i > 0; i--) {\n            View view = getChildAt(i - 1);\n            int paddings = view.getPaddingRight();\n            LinearLayout.LayoutParams layoutParams = (LayoutParams) view.getLayoutParams();\n            int margins = layoutParams.rightMargin;\n            int childSize = view.getMeasuredWidth() + (paddings + margins);\n            childrenSize += childSize;\n            if (width < childrenSize) {\n                childrenSize -= childSize;\n                view.setVisibility(View.GONE);\n            } else {\n                childrenSize += view.getPaddingLeft() + layoutParams.leftMargin;\n            }\n\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/ui/widget/ColorImageView.java",
    "content": "package com.alexstyl.specialdates.ui.widget;\n\nimport android.content.Context;\nimport android.content.res.Resources;\nimport android.content.res.TypedArray;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.Typeface;\nimport android.support.annotation.Size;\nimport android.text.TextUtils;\nimport android.util.AttributeSet;\nimport android.util.TypedValue;\nimport android.view.View;\nimport android.widget.FrameLayout;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport com.alexstyl.android.Version;\nimport com.alexstyl.specialdates.AppComponent;\nimport com.alexstyl.specialdates.MementoApplication;\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.util.GreekNameUtils;\nimport com.novoda.notils.caster.Views;\n\nimport javax.inject.Inject;\n\npublic class ColorImageView extends FrameLayout {\n\n    private static final String UKNOWN_CHARACTER = \"?\";\n\n    @Inject\n    AndroidLetterPainter letterPainter;\n\n    private boolean drawCircle = true;\n\n    private TextView letter;\n\n    private ImageView image;\n    private Paint paint;\n\n    private int backgroundVariant;\n\n    public ColorImageView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n\n        AppComponent applicationModule = ((MementoApplication) context.getApplicationContext()).getApplicationModule();\n        applicationModule.inject(this);\n\n        View view = inflate(context, R.layout.merge_color_imageview, this);\n        this.letter = Views.findById(view, android.R.id.text1);\n        this.image = Views.findById(view, android.R.id.icon);\n\n        Resources resources = getResources();\n        paint = new Paint(Paint.ANTI_ALIAS_FLAG);\n        paint.setColor(resources.getColor(android.R.color.white));\n        paint.setStyle(Paint.Style.FILL);\n        paint.setTextAlign(Paint.Align.CENTER);\n\n        if (Version.INSTANCE.hasJellyBean()) {\n            paint.setTypeface(Typeface.create(\"sans-serif-light\", Typeface.NORMAL));\n        }\n\n        TypedArray a = context.getTheme().obtainStyledAttributes(\n                attrs,\n                R.styleable.ColorImageView,\n                0, 0\n        );\n\n        try {\n            drawCircle = a.getBoolean(R.styleable.ColorImageView_isCircle, false);\n            float textSize = a.getDimension(R.styleable.ColorImageView_letterSize, resources.getDimensionPixelSize(R.dimen.initials_textSize));\n            letter.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);\n        } finally {\n            a.recycle();\n        }\n\n        paint.setAntiAlias(true);\n        setWillNotDraw(false);\n        invalidate();\n    }\n\n    public void setLetter(String word, boolean firstChar) {\n        word = (word == null ? \"\" : word.trim().toUpperCase());\n        String mCharacter = letter.getText().toString();\n        if (!mCharacter.equals(word)) {\n            if (TextUtils.isEmpty(word)) {\n                letter.setText(UKNOWN_CHARACTER);\n            } else {\n                if (firstChar) {\n                    letter.setText(GreekNameUtils.removeAccents(word.substring(0, 1)));\n                } else {\n                    letter.setText(GreekNameUtils.removeAccents(word));\n                }\n            }\n\n        }\n    }\n\n    public ImageView getImageView() {\n        return image;\n    }\n\n    /**\n     * Returns the currently selected background variant of the view\n     */\n    public void setCircleColorVariant(@Size(min = 1, max = 5) int i) {\n        int variant = letterPainter.getVariant(i);\n        if (backgroundVariant != variant) {\n            backgroundVariant = variant;\n            paint.setColor(backgroundVariant);\n            invalidate();\n        }\n    }\n\n    @Override\n    protected void onDraw(Canvas canvas) {\n        int width = getWidth();\n        int height = getHeight();\n        if (width > 0 && height > 0) {\n            if (drawCircle) {\n                float minSide = (float) Math.min(width, height);\n                canvas.drawCircle(width / 2, height / 2, minSide / 2, paint);\n            } else {\n                canvas.drawPaint(paint);\n            }\n        }\n        super.onDraw(canvas);\n    }\n\n    public void setLetter(String letter) {\n        setLetter(letter, true);\n    }\n\n    public void setText(String text) {\n        setLetter(text);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/ui/widget/ForegroundLinearLayout.java",
    "content": "/*\n * Copyright (C) 2006 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n *\n * Copy-pasta from https://gist.github.com/chrisbanes/9091754\n */\n\npackage com.alexstyl.specialdates.ui.widget;\n\nimport android.annotation.TargetApi;\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.graphics.Canvas;\nimport android.graphics.Rect;\nimport android.graphics.drawable.Drawable;\nimport android.os.Build;\nimport android.util.AttributeSet;\nimport android.view.Gravity;\nimport android.view.MotionEvent;\nimport android.widget.LinearLayout;\n\nimport com.alexstyl.specialdates.R;\n\npublic class ForegroundLinearLayout extends LinearLayout {\n\n    private Drawable mForeground;\n\n    private final Rect mSelfBounds = new Rect();\n    private final Rect mOverlayBounds = new Rect();\n\n    private int mForegroundGravity = Gravity.FILL;\n\n    protected boolean mForegroundInPadding = true;\n\n    boolean mForegroundBoundsChanged = false;\n\n    public ForegroundLinearLayout(Context context) {\n        super(context);\n    }\n\n    public ForegroundLinearLayout(Context context, AttributeSet attrs) {\n        this(context, attrs, 0);\n    }\n\n    public ForegroundLinearLayout(Context context, AttributeSet attrs, int defStyle) {\n        super(context, attrs, defStyle);\n\n        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ForegroundLinearLayout,\n                                                      defStyle, 0\n        );\n\n        mForegroundGravity = a.getInt(\n                R.styleable.ForegroundLinearLayout_foregroundGravity, mForegroundGravity);\n\n        final Drawable d = a.getDrawable(R.styleable.ForegroundLinearLayout_foreground);\n        if (d != null) {\n            setForeground(d);\n        }\n\n        mForegroundInPadding = a.getBoolean(\n                R.styleable.ForegroundLinearLayout_foregroundInsidePadding, true);\n\n        a.recycle();\n    }\n\n    /**\n     * Describes how the foreground is positioned.\n     *\n     * @return foreground gravity.\n     * @see #setForegroundGravity(int)\n     */\n    public int getForegroundGravity() {\n        return mForegroundGravity;\n    }\n\n    /**\n     * Describes how the foreground is positioned. Defaults to START and TOP.\n     *\n     * @param foregroundGravity See {@link android.view.Gravity}\n     * @see #getForegroundGravity()\n     */\n    public void setForegroundGravity(int foregroundGravity) {\n        if (mForegroundGravity != foregroundGravity) {\n            if ((foregroundGravity & Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK) == 0) {\n                foregroundGravity |= Gravity.START;\n            }\n\n            if ((foregroundGravity & Gravity.VERTICAL_GRAVITY_MASK) == 0) {\n                foregroundGravity |= Gravity.TOP;\n            }\n\n            mForegroundGravity = foregroundGravity;\n\n            if (mForegroundGravity == Gravity.FILL && mForeground != null) {\n                Rect padding = new Rect();\n                mForeground.getPadding(padding);\n            }\n\n            requestLayout();\n        }\n    }\n\n    @Override\n    protected boolean verifyDrawable(Drawable who) {\n        return super.verifyDrawable(who) || (who == mForeground);\n    }\n\n    @Override\n    public void jumpDrawablesToCurrentState() {\n        super.jumpDrawablesToCurrentState();\n        if (mForeground != null) {\n            mForeground.jumpToCurrentState();\n        }\n    }\n\n    @Override\n    protected void drawableStateChanged() {\n        super.drawableStateChanged();\n        if (mForeground != null && mForeground.isStateful()) {\n            mForeground.setState(getDrawableState());\n        }\n    }\n\n    /**\n     * Supply a Drawable that is to be rendered on top of all of the child\n     * views in the frame layout.  Any padding in the Drawable will be taken\n     * into account by ensuring that the children are inset to be placed\n     * inside of the padding area.\n     *\n     * @param drawable The Drawable to be drawn on top of the children.\n     */\n    public void setForeground(Drawable drawable) {\n        if (mForeground != drawable) {\n            if (mForeground != null) {\n                mForeground.setCallback(null);\n                unscheduleDrawable(mForeground);\n            }\n\n            mForeground = drawable;\n\n            if (drawable != null) {\n                setWillNotDraw(false);\n                drawable.setCallback(this);\n                if (drawable.isStateful()) {\n                    drawable.setState(getDrawableState());\n                }\n                if (mForegroundGravity == Gravity.FILL) {\n                    Rect padding = new Rect();\n                    drawable.getPadding(padding);\n                }\n            } else {\n                setWillNotDraw(true);\n            }\n            requestLayout();\n            invalidate();\n        }\n    }\n\n    /**\n     * Returns the drawable used as the foreground of this FrameLayout. The\n     * foreground drawable, if non-null, is always drawn on top of the children.\n     *\n     * @return A Drawable or null if no foreground was set.\n     */\n    public Drawable getForeground() {\n        return mForeground;\n    }\n\n    @Override\n    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {\n        super.onLayout(changed, left, top, right, bottom);\n        mForegroundBoundsChanged = changed;\n    }\n\n    @Override\n    protected void onSizeChanged(int w, int h, int oldw, int oldh) {\n        super.onSizeChanged(w, h, oldw, oldh);\n        mForegroundBoundsChanged = true;\n    }\n\n    @Override\n    public void draw(Canvas canvas) {\n        super.draw(canvas);\n\n        if (mForeground != null) {\n            final Drawable foreground = mForeground;\n\n            if (mForegroundBoundsChanged) {\n                mForegroundBoundsChanged = false;\n                final Rect selfBounds = mSelfBounds;\n                final Rect overlayBounds = mOverlayBounds;\n\n                final int w = getRight() - getLeft();\n                final int h = getBottom() - getTop();\n\n                if (mForegroundInPadding) {\n                    selfBounds.set(0, 0, w, h);\n                } else {\n                    selfBounds.set(getPaddingLeft(), getPaddingTop(),\n                                   w - getPaddingRight(), h - getPaddingBottom()\n                    );\n                }\n\n                Gravity.apply(mForegroundGravity, foreground.getIntrinsicWidth(),\n                              foreground.getIntrinsicHeight(), selfBounds, overlayBounds\n                );\n                foreground.setBounds(overlayBounds);\n            }\n\n            foreground.draw(canvas);\n        }\n    }\n\n    @TargetApi(Build.VERSION_CODES.LOLLIPOP)\n    @Override\n    public boolean onTouchEvent(MotionEvent e) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {\n            if (e.getActionMasked() == MotionEvent.ACTION_DOWN) {\n                if (mForeground != null)\n                    mForeground.setHotspot(e.getX(), e.getY());\n            }\n        }\n        return super.onTouchEvent(e);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/ui/widget/LogoView.java",
    "content": "package com.alexstyl.specialdates.ui.widget;\n\nimport android.content.Context;\nimport android.content.pm.PackageInfo;\nimport android.content.pm.PackageManager;\nimport android.util.AttributeSet;\nimport android.view.LayoutInflater;\nimport android.widget.RelativeLayout;\nimport android.widget.TextView;\n\nimport com.alexstyl.specialdates.R;\n\npublic class LogoView extends RelativeLayout {\n\n    public LogoView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        LayoutInflater.from(getContext()).inflate(R.layout.merge_logo_view, this, true);\n        if (isInEditMode()) {\n            return;\n        }\n\n        TextView appversionView = findViewById(R.id.logo_view_app_version);\n        String appVersion = getVersionName(getContext());\n        appversionView.setText(appVersion);\n    }\n\n    public static String getVersionName(Context context) {\n        String versionName = \"\";\n        try {\n            PackageInfo pInfo = context.getPackageManager().getPackageInfo(\n                    context.getPackageName(), 0\n            );\n            versionName = pInfo.versionName;\n        } catch (PackageManager.NameNotFoundException e) {\n            e.printStackTrace();\n        }\n        return versionName;\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/ui/widget/MementoToolbar.java",
    "content": "package com.alexstyl.specialdates.ui.widget;\n\nimport android.content.Context;\nimport android.content.res.ColorStateList;\nimport android.graphics.drawable.Drawable;\nimport android.support.annotation.Nullable;\nimport android.support.v4.graphics.drawable.DrawableCompat;\nimport android.support.v7.widget.Toolbar;\nimport android.util.AttributeSet;\n\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.theming.AttributeExtractor;\n\npublic class MementoToolbar extends Toolbar {\n    \n    AttributeExtractor attributeExtractor = new AttributeExtractor();\n\n    public MementoToolbar(Context context, @Nullable AttributeSet attrs) {\n        super(context, attrs);\n        \n        setMinimumHeight(getResources().getDimensionPixelSize(R.dimen.toolbar_minHeight));\n    }\n    \n    public void displayNavigationIconAsUp() {\n        int color = attributeExtractor.extractToolbarIconColors(getContext());\n        Drawable closeIconDrawable = DrawableCompat.wrap(getResources().getDrawable(R.drawable.ic_arrow_back_white_24dp));\n        DrawableCompat.setTintList(closeIconDrawable, ColorStateList.valueOf(color));\n        setNavigationIcon(closeIconDrawable);\n    }\n\n    public void displayNavigationIconAsClose() {\n        int color = attributeExtractor.extractToolbarIconColors(getContext());\n        Drawable closeIconDrawable = DrawableCompat.wrap(getResources().getDrawable(R.drawable.ic_close_white));\n        DrawableCompat.setTintList(closeIconDrawable, ColorStateList.valueOf(color));\n        setNavigationIcon(closeIconDrawable);\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/ui/widget/SpacesItemDecoration.java",
    "content": "package com.alexstyl.specialdates.ui.widget;\n\nimport android.graphics.Rect;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.View;\n\npublic class SpacesItemDecoration extends RecyclerView.ItemDecoration {\n\n    private final int space;\n    private final int columns;\n\n    public SpacesItemDecoration(int space, int columns) {\n        this.space = space;\n        this.columns = columns;\n    }\n\n    @Override\n    public void getItemOffsets(Rect outRect, View view,\n                               RecyclerView parent, RecyclerView.State state) {\n\n        outRect.bottom = space;\n\n        if (parent.getChildLayoutPosition(view) < columns) {\n            outRect.top = space;\n        }\n\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/ui/widget/ViewModule.java",
    "content": "package com.alexstyl.specialdates.ui.widget;\n\nimport android.content.res.Resources;\n\nimport javax.inject.Singleton;\n\nimport dagger.Module;\nimport dagger.Provides;\n\n@Module\n@Singleton\npublic class ViewModule {\n\n    private final Resources resources;\n\n    public ViewModule(Resources resources) {\n        this.resources = resources;\n    }\n\n    @Provides\n    @Singleton\n    AndroidLetterPainter providesLetterPainter() {\n        return new AndroidLetterPainter(resources);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/AndroidUpcomingDateStringCreator.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\nimport android.content.Context\nimport android.text.format.DateUtils\n\nimport com.alexstyl.specialdates.Strings\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.DateComparator\n\nclass AndroidUpcomingDateStringCreator(\n        private val strings: Strings,\n        private val today: Date,\n        private val context: Context) : UpcomingDateStringCreator {\n\n    override fun createLabelFor(date: Date): String {\n        var formatFlags = DateUtils.FORMAT_NO_NOON_MIDNIGHT or DateUtils.FORMAT_CAP_AMPM or DateUtils.FORMAT_SHOW_DATE or DateUtils.FORMAT_NO_YEAR\n\n        val stringBuilder = StringBuilder()\n\n        when {\n            isToday(date) -> stringBuilder.append(strings.today()).append(DAY_OF_WEEK_SEPARATOR)\n            isTomorrow(date) -> stringBuilder.append(strings.tomorrow()).append(DAY_OF_WEEK_SEPARATOR)\n            else -> formatFlags = formatFlags or (DateUtils.FORMAT_SHOW_DATE or DateUtils.FORMAT_SHOW_WEEKDAY)\n        }\n\n        if (date.year != today.year) {\n            formatFlags = formatFlags or DateUtils.FORMAT_SHOW_YEAR\n        }\n        stringBuilder.append(DateUtils.formatDateTime(context, date.toMillis(), formatFlags))\n        return stringBuilder.toString()\n    }\n\n    private fun isToday(date: Date): Boolean {\n        return DateComparator.INSTANCE.compare(date, today) == 0\n    }\n\n    private fun isTomorrow(date: Date): Boolean {\n        return date.toMillis() - today.toMillis() == DateUtils.DAY_IN_MILLIS\n    }\n\n    companion object {\n        private const val DAY_OF_WEEK_SEPARATOR = \", \"\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/AndroidUpcomingMVPView.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\nimport android.app.Activity\nimport android.support.transition.TransitionManager\nimport android.support.v7.widget.RecyclerView\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.ProgressBar\nimport android.widget.TextView\nimport com.alexstyl.specialdates.support.AskForSupport\n\nclass AndroidUpcomingMVPView(\n        private val upcomingList: RecyclerView,\n        private val root: ViewGroup,\n        private val progressBar: ProgressBar,\n        private val emptyView: TextView,\n        private val adapter: UpcomingEventsAdapter,\n        private val askForSupport: AskForSupport,\n        private val activity: Activity\n\n) : UpcomingListMVPView {\n    override val isShowingNoEvents: Boolean\n        get() = upcomingList.childCount == 0\n\n    override fun showLoading() {\n        progressBar.visibility = View.VISIBLE\n        upcomingList.visibility = View.GONE\n        emptyView.visibility = View.GONE\n    }\n\n    override fun display(events: List<UpcomingRowViewModel>) {\n        TransitionManager.beginDelayedTransition(root)\n\n        progressBar.visibility = View.GONE\n        adapter.displayUpcomingEvents(events)\n\n        if (events.size > 0) {\n            upcomingList.visibility = View.VISIBLE\n            emptyView.visibility = View.GONE\n        } else {\n            upcomingList.visibility = View.GONE\n            emptyView.visibility = View.VISIBLE\n        }\n\n        if (askForSupport.shouldAskForRating()) {\n            askForSupport.askForRatingFromUser(activity)\n        }\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/BankholidayViewHolder.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\nimport android.view.View\nimport android.widget.TextView\nimport com.alexstyl.specialdates.upcoming.view.OnUpcomingEventClickedListener\n\nclass BankholidayViewHolder(view: View,\n                            private val holidayName: TextView)\n    : UpcomingRowViewHolder<BankHolidayViewModel>(view) {\n\n    override fun bind(viewModel: BankHolidayViewModel, listener: OnUpcomingEventClickedListener) {\n        holidayName.text = viewModel.bankHolidayName\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/ContactEventViewHolder.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\nimport android.view.View\nimport android.widget.TextView\nimport com.alexstyl.specialdates.images.ImageLoader\nimport com.alexstyl.specialdates.ui.widget.ColorImageView\nimport com.alexstyl.specialdates.upcoming.view.OnUpcomingEventClickedListener\n\ninternal class ContactEventViewHolder(view: View,\n                                      private val avatarView: ColorImageView,\n                                      private val contactName: TextView,\n                                      private val eventLabel: TextView,\n                                      private val imageLoader: ImageLoader)\n    : UpcomingRowViewHolder<UpcomingContactEventViewModel>(view) {\n\n    override fun bind(viewModel: UpcomingContactEventViewModel, listener: OnUpcomingEventClickedListener) {\n        avatarView.setCircleColorVariant(viewModel.backgroundVariant)\n        avatarView.setLetter(viewModel.contactName)\n\n        contactName.text = viewModel.contactName\n        eventLabel.text = viewModel.eventLabel\n        eventLabel.setTextColor(viewModel.eventColor)\n        imageLoader.load(viewModel.contactImagePath)\n                .asCircle()\n                .into(avatarView.imageView)\n        itemView.setOnClickListener { listener.onContactClicked(viewModel.contact) }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/DateHeaderViewHolder.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\nimport android.view.View\nimport android.widget.TextView\n\nimport com.alexstyl.specialdates.upcoming.view.OnUpcomingEventClickedListener\n\ninternal class DateHeaderViewHolder(view: View, private val dateView: TextView) : UpcomingRowViewHolder<DateHeaderViewModel>(view) {\n    override fun bind(viewModel: DateHeaderViewModel, listener: OnUpcomingEventClickedListener) {\n        dateView.text = viewModel.date\n        dateView.setTextColor(viewModel.titleColor)\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/DatePickerDialogFragment.java",
    "content": "package com.alexstyl.specialdates.upcoming;\n\nimport android.app.Activity;\nimport android.app.DatePickerDialog;\nimport android.app.Dialog;\nimport android.os.Bundle;\nimport android.support.annotation.NonNull;\nimport android.widget.DatePicker;\n\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.date.MonthInt;\nimport com.alexstyl.specialdates.ui.base.MementoDialog;\nimport com.novoda.notils.caster.Classes;\n\npublic final class DatePickerDialogFragment extends MementoDialog {\n\n    private static final String ARG_DAY_OF_MONTH = \"day_of_month\";\n    private static final String ARG_MONTH = \"month\";\n    private static final String ARG_YEAR = \"year\";\n\n    private OnDateSetListener listener;\n\n    public static DatePickerDialogFragment newInstance(Date startingDate) {\n        Bundle args = new Bundle();\n        args.putInt(ARG_DAY_OF_MONTH, startingDate.getDayOfMonth());\n        args.putInt(ARG_MONTH, startingDate.getMonth());\n        args.putInt(ARG_YEAR, startingDate.getYear());\n        DatePickerDialogFragment fragment = new DatePickerDialogFragment();\n        fragment.setArguments(args);\n        return fragment;\n    }\n\n    @Override\n    public void onAttach(Activity activity) {\n        super.onAttach(activity);\n        listener = Classes.from(activity);\n    }\n\n    @NonNull\n    @Override\n    public Dialog onCreateDialog(Bundle savedInstanceState) {\n        Date startingDate = getStartingDate();\n        return new DatePickerDialog(\n                getActivity(),\n                new DatePickerDialog.OnDateSetListener() {\n                    @Override\n                    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {\n                        listener.onDateSelected(Date.Companion.on(dayOfMonth, toOneIndexedMonth(month), year));\n                    }\n                },\n                startingDate.getYear(),\n                getZeroIndexedMonth(startingDate),\n                startingDate.getDayOfMonth()\n        );\n\n    }\n\n    @MonthInt\n    @SuppressWarnings(\"WrongConstant\")\n    private int toOneIndexedMonth(@MonthInt int month) {\n        return month + 1;\n    }\n\n    private int getZeroIndexedMonth(Date startingDate) {\n        return startingDate.getMonth() - 1;\n    }\n\n    private Date getStartingDate() {\n        int dayOfMonth = getArguments().getInt(ARG_DAY_OF_MONTH);\n        @MonthInt int month = getArguments().getInt(ARG_MONTH);\n        int year = getArguments().getInt(ARG_YEAR);\n        return Date.Companion.on(dayOfMonth, month, year);\n    }\n\n    public interface OnDateSetListener {\n        void onDateSelected(Date dateSelected);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/NamedaysViewHolder.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\nimport android.view.View\nimport android.widget.TextView\nimport com.alexstyl.specialdates.upcoming.view.OnUpcomingEventClickedListener\n\nclass NamedaysViewHolder(view: View, private val namedays: TextView)\n    : UpcomingRowViewHolder<UpcomingNamedaysViewModel>(view) {\n\n\n    override fun bind(viewModel: UpcomingNamedaysViewModel, listener: OnUpcomingEventClickedListener) {\n        namedays.text = viewModel.namesLabel\n        itemView.setOnClickListener { listener.onNamedayClicked(viewModel.date) }\n    }\n\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/PeopleEventsRefreshJob.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsUpdater\nimport com.evernote.android.job.Job\n\nclass PeopleEventsRefreshJob(private val peopleEventsUpdater: PeopleEventsUpdater) : Job() {\n\n    companion object {\n        const val TAG = \"People_Job\"\n    }\n\n    override fun onRunJob(params: Job.Params): Job.Result {\n        peopleEventsUpdater\n                .updateEvents()\n                .subscribe()\n        return Job.Result.SUCCESS\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/UpcomingEventsAdapter.java",
    "content": "package com.alexstyl.specialdates.upcoming;\n\nimport android.support.v7.util.DiffUtil;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.ViewGroup;\n\nimport com.alexstyl.specialdates.upcoming.view.OnUpcomingEventClickedListener;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class UpcomingEventsAdapter extends RecyclerView.Adapter<UpcomingRowViewHolder> {\n\n    private final UpcomingViewHolderFactory viewHolderFactory;\n\n    private final List<UpcomingRowViewModel> viewModels = new ArrayList<>();\n    private final OnUpcomingEventClickedListener listener;\n\n    UpcomingEventsAdapter(UpcomingViewHolderFactory viewHolderFactory, OnUpcomingEventClickedListener listener) {\n        this.viewHolderFactory = viewHolderFactory;\n        this.listener = listener;\n    }\n\n    @Override\n    public UpcomingRowViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        return viewHolderFactory.createFor(viewType, parent);\n    }\n\n    @Override\n    @SuppressWarnings(\"unchecked\")\n    public void onBindViewHolder(UpcomingRowViewHolder holder, int position) {\n        holder.bind(viewModels.get(position), listener);\n    }\n\n    @Override\n    @UpcomingRowViewType\n    public int getItemViewType(int position) {\n        UpcomingRowViewModel viewModel = viewModels.get(position);\n        return viewModel.getViewType();\n    }\n\n    @Override\n    public int getItemCount() {\n        return viewModels.size();\n    }\n\n    void displayUpcomingEvents(List<UpcomingRowViewModel> upcomingEventRows) {\n        UpcomingEventsDiffCallback diffCallback = new UpcomingEventsDiffCallback(viewModels, upcomingEventRows);\n        DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback);\n        this.viewModels.clear();\n        this.viewModels.addAll(upcomingEventRows);\n        diffResult.dispatchUpdatesTo(this);\n    }\n\n    @Override\n    public long getItemId(int position) {\n        return viewModels.get(position).getId();\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/UpcomingEventsDecorator.java",
    "content": "package com.alexstyl.specialdates.upcoming;\n\nimport android.graphics.Rect;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.View;\n\nclass UpcomingEventsDecorator extends RecyclerView.ItemDecoration {\n\n    private final int spacingFromHeaders;\n    private final int itemsInBetweenSpacing;\n\n    UpcomingEventsDecorator(int spacingFromHeaders, int itemsInBetweenSpacing) {\n        this.spacingFromHeaders = spacingFromHeaders;\n        this.itemsInBetweenSpacing = itemsInBetweenSpacing;\n    }\n\n    @Override\n    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {\n        super.getItemOffsets(outRect, view, parent, state);\n        RecyclerView.ViewHolder childViewHolder = parent.getChildViewHolder(view);\n        if (isAHeaderItem(childViewHolder) && isNotFirstItem(childViewHolder)) {\n            outRect.top = spacingFromHeaders;\n        } else {\n            outRect.top = itemsInBetweenSpacing;\n        }\n    }\n\n    private boolean isAHeaderItem(RecyclerView.ViewHolder childViewHolder) {\n        return childViewHolder instanceof DateHeaderViewHolder;\n    }\n\n    private boolean isNotFirstItem(RecyclerView.ViewHolder childViewHolder) {\n        return childViewHolder.getLayoutPosition() != 0;\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/UpcomingEventsDiffCallback.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\nimport android.support.v7.util.DiffUtil\n\nclass UpcomingEventsDiffCallback(private val oldModels: List<UpcomingRowViewModel>,\n                                 private val newModels: List<UpcomingRowViewModel>)\n    : DiffUtil.Callback() {\n\n    override fun getOldListSize(): Int {\n        return oldModels.size\n    }\n\n    override fun getNewListSize(): Int {\n        return newModels.size\n    }\n\n    override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {\n        return oldModels[oldItemPosition].viewType == newModels[newItemPosition].viewType\n                && oldModels[oldItemPosition].id == newModels[newItemPosition].id\n    }\n\n    override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {\n        return oldModels[oldItemPosition] == newModels[newItemPosition]\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/UpcomingEventsFragment.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\nimport android.os.Bundle\nimport android.support.v7.widget.LinearLayoutManager\nimport android.support.v7.widget.RecyclerView\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.FrameLayout\nimport android.widget.ProgressBar\nimport android.widget.TextView\nimport com.alexstyl.specialdates.MementoApplication\nimport com.alexstyl.specialdates.R\nimport com.alexstyl.specialdates.UpcomingEventsView\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.events.peopleevents.UpcomingEventsViewRefresher\nimport com.alexstyl.specialdates.home.HomeNavigator\nimport com.alexstyl.specialdates.images.ImageLoader\nimport com.alexstyl.specialdates.support.AskForSupport\nimport com.alexstyl.specialdates.ui.base.MementoFragment\nimport com.alexstyl.specialdates.upcoming.view.OnUpcomingEventClickedListener\nimport javax.inject.Inject\n\nclass UpcomingEventsFragment : MementoFragment(), UpcomingEventsView {\n\n    lateinit var navigator: HomeNavigator\n        @Inject set\n    lateinit var imageLoader: ImageLoader\n        @Inject set\n    lateinit var refresher: UpcomingEventsViewRefresher\n        @Inject set\n    lateinit var presenter: UpcomingEventsPresenter\n        @Inject set\n    lateinit var askForSupport: AskForSupport\n        @Inject set\n\n    lateinit var mvpView: UpcomingListMVPView\n\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        val applicationModule = (activity!!.application as MementoApplication).applicationModule\n        applicationModule.inject(this)\n        refresher.addEventsView(this)\n    }\n\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {\n        val view = inflater.inflate(R.layout.fragment_upcoming_events, container, false)\n        val root = view.findViewById<FrameLayout>(R.id.root)\n        val progressBar = view.findViewById<ProgressBar>(R.id.upcoming_events_progress)\n        val emptyView = view.findViewById<TextView>(R.id.upcoming_events_emptyview)\n\n        val upcomingList = view.findViewById<RecyclerView>(R.id.upcoming_events_list)\n        upcomingList.setHasFixedSize(true)\n        upcomingList.layoutManager = LinearLayoutManager(activity, LinearLayoutManager.VERTICAL, false)\n        upcomingList.addItemDecoration(\n                UpcomingEventsDecorator(\n                        resources.getDimensionPixelSize(R.dimen.upcoming_event_header_vertical_spacing),\n                        resources.getDimensionPixelSize(R.dimen.upcoming_event_vertical_spacing)\n                ))\n\n        val adapter = UpcomingEventsAdapter(\n                UpcomingViewHolderFactory(inflater, imageLoader),\n                object : OnUpcomingEventClickedListener {\n\n                    override fun onContactClicked(contact: Contact) {\n                        navigator.toContactDetails(contact, activity!!)\n                    }\n\n                    override fun onNamedayClicked(date: Date) {\n                        navigator.toDateDetails(date, activity!!)\n                    }\n                }\n        )\n        adapter.setHasStableIds(true)\n        upcomingList.adapter = adapter\n        mvpView = AndroidUpcomingMVPView(\n                upcomingList, root, progressBar, emptyView, adapter, askForSupport, activity!!)\n\n        return view\n    }\n\n    override fun onResume() {\n        super.onResume()\n        refresher.addEventsView(this)\n    }\n\n    override fun onStart() {\n        super.onStart()\n        presenter.startPresentingInto(mvpView)\n    }\n\n    override fun onPause() {\n        super.onPause()\n        refresher.removeView(this)\n    }\n\n    override fun onStop() {\n        super.onStop()\n        presenter.stopPresenting()\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        refresher.removeView(this)\n    }\n\n    override fun reloadUpcomingEventsView() {\n        presenter.refreshEvents()\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/UpcomingEventsModule.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\nimport android.content.Context\nimport com.alexstyl.resources.Colors\nimport com.alexstyl.specialdates.CrashAndErrorTracker\nimport com.alexstyl.specialdates.EasyPreferences\nimport com.alexstyl.specialdates.JobsCreator\nimport com.alexstyl.specialdates.R\nimport com.alexstyl.specialdates.Strings\nimport com.alexstyl.specialdates.analytics.Analytics\nimport com.alexstyl.specialdates.dailyreminder.DailyReminderNotifier\nimport com.alexstyl.specialdates.dailyreminder.DailyReminderPresenter\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.events.bankholidays.BankHolidayProvider\nimport com.alexstyl.specialdates.events.bankholidays.BankHolidaysUserSettings\nimport com.alexstyl.specialdates.events.bankholidays.GreekBankHolidaysCalculator\nimport com.alexstyl.specialdates.events.namedays.NamedayUserSettings\nimport com.alexstyl.specialdates.events.namedays.calendar.resource.NamedayCalendarProvider\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsProvider\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsUpdater\nimport com.alexstyl.specialdates.facebook.FacebookUserSettings\nimport com.alexstyl.specialdates.home.HomeNavigator\nimport com.alexstyl.specialdates.permissions.MementoPermissions\nimport com.alexstyl.specialdates.support.AskForSupport\nimport com.alexstyl.specialdates.support.CallForRatingPreferences\nimport com.alexstyl.specialdates.theming.AttributeExtractor\nimport dagger.Module\nimport dagger.Provides\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.schedulers.Schedulers\n\n@Module\nclass UpcomingEventsModule {\n\n    @Provides\n    fun upcomingEventsProvider(context: Context,\n                               strings: Strings,\n                               colors: Colors,\n                               namedayUserSettings: NamedayUserSettings,\n                               namedayCalendarProvider: NamedayCalendarProvider,\n                               eventsProvider: PeopleEventsProvider,\n                               bankHolidaysUserSettings: BankHolidaysUserSettings,\n                               greekBankHolidaysCalculator: GreekBankHolidaysCalculator): UpcomingEventsProvider {\n        val date = Date.today()\n        return CompositeUpcomingEventsProvider(\n                eventsProvider,\n                namedayUserSettings,\n                namedayCalendarProvider,\n                bankHolidaysUserSettings,\n                BankHolidayProvider(greekBankHolidaysCalculator),\n                UpcomingEventRowViewModelFactory(\n                        date,\n                        colors,\n                        AndroidUpcomingDateStringCreator(strings, date, context),\n                        ContactViewModelFactory(colors, strings)\n                )\n        )\n    }\n\n    @Provides\n    fun navigator(analytics: Analytics,\n                  strings: Strings,\n                  tracker: CrashAndErrorTracker,\n                  facebookUserSettings: FacebookUserSettings,\n                  extractor: AttributeExtractor): HomeNavigator {\n        return HomeNavigator(analytics, strings, facebookUserSettings, tracker, extractor)\n    }\n\n    @Provides\n    fun jobCreator(updater: PeopleEventsUpdater, presenter: DailyReminderPresenter, notifier: DailyReminderNotifier): JobsCreator {\n        return JobsCreator(updater, presenter, notifier)\n    }\n\n    @Provides\n    fun presenter(permissionsChecker: MementoPermissions, provider: UpcomingEventsProvider): UpcomingEventsPresenter {\n        val today = Date.today()\n        return UpcomingEventsPresenter(\n                today,\n                permissionsChecker,\n                provider,\n                Schedulers.io(),\n                AndroidSchedulers.mainThread()\n        )\n    }\n\n    @Provides\n    fun askForSupport(context: Context): AskForSupport {\n        val privatePreferences = EasyPreferences.createForPrivatePreferences(context, R.string.pref_call_to_rate)\n        val preferences = CallForRatingPreferences(privatePreferences)\n        return AskForSupport(preferences)\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/UpcomingRowViewHolder.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\nimport android.support.v7.widget.RecyclerView\nimport android.view.View\n\nimport com.alexstyl.specialdates.upcoming.view.OnUpcomingEventClickedListener\n\nabstract class UpcomingRowViewHolder<in T : UpcomingRowViewModel>(itemView: View) : RecyclerView.ViewHolder(itemView) {\n\n    abstract fun bind(viewModel: T, listener: OnUpcomingEventClickedListener)\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/UpcomingViewHolderFactory.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport com.alexstyl.specialdates.R\nimport com.alexstyl.specialdates.images.ImageLoader\nimport com.alexstyl.specialdates.ui.widget.ColorImageView\nimport com.novoda.notils.exception.DeveloperError\n\nclass UpcomingViewHolderFactory(private val layoutInflater: LayoutInflater, private val imageLoader: ImageLoader) {\n\n    fun createFor(@UpcomingRowViewType viewType: Int, parent: ViewGroup): UpcomingRowViewHolder<*> {\n        when (viewType) {\n            UpcomingRowViewType.DATE_HEADER -> {\n                val view = layoutInflater.inflate(R.layout.row_upcoming_events_date_header, parent, false)\n                val dateView = view.findViewById<TextView>(R.id.upcoming_event_date_header)\n                return DateHeaderViewHolder(view, dateView)\n            }\n            UpcomingRowViewType.BANKHOLIDAY -> {\n                val view = layoutInflater.inflate(R.layout.row_upcoming_events_bankholiday, parent, false)\n                val holidayName = view.findViewById<TextView>(R.id.row_upcoming_bankholiday)\n                return BankholidayViewHolder(view, holidayName)\n            }\n            UpcomingRowViewType.NAMEDAY_CARD -> {\n                val view = layoutInflater.inflate(R.layout.row_upcoming_events_nameday, parent, false)\n                val namedays = view.findViewById<TextView>(R.id.row_upcoming_namedays)\n                return NamedaysViewHolder(view, namedays)\n            }\n            UpcomingRowViewType.CONTACT_EVENT -> {\n                val view = layoutInflater.inflate(R.layout.row_upcoming_events_contact_event, parent, false)\n                val avatarView = view.findViewById<ColorImageView>(R.id.row_upcoming_event_contact_image)\n                val contactName = view.findViewById<TextView>(R.id.row_upcoming_event_contact_name)\n                val eventLabel = view.findViewById<TextView>(R.id.row_upcoming_event_contact_event)\n                return ContactEventViewHolder(view, avatarView, contactName, eventLabel, imageLoader)\n            }\n            else -> {\n                throw DeveloperError(\"Unhandled viewType [$viewType]\")\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/view/ExposedSearchToolbar.java",
    "content": "package com.alexstyl.specialdates.upcoming.view;\n\nimport android.content.Context;\nimport android.support.v7.widget.Toolbar;\nimport android.util.AttributeSet;\n\nimport com.alexstyl.specialdates.R;\n\npublic class ExposedSearchToolbar extends Toolbar {\n\n    public ExposedSearchToolbar(Context context, AttributeSet attrs) {\n        super(context, attrs);\n\n        setBackgroundResource(R.drawable.card_noshadow);\n        setNavigationIcon(R.drawable.ic_search_black_24dp);\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/view/OnUpcomingEventClickedListener.java",
    "content": "package com.alexstyl.specialdates.upcoming.view;\n\nimport com.alexstyl.specialdates.contact.Contact;\nimport com.alexstyl.specialdates.date.Date;\n\npublic interface OnUpcomingEventClickedListener {\n    void onContactClicked(Contact contact);\n\n    void onNamedayClicked(Date date);\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/widget/RecentUpcomingPeopleEventsModule.kt",
    "content": "package com.alexstyl.specialdates.upcoming.widget\n\nimport android.appwidget.AppWidgetManager\nimport android.content.Context\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsProvider\nimport com.alexstyl.specialdates.images.ImageLoader\nimport com.alexstyl.specialdates.permissions.MementoPermissions\nimport com.alexstyl.specialdates.upcoming.widget.today.LuminanceAnalyzer\nimport com.alexstyl.specialdates.upcoming.widget.today.RecentPeopleEventsPresenter\nimport com.alexstyl.specialdates.upcoming.widget.today.TodayUpcomingEventsView\nimport com.alexstyl.specialdates.upcoming.widget.today.UpcomingWidgetPreferences\nimport com.alexstyl.specialdates.upcoming.widget.today.WidgetImageLoader\nimport dagger.Module\nimport dagger.Provides\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.schedulers.Schedulers\n\n@Module\nclass RecentUpcomingPeopleEventsModule {\n\n    @Provides\n    fun preferences(context: Context): UpcomingWidgetPreferences {\n        return UpcomingWidgetPreferences(context)\n    }\n\n    @Provides\n    fun widgetImageLoader(appWidgetManager: AppWidgetManager, imageLoader: ImageLoader)\n            : WidgetImageLoader {\n        return WidgetImageLoader(appWidgetManager, imageLoader)\n    }\n\n\n    @Provides\n    fun luminanceAnalyzer(): LuminanceAnalyzer {\n        return LuminanceAnalyzer(Schedulers.io(), AndroidSchedulers.mainThread())\n    }\n\n    @Provides\n    fun presenter(eventsProvider: PeopleEventsProvider, permissions: MementoPermissions): RecentPeopleEventsPresenter {\n        return RecentPeopleEventsPresenter(eventsProvider, permissions, Schedulers.trampoline(), Schedulers.trampoline())\n    }\n\n    @Provides\n    fun todayUpcomingEventsView(context: Context, appWidgetManager: AppWidgetManager): TodayUpcomingEventsView {\n        return TodayUpcomingEventsView(context, appWidgetManager)\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/widget/list/BankHolidayBinder.kt",
    "content": "package com.alexstyl.specialdates.upcoming.widget.list\n\nimport android.content.Context\nimport android.widget.RemoteViews\n\nimport com.alexstyl.specialdates.R\nimport com.alexstyl.specialdates.upcoming.BankHolidayViewModel\n\ninternal class BankHolidayBinder(private val views: RemoteViews, private val context: Context) : UpcomingEventViewBinder<BankHolidayViewModel> {\n\n    override fun bind(viewModel: BankHolidayViewModel) {\n        views.setTextViewText(R.id.row_upcoming_bankholiday, viewModel.bankHolidayName)\n\n        val fillInIntent = WidgetRouterActivity.buildIntent(context)\n        views.setOnClickFillInIntent(R.id.widget_row_upcoming_bankholiday_background, fillInIntent)\n    }\n\n    override fun getViews(): RemoteViews = views\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/widget/list/CircularAvatarFactory.java",
    "content": "package com.alexstyl.specialdates.upcoming.widget.list;\n\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapShader;\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.graphics.Paint;\nimport android.graphics.Typeface;\nimport android.support.annotation.Px;\n\nimport com.alexstyl.resources.Colors;\nimport com.alexstyl.specialdates.Optional;\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.contact.Contact;\nimport com.alexstyl.specialdates.contact.DisplayName;\nimport com.alexstyl.specialdates.images.ImageLoader;\n\nimport static android.graphics.Shader.TileMode.CLAMP;\n\nfinal class CircularAvatarFactory {\n\n    private static final String SMILEY_FACE = \":)\";\n    private static final Typeface ROBOTO_LIGHT = Typeface.create(\"sans-serif-light\", Typeface.NORMAL);\n\n    private final ImageLoader imageLoader;\n    private final Colors colors;\n\n    CircularAvatarFactory(ImageLoader imageLoader, Colors colors) {\n        this.imageLoader = imageLoader;\n        this.colors = colors;\n    }\n\n    Optional<Bitmap> circularAvatarFor(Contact contact, @Px int targetSize) {\n        Optional<Bitmap> bitmapOptional = imageLoader\n                .load(contact.getImagePath())\n                .withSize(targetSize, targetSize)\n                .synchronously();\n        if (!bitmapOptional.isPresent()) {\n            return Optional.Companion.absent();\n        }\n\n        Bitmap avatar = bitmapOptional.get();\n        Bitmap circleBitmap = Bitmap.createBitmap(avatar.getWidth(), avatar.getHeight(), Bitmap.Config.ARGB_8888);\n        Canvas canvas = new Canvas(circleBitmap);\n        Paint paint = createPaintFrom(avatar);\n\n        canvas.drawCircle(\n                circleBitmap.getWidth() / 2.0f,\n                circleBitmap.getHeight() / 2.0f,\n                circleBitmap.getWidth() / 2.0f,\n                paint\n        );\n        return new Optional<>(circleBitmap);\n    }\n\n    private Paint createPaintFrom(Bitmap avatar) {\n        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);\n        BitmapShader shader = new BitmapShader(avatar, CLAMP, CLAMP);\n        paint.setShader(shader);\n        return paint;\n    }\n\n    Bitmap createLetterAvatarFor(DisplayName displayName, @Px int viewSize, @Px int letterSize) {\n        Bitmap drawingBitmap = Bitmap.createBitmap(viewSize, viewSize, Bitmap.Config.ARGB_8888);\n        Canvas canvas = new Canvas(drawingBitmap);\n\n        Paint backgroundPaint = createBackgroundPaint();\n        float radius = canvas.getWidth() / 2.0f;\n        canvas.drawCircle(radius, radius, radius, backgroundPaint);\n\n        Paint textPaint = createTextPaint(letterSize);\n        int xPos = canvas.getWidth() / 2;\n        int yPos = (canvas.getHeight() / 2 - ((((int) (textPaint.descent() + textPaint.ascent()))) / 2));\n        canvas.drawText(firstLetterOf(displayName), xPos, yPos, textPaint);\n        return drawingBitmap;\n    }\n\n    private Paint createBackgroundPaint() {\n        Paint backgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);\n        backgroundPaint.setColor(colors.getDailyReminderColor());\n        return backgroundPaint;\n    }\n\n    private static Paint createTextPaint(@Px int letterSize) {\n        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);\n        paint.setColor(Color.WHITE);\n        paint.setTextSize(letterSize);\n        paint.setTypeface(ROBOTO_LIGHT);\n        paint.setTextAlign(Paint.Align.CENTER);\n        return paint;\n    }\n\n    private static String firstLetterOf(DisplayName displayName) {\n        String rawDisplayName = displayName.toString();\n        if (rawDisplayName.length() == 0) {\n            return SMILEY_FACE;\n        }\n        return rawDisplayName.substring(0, 1).toUpperCase();\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/widget/list/ContactEventBinder.kt",
    "content": "package com.alexstyl.specialdates.upcoming.widget.list\n\nimport android.content.Context\nimport android.content.res.Resources\nimport android.graphics.Bitmap\nimport android.support.annotation.Px\nimport android.widget.RemoteViews\nimport com.alexstyl.specialdates.R\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.upcoming.UpcomingContactEventViewModel\n\n\ninternal class ContactEventBinder(private val remoteViews: RemoteViews,\n                                  private val resources: Resources,\n                                  private val context: Context,\n                                  private val avatarFactory: CircularAvatarFactory)\n    : UpcomingEventViewBinder<UpcomingContactEventViewModel> {\n\n    override fun bind(viewModel: UpcomingContactEventViewModel) {\n        remoteViews.setTextViewText(R.id.row_upcoming_event_contact_name, viewModel.contactName)\n        remoteViews.setTextViewText(R.id.row_upcoming_event_contact_event, viewModel.eventLabel)\n        remoteViews.setTextColor(R.id.row_upcoming_event_contact_event, viewModel.eventColor)\n\n        val avatar = createAvatarFor(viewModel.contact)\n        remoteViews.setImageViewBitmap(R.id.row_upcoming_event_contact_image, avatar)\n\n        val fillInIntent = WidgetRouterActivity.buildContactIntent(context, viewModel.contact)\n        remoteViews.setOnClickFillInIntent(R.id.widgetrow_upcoming_contact_event, fillInIntent)\n    }\n\n    private fun createAvatarFor(contact: Contact): Bitmap {\n        @Px val targetSize = resources.getDimensionPixelSize(R.dimen.widget_upcoming_avatar_size)\n        val avatar = avatarFactory.circularAvatarFor(contact, targetSize)\n        return if (avatar.isPresent) {\n            avatar.get()\n        } else {\n            val textSize = resources.getDimensionPixelSize(R.dimen.widget_upcoming_avatar_text_size)\n            avatarFactory.createLetterAvatarFor(contact.displayName, targetSize, textSize)\n        }\n    }\n\n    override fun getViews(): RemoteViews = remoteViews\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/widget/list/DateHeaderBinder.kt",
    "content": "package com.alexstyl.specialdates.upcoming.widget.list\n\nimport android.widget.RemoteViews\n\nimport com.alexstyl.specialdates.R\nimport com.alexstyl.specialdates.upcoming.DateHeaderViewModel\n\nclass DateHeaderBinder(private val views: RemoteViews) : UpcomingEventViewBinder<DateHeaderViewModel> {\n\n    override fun bind(viewModel: DateHeaderViewModel) {\n        views.setTextViewText(R.id.upcoming_event_date_header, viewModel.date)\n    }\n\n    override fun getViews(): RemoteViews = views\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/widget/list/NamedaysBinder.kt",
    "content": "package com.alexstyl.specialdates.upcoming.widget.list\n\nimport android.content.Context\nimport android.widget.RemoteViews\nimport com.alexstyl.specialdates.R\n\nimport com.alexstyl.specialdates.upcoming.UpcomingNamedaysViewModel\n\ninternal class NamedaysBinder(private val views: RemoteViews, private val context: Context) : UpcomingEventViewBinder<UpcomingNamedaysViewModel> {\n\n    override fun bind(viewModelUpcoming: UpcomingNamedaysViewModel) {\n        views.setTextViewText(R.id.row_upcoming_namedays, viewModelUpcoming.namesLabel)\n\n        views.setOnClickFillInIntent(R.id.widget_row_upcoming_nameday_background,\n                WidgetRouterActivity.buildNamedayIntent(viewModelUpcoming.date, context)\n        )\n    }\n\n    override fun getViews(): RemoteViews = views\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/widget/list/UpcomingEventViewBinder.java",
    "content": "package com.alexstyl.specialdates.upcoming.widget.list;\n\nimport android.widget.RemoteViews;\n\nimport com.alexstyl.specialdates.upcoming.UpcomingRowViewModel;\n\ninterface UpcomingEventViewBinder<T extends UpcomingRowViewModel> {\n\n    void bind(T viewModel);\n\n    RemoteViews getViews();\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/widget/list/UpcomingEventsRemoteViewService.java",
    "content": "package com.alexstyl.specialdates.upcoming.widget.list;\n\nimport android.content.Intent;\nimport android.widget.RemoteViewsService;\n\nimport com.alexstyl.resources.Colors;\nimport com.alexstyl.specialdates.AppComponent;\nimport com.alexstyl.specialdates.MementoApplication;\nimport com.alexstyl.specialdates.images.ImageLoader;\nimport com.alexstyl.specialdates.upcoming.UpcomingEventsProvider;\n\nimport javax.inject.Inject;\n\npublic class UpcomingEventsRemoteViewService extends RemoteViewsService {\n\n    @Inject Colors colors;\n    @Inject ImageLoader imageLoader;\n    @Inject UpcomingEventsProvider peopleUpcomingEventsProvider;\n\n    @Override\n    public void onCreate() {\n        super.onCreate();\n        AppComponent applicationModule = ((MementoApplication) getApplication()).getApplicationModule();\n        applicationModule.inject(this);\n    }\n\n    @Override\n    public RemoteViewsFactory onGetViewFactory(Intent intent) {\n        CircularAvatarFactory avatarFactory = new CircularAvatarFactory(\n                imageLoader,\n                colors\n        );\n        return new UpcomingEventsViewsFactory(\n                getPackageName(),\n                peopleUpcomingEventsProvider,\n                this,\n                getResources(),\n                avatarFactory\n        );\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/widget/list/UpcomingEventsScrollingAppWidgetProvider.java",
    "content": "package com.alexstyl.specialdates.upcoming.widget.list;\n\nimport android.app.PendingIntent;\nimport android.appwidget.AppWidgetManager;\nimport android.appwidget.AppWidgetProvider;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.net.Uri;\nimport android.widget.RemoteViews;\n\nimport com.alexstyl.specialdates.AppComponent;\nimport com.alexstyl.specialdates.CrashAndErrorTracker;\nimport com.alexstyl.specialdates.MementoApplication;\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.addevent.AddEventActivity;\nimport com.alexstyl.specialdates.analytics.Analytics;\nimport com.alexstyl.specialdates.analytics.Widget;\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.date.DateLabelCreator;\nimport com.alexstyl.specialdates.home.HomeActivity;\nimport com.alexstyl.specialdates.permissions.MementoPermissions;\n\nimport javax.inject.Inject;\n\npublic class UpcomingEventsScrollingAppWidgetProvider extends AppWidgetProvider {\n    @Inject Analytics analytics;\n    @Inject DateLabelCreator dateLabelCreator;\n    @Inject CrashAndErrorTracker tracker;\n    @Inject MementoPermissions permissionChecker;\n\n    @Override\n    public void onReceive(Context context, Intent intent) {\n        AppComponent applicationModule = ((MementoApplication) context.getApplicationContext()).getApplicationModule();\n        applicationModule.inject(this);\n        super.onReceive(context, intent);\n    }\n\n    @Override\n    public void onEnabled(Context context) {\n        super.onEnabled(context);\n        analytics.trackWidgetAdded(Widget.UPCOMING_EVENTS_SCROLLING);\n    }\n\n    @Override\n    public void onDisabled(Context context) {\n        super.onDisabled(context);\n        analytics.trackWidgetRemoved(Widget.UPCOMING_EVENTS_SCROLLING);\n    }\n\n    @Override\n    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {\n        super.onUpdate(context, appWidgetManager, appWidgetIds);\n\n        if (permissionChecker.canReadAndWriteContacts()) {\n            showUpcomingEvents(context, appWidgetManager, appWidgetIds);\n        } else {\n            askForContactReadPermission(context, appWidgetManager, appWidgetIds);\n        }\n    }\n\n    private void showUpcomingEvents(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {\n        String dateLabel = dateLabelCreator.createWithYearPreferred(Date.Companion.today());\n        for (int appWidgetId : appWidgetIds) {\n            Intent intent = new Intent(context, UpcomingEventsRemoteViewService.class);\n            intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);\n            intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));\n            RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_upcoming_events);\n            remoteViews.setRemoteAdapter(R.id.widget_upcoming_events_list, intent);\n            remoteViews.setTextViewText(R.id.widget_upcoming_events_date, dateLabel);\n            setAddEventClickListener(context, remoteViews);\n            setListClickListener(context, remoteViews);\n            setListHeaderClickListener(context, remoteViews);\n\n            appWidgetManager.updateAppWidget(appWidgetId, remoteViews);\n        }\n    }\n\n    private void setAddEventClickListener(Context context, RemoteViews remoteViews) {\n        Intent intent = AddEventActivity.Companion.buildIntent(context);\n        PendingIntent todayDatePendingIntent = PendingIntent.getActivity(context, 0, intent, 0);\n        remoteViews.setOnClickPendingIntent(R.id.widget_upcoming_events_add_event, todayDatePendingIntent);\n    }\n\n    private void setListHeaderClickListener(Context context, RemoteViews remoteViews) {\n        PendingIntent todayDatePendingIntent = pendingIntentToMain(context);\n        remoteViews.setOnClickPendingIntent(R.id.widget_upcoming_events_date, todayDatePendingIntent);\n    }\n\n    private void setListClickListener(Context context, RemoteViews remoteViews) {\n        Intent clickIntent = WidgetRouterActivity.Companion.buildIntent(context);\n        PendingIntent listPendingIntent = PendingIntent.getActivity(context, 0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT);\n        remoteViews.setPendingIntentTemplate(R.id.widget_upcoming_events_list, listPendingIntent);\n    }\n\n    private PendingIntent pendingIntentToMain(Context context) {\n        Intent clickIntent = new Intent(context, HomeActivity.class);\n        return PendingIntent.getActivity(context, 0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT);\n    }\n\n    private void askForContactReadPermission(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {\n        for (int appWidgetId : appWidgetIds) {\n            RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_prompt_permissions);\n            remoteViews.setOnClickPendingIntent(R.id.widget_prompt_permission_background, pendingIntentToMain(context));\n            appWidgetManager.updateAppWidget(appWidgetId, remoteViews);\n        }\n\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/widget/list/UpcomingEventsScrollingWidgetView.java",
    "content": "package com.alexstyl.specialdates.upcoming.widget.list;\n\nimport android.appwidget.AppWidgetManager;\nimport android.content.ComponentName;\nimport android.content.Context;\nimport android.content.Intent;\n\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.UpcomingEventsView;\n\npublic class UpcomingEventsScrollingWidgetView implements UpcomingEventsView {\n\n    private final AppWidgetManager widgetManager;\n    private final Context context;\n\n    public UpcomingEventsScrollingWidgetView(Context context, AppWidgetManager widgetManager) {\n        this.widgetManager = widgetManager;\n        this.context = context;\n    }\n\n    @Override\n    public void reloadUpcomingEventsView() {\n        Intent intent = new Intent(context, UpcomingEventsScrollingAppWidgetProvider.class);\n        intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);\n\n        int[] ids = widgetManager.getAppWidgetIds(\n                new ComponentName(context, UpcomingEventsScrollingAppWidgetProvider.class)\n        );\n\n        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids);\n        widgetManager.notifyAppWidgetViewDataChanged(ids, R.id.widget_upcoming_events_list);\n\n        context.sendBroadcast(intent);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/widget/list/UpcomingEventsViewsFactory.java",
    "content": "package com.alexstyl.specialdates.upcoming.widget.list;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport android.content.res.Resources;\nimport android.widget.RemoteViews;\nimport android.widget.RemoteViewsService;\n\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.date.TimePeriod;\nimport com.alexstyl.specialdates.upcoming.UpcomingEventsProvider;\nimport com.alexstyl.specialdates.upcoming.UpcomingRowViewModel;\nimport com.alexstyl.specialdates.upcoming.UpcomingRowViewType;\n\nimport java.util.List;\n\nclass UpcomingEventsViewsFactory implements RemoteViewsService.RemoteViewsFactory {\n\n    private static final int VIEW_TYPE_COUNT = 3;\n    private static final int DAYS_IN_A_MONTH = 30;\n    private final String packageName;\n    private final UpcomingEventsProvider upcomingEventsProvider;\n    private final Resources resources;\n    private final CircularAvatarFactory avatarFactory;\n    private final Context context;\n\n    private List<UpcomingRowViewModel> rows;\n\n    UpcomingEventsViewsFactory(String packageName,\n                               UpcomingEventsProvider upcomingEventsProvider,\n                               Context context, Resources resources,\n                               CircularAvatarFactory avatarFactory) {\n        this.packageName = packageName;\n        this.context = context;\n        this.resources = resources;\n        this.upcomingEventsProvider = upcomingEventsProvider;\n        this.avatarFactory = avatarFactory;\n    }\n\n    @Override\n    public void onCreate() {\n        // do nothing\n    }\n\n    @Override\n    public void onDataSetChanged() {\n        Date date = Date.Companion.today();\n        rows = upcomingEventsProvider.calculateEventsBetween(aMonthFrom(date));\n    }\n\n    private TimePeriod aMonthFrom(Date date) {\n        return TimePeriod.Companion.between(date, date.addDay(DAYS_IN_A_MONTH));\n    }\n\n    @Override\n    public RemoteViews getViewAt(int position) {\n        UpcomingRowViewModel viewModel = rows.get(position);\n        UpcomingEventViewBinder binder = createBinderFor(viewModel);\n        binder.bind(viewModel);\n        return binder.getViews();\n    }\n\n    @SuppressLint(\"SwitchIntDef\")\n    private UpcomingEventViewBinder createBinderFor(UpcomingRowViewModel viewModel) {\n        switch (viewModel.getViewType()) {\n            case UpcomingRowViewType.DATE_HEADER: {\n                RemoteViews view = new RemoteViews(packageName, R.layout.widget_upcoming_events_list_date);\n                return new DateHeaderBinder(view);\n            }\n            case UpcomingRowViewType.BANKHOLIDAY: {\n                RemoteViews view = new RemoteViews(packageName, R.layout.widget_upcomingevents_list_bankholiday);\n                return new BankHolidayBinder(view, context);\n            }\n            case UpcomingRowViewType.NAMEDAY_CARD: {\n                RemoteViews view = new RemoteViews(packageName, R.layout.widget_upcoming_events_list_nameday);\n                return new NamedaysBinder(view, context);\n            }\n            case UpcomingRowViewType.CONTACT_EVENT: {\n                RemoteViews remoteViews = new RemoteViews(packageName, R.layout.widget_upcoming_events_list_contact_event);\n                return new ContactEventBinder(remoteViews, resources, context, avatarFactory);\n            }\n            default:\n                throw new IllegalStateException(\"Unhandled type \" + viewModel.getViewType());\n        }\n    }\n\n    @Override\n    public RemoteViews getLoadingView() {\n        return null; // use the default loading view by returning null\n    }\n\n    @Override\n    public int getCount() {\n        return rows.size();\n    }\n\n    @Override\n    public int getViewTypeCount() {\n        return VIEW_TYPE_COUNT;\n    }\n\n    @Override\n    public long getItemId(int position) {\n        return position;\n    }\n\n    @Override\n    public boolean hasStableIds() {\n        return true;\n    }\n\n    @Override\n    public void onDestroy() {\n        // do nothing\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/widget/list/WidgetRouterActivity.kt",
    "content": "package com.alexstyl.specialdates.upcoming.widget.list\n\nimport android.app.Activity\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport com.alexstyl.specialdates.MementoApplication\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.contact.ContactsProvider\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.getDateExtraOrThrow\nimport com.alexstyl.specialdates.date.putExtraDate\nimport com.alexstyl.specialdates.events.namedays.activity.NamedaysOnADayActivity\nimport com.alexstyl.specialdates.home.HomeActivity\nimport com.alexstyl.specialdates.person.PersonActivity\nimport javax.inject.Inject\n\nprivate val ACTION_VIEW_NAMEDAY = \"action:view_nameday\"\nprivate val ACTION_VIEW_CONTACT = \"action:view_contact\"\nprivate val EXTRA_CNTACT_ID = \"extra:contact_id\"\nprivate val EXTRA_CONTACT_SOURCE = \"extra:contact_source\"\n\nclass WidgetRouterActivity : Activity() {\n\n\n    @Inject lateinit var contactsProvider: ContactsProvider\n\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        val applicationModule = (application as MementoApplication).applicationModule\n        applicationModule.inject(this)\n\n        val startIntent = routeIntent(intent, this)\n        startActivity(startIntent)\n        finish()\n    }\n\n    companion object {\n        fun buildIntent(context: Context): Intent = Intent(context, WidgetRouterActivity::class.java)\n\n        fun buildContactIntent(context: Context, contact: Contact): Intent =\n                Intent(context, WidgetRouterActivity::class.java)\n                        .apply {\n                            action = ACTION_VIEW_CONTACT\n                            putExtra(EXTRA_CNTACT_ID, contact.contactID)\n                            putExtra(EXTRA_CONTACT_SOURCE, contact.source)\n                        }\n\n\n        fun buildNamedayIntent(date: Date, context: Context): Intent =\n\n                Intent(context, WidgetRouterActivity::class.java)\n                        .apply {\n                            action = ACTION_VIEW_NAMEDAY\n                            putExtraDate(date)\n                        }\n    }\n\n    fun routeIntent(intent: Intent, context: Context): Intent = when (intent.action) {\n        ACTION_VIEW_CONTACT -> PersonActivity.buildIntentFor(context, intent.contact())\n        ACTION_VIEW_NAMEDAY -> NamedaysOnADayActivity.getStartIntent(context, intent.getDateExtraOrThrow())\n        else -> {\n            HomeActivity.getStartIntent(this)\n        }\n    }\n\n    private fun Intent.contact(): Contact {\n        val contactId = getLongExtra(EXTRA_CNTACT_ID, -1)\n        val source = getIntExtra(EXTRA_CONTACT_SOURCE, -1)\n        return contactsProvider.getContact(contactId, source)\n    }\n\n}\n\n\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/widget/today/AndroidRecentPeopleEventsView.kt",
    "content": "package com.alexstyl.specialdates.upcoming.widget.today\n\nimport android.app.PendingIntent\nimport android.appwidget.AppWidgetManager\nimport android.content.Context\nimport android.content.Intent\nimport android.net.Uri\nimport android.widget.RemoteViews\nimport com.alexstyl.specialdates.R\nimport com.alexstyl.specialdates.Strings\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.DateLabelCreator\nimport com.alexstyl.specialdates.events.peopleevents.ContactEventsOnADate\nimport com.alexstyl.specialdates.home.HomeActivity\nimport com.alexstyl.specialdates.person.PersonActivity\nimport com.alexstyl.specialdates.util.NaturalLanguageUtils\n\nclass AndroidRecentPeopleEventsView(private val context: Context,\n                                    private val appWidgetManager: AppWidgetManager,\n                                    private val appWidgetIds: IntArray,\n                                    private val strings: Strings,\n                                    private val preferences: UpcomingWidgetPreferences,\n                                    private val widgetImageLoader: WidgetImageLoader,\n                                    private val labelCreator: DateLabelCreator)\n    : RecentPeopleEventsView {\n\n    override fun onNextDateLoaded(events: ContactEventsOnADate) {\n        val eventDate = events.date\n        val date = Date.on(eventDate.dayOfMonth, eventDate.month, Date.today().year)\n        val intent = HomeActivity.getStartIntent(context)\n        intent.data = Uri.parse(date.hashCode().toString())\n\n        val contacts = events.contacts\n        val pendingIntent = pendingIntentFor(context, intent, contacts)\n        val title = labelOf(date)\n\n        val label = NaturalLanguageUtils.joinContacts(strings, events.contacts, 2)\n\n        val selectedVariant = preferences.selectedVariant\n        val transparencyColorCalculator = TransparencyColorCalculator()\n        val opacity = preferences.oppacityLevel\n        val selectedTextColor = context.resources.getColor(selectedVariant.textColor)\n\n        val calculator = WidgetColorCalculator(selectedTextColor)\n        val finalHeaderColor = calculator.getColor(Date.today(), date)\n        val avatarSizeInPx = context.resources.getDimensionPixelSize(R.dimen.widget_avatar_size)\n        for (appWidgetId in appWidgetIds) {\n            // Get the layout for the App Widget and attach an on-click listener\n            // to the button\n            val remoteViews = RemoteViews(context.packageName, R.layout.widget_today)\n\n            remoteViews.setTextViewText(R.id.upcoming_widget_header, title)\n            remoteViews.setTextViewText(R.id.upcoming_widget_events_text, label)\n\n            remoteViews.setTextColor(R.id.upcoming_widget_events_text, selectedTextColor)\n            remoteViews.setTextColor(R.id.upcoming_widget_header, finalHeaderColor)\n\n            val background = context.resources.getColor(selectedVariant.backgroundColorResId)\n            val backgroundColor = transparencyColorCalculator.calculateColor(background, opacity)\n            remoteViews.setInt(R.id.upcoming_widget_background_image, \"setBackgroundColor\", backgroundColor)\n\n            remoteViews.setOnClickPendingIntent(R.id.upcoming_widget_background, pendingIntent)\n            appWidgetManager.updateAppWidget(appWidgetId, remoteViews)\n\n            widgetImageLoader.loadPicture(events.contacts, appWidgetId, remoteViews, avatarSizeInPx)\n        }\n    }\n\n    override fun onNoEventsFound() {\n        appWidgetIds.forEach { appWidgetId ->\n\n            val views = RemoteViews(context.packageName, R.layout.widget_today_nocontacts)\n            val intent = Intent(context, HomeActivity::class.java)\n            val pendingIntent = PendingIntent.getActivity(\n                    context, 0, intent,\n                    PendingIntent.FLAG_UPDATE_CURRENT\n            )\n\n            views.setTextViewText(android.R.id.text1, context.getString(R.string.today_widget_empty))\n            views.setOnClickPendingIntent(R.id.upcoming_widget_background, pendingIntent)\n\n            appWidgetManager.updateAppWidget(appWidgetId, views)\n        }\n    }\n\n    private fun pendingIntentFor(context: Context, intent: Intent, contacts: List<Contact>): PendingIntent {\n        return if (contacts.size == 1) {\n            val pendingIntent = PersonActivity.buildIntentFor(context, contacts[0])\n            PendingIntent.getActivity(context, 0, pendingIntent, PendingIntent.FLAG_UPDATE_CURRENT)\n        } else {\n            PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)\n        }\n    }\n\n    private fun labelOf(todayDate: Date): String {\n        return labelCreator.createWithYearPreferred(todayDate)\n    }\n\n    override fun askForContactPermission() {\n        val remoteViews = RemoteViews(context.packageName, R.layout.widget_prompt_permissions)\n        remoteViews.setOnClickPendingIntent(R.id.widget_prompt_permission_background, pendingIntentToMain(context))\n        appWidgetManager.updateAppWidget(appWidgetIds, remoteViews)\n    }\n\n    private fun pendingIntentToMain(context: Context): PendingIntent {\n        val clickIntent = Intent(context, HomeActivity::class.java)\n        return PendingIntent.getActivity(context, 0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT)\n    }\n\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/widget/today/LuminanceAnalyzer.kt",
    "content": "package com.alexstyl.specialdates.upcoming.widget.today\n\nimport android.graphics.Bitmap\nimport android.graphics.Color\nimport android.graphics.drawable.Drawable\nimport com.alexstyl.android.toBitmap\nimport io.reactivex.Observable\nimport io.reactivex.Scheduler\n\nclass LuminanceAnalyzer(private val workScheduler: Scheduler, private val resultScheduler: Scheduler) {\n\n    fun analyse(drawable: Drawable, result: (Boolean) -> Unit) {\n        Observable.fromCallable {\n            isLight(drawable.toBitmap())\n        }\n                .subscribeOn(workScheduler)\n                .observeOn(resultScheduler)\n                .subscribe {\n                    result(it)\n                }\n    }\n\n    private fun isLight(bitmap: Bitmap): Boolean {\n        val darkThreshold = bitmap.width.toFloat() * bitmap.height.toFloat() * 0.90f\n        var lightPixels = 0\n\n        val pixels = IntArray(bitmap.width * bitmap.height)\n        bitmap.getPixels(pixels, 0, bitmap.width, 0, 0, bitmap.width, bitmap.height)\n\n        for (pixel in pixels) {\n            val r = Color.red(pixel)\n            val g = Color.green(pixel)\n            val b = Color.blue(pixel)\n            val luminance = 0.299 * r + 0.0 + 0.587 * g + 0.0 + 0.114 * b + 0.0\n            if (luminance > 150) {\n                lightPixels++\n            }\n        }\n\n        return lightPixels >= darkThreshold\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/widget/today/SimpleOnSeekBarChangeListener.java",
    "content": "package com.alexstyl.specialdates.upcoming.widget.today;\n\nimport android.widget.SeekBar;\n\nclass SimpleOnSeekBarChangeListener implements SeekBar.OnSeekBarChangeListener {\n\n    @Override\n    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {\n        // no-op\n    }\n\n    @Override\n    public void onStartTrackingTouch(SeekBar seekBar) {\n        // no-op\n    }\n\n    @Override\n    public void onStopTrackingTouch(SeekBar seekBar) {\n        // no-op\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/widget/today/TodayAppWidgetProvider.kt",
    "content": "package com.alexstyl.specialdates.upcoming.widget.today\n\nimport android.appwidget.AppWidgetManager\nimport android.appwidget.AppWidgetProvider\nimport android.content.Context\nimport android.content.Intent\nimport com.alexstyl.specialdates.MementoApplication\nimport com.alexstyl.specialdates.Strings\nimport com.alexstyl.specialdates.analytics.Analytics\nimport com.alexstyl.specialdates.analytics.Widget\nimport com.alexstyl.specialdates.date.DateLabelCreator\nimport javax.inject.Inject\n\nclass TodayAppWidgetProvider : AppWidgetProvider() {\n\n    lateinit var preferences: UpcomingWidgetPreferences\n        @Inject set\n    lateinit var widgetImageLoader: WidgetImageLoader\n        @Inject set\n    lateinit var strings: Strings\n        @Inject set\n    lateinit var labelCreator: DateLabelCreator\n        @Inject set\n    lateinit var analytics: Analytics\n        @Inject set\n    lateinit var presenter: RecentPeopleEventsPresenter\n        @Inject set\n\n    override fun onReceive(context: Context, intent: Intent) {\n        val applicationModule = (context.applicationContext as MementoApplication).applicationModule\n        applicationModule.inject(this)\n        super.onReceive(context, intent)\n    }\n\n    override fun onEnabled(context: Context) {\n        super.onEnabled(context)\n        analytics.trackWidgetAdded(Widget.UPCOMING_EVENTS_SIMPLE)\n\n    }\n\n    override fun onDisabled(context: Context) {\n        super.onDisabled(context)\n        analytics.trackWidgetRemoved(Widget.UPCOMING_EVENTS_SIMPLE)\n    }\n\n    override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) {\n        super.onUpdate(context, appWidgetManager, appWidgetIds)\n\n        val view = AndroidRecentPeopleEventsView(context,\n                appWidgetManager,\n                appWidgetIds,\n                strings,\n                preferences,\n                widgetImageLoader,\n                labelCreator\n        )\n        presenter.startPresentingInto(view)\n        presenter.stopPresenting()\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/widget/today/TodayUpcomingEventsView.java",
    "content": "package com.alexstyl.specialdates.upcoming.widget.today;\n\nimport android.appwidget.AppWidgetManager;\nimport android.content.ComponentName;\nimport android.content.Context;\nimport android.content.Intent;\n\nimport com.alexstyl.specialdates.UpcomingEventsView;\n\npublic class TodayUpcomingEventsView implements UpcomingEventsView {\n\n    private final Context context;\n    private final AppWidgetManager instance;\n\n    public TodayUpcomingEventsView(Context context, AppWidgetManager instance) {\n        this.context = context;\n        this.instance = instance;\n    }\n\n    @Override\n    public void reloadUpcomingEventsView() {\n        Intent intent = new Intent(context, TodayAppWidgetProvider.class);\n        intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);\n\n        int[] ids = instance.getAppWidgetIds(new ComponentName(context, TodayAppWidgetProvider.class));\n        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids);\n        context.sendBroadcast(intent);\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/widget/today/TransparencyColorCalculator.java",
    "content": "package com.alexstyl.specialdates.upcoming.widget.today;\n\nimport android.support.annotation.ColorInt;\nimport android.support.annotation.FloatRange;\nimport android.support.v4.graphics.ColorUtils;\n\nfinal class TransparencyColorCalculator {\n\n    private static final int FULL_ALPHA = 255;\n\n    @ColorInt\n    int calculateColor(@ColorInt int color, @FloatRange(from = 0.0f, to = 1.0f) float opacityPercentage) {\n        return ColorUtils.setAlphaComponent(color, percentToValue(opacityPercentage));\n    }\n\n    private static int percentToValue(float opacity) {\n        return (int) (opacity * FULL_ALPHA);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/widget/today/UpcomingWidgetConfigurationPanel.java",
    "content": "package com.alexstyl.specialdates.upcoming.widget.today;\n\nimport android.content.Context;\nimport android.support.constraint.ConstraintLayout;\nimport android.support.v7.widget.SwitchCompat;\nimport android.util.AttributeSet;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.widget.Button;\nimport android.widget.CompoundButton;\nimport android.widget.SeekBar;\n\nimport com.alexstyl.specialdates.R;\nimport com.novoda.notils.caster.Views;\nimport com.novoda.notils.logger.simple.Log;\n\npublic class UpcomingWidgetConfigurationPanel extends ConstraintLayout {\n\n    private final SeekBar seekbar;\n    private final PercentToValueConverter valueConverter = new PercentToValueConverter();\n    private ConfigurationListener listener = ConfigurationListener.NO_OP;\n\n    private final SwitchCompat darkThemeSwitch;\n\n    public UpcomingWidgetConfigurationPanel(Context context, AttributeSet attrs) {\n        super(context, attrs);\n\n        LayoutInflater.from(context).inflate(R.layout.merge_upcoming_widget_configure_panel, this, true);\n\n        seekbar = Views.findById(this, R.id.upcoming_widget_opacity);\n        seekbar.setOnSeekBarChangeListener(new SimpleOnSeekBarChangeListener() {\n\n            @Override\n            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {\n                float percentage = valueConverter.progressToPercent(progress);\n                setOpacityLevel(percentage);\n                listener.onOpacityLevelChanged(percentage);\n            }\n        });\n\n        darkThemeSwitch = Views.findById(this, R.id.upcoming_widget_dark_theme);\n        darkThemeSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {\n            @Override\n            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {\n                WidgetVariant selectedVariant = (isChecked ? WidgetVariant.DARK : WidgetVariant.LIGHT);\n                setWidgetVariant(selectedVariant);\n                listener.onWidgetVariantSelected(selectedVariant);\n            }\n        });\n\n        Button applyButton = Views.findById(this, R.id.upcoming_widget_apply);\n        applyButton.setOnClickListener(new OnClickListener() {\n            @Override\n            public void onClick(View view) {\n                listener.onApplyButtonPressed();\n            }\n        });\n    }\n\n    public void setOpacityLevel(float percentage) {\n        int progress = valueConverter.percentToProgress(percentage);\n        seekbar.setProgress(progress);\n    }\n\n    public float getOpacityLevel() {\n        int opacityProgress = seekbar.getProgress();\n        return valueConverter.progressToPercent(opacityProgress);\n    }\n\n    public WidgetVariant getWidgetVariant() {\n        return darkThemeSwitch.isChecked() ? WidgetVariant.DARK : WidgetVariant.LIGHT;\n    }\n\n    public void setWidgetVariant(WidgetVariant variant) {\n        darkThemeSwitch.setChecked(variant == WidgetVariant.DARK);\n    }\n\n    public UserOptions getUserOptions() {\n        float opacityLevel = getOpacityLevel();\n        WidgetVariant widgetVariant = getWidgetVariant();\n        return new UserOptions(opacityLevel, widgetVariant);\n    }\n\n    public void setListener(ConfigurationListener listener) {\n        this.listener = listener;\n    }\n\n    interface ConfigurationListener {\n\n        ConfigurationListener NO_OP = new ConfigurationListener() {\n            @Override\n            public void onOpacityLevelChanged(float percentage) {\n                Log.w(\"onOpacityLevelChanged with no listener set\");\n\n            }\n\n            @Override\n            public void onWidgetVariantSelected(WidgetVariant variant) {\n                Log.w(\"onWidgetVariantSelected with no listener set\");\n            }\n\n            @Override\n            public void onApplyButtonPressed() {\n                Log.w(\"onApplyButtonPressed with no listener set\");\n            }\n        };\n\n        void onOpacityLevelChanged(float percentage);\n\n        void onWidgetVariantSelected(WidgetVariant variant);\n\n        void onApplyButtonPressed();\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/widget/today/UpcomingWidgetConfigureActivity.kt",
    "content": "package com.alexstyl.specialdates.upcoming.widget.today\n\nimport android.animation.Animator\nimport android.annotation.TargetApi\nimport android.app.Activity\nimport android.app.WallpaperManager\nimport android.appwidget.AppWidgetManager\nimport android.content.Intent\nimport android.graphics.Color\nimport android.os.Build\nimport android.os.Bundle\nimport android.support.constraint.ConstraintLayout\nimport android.support.constraint.ConstraintSet\nimport android.support.transition.ChangeBounds\nimport android.support.transition.TransitionManager\nimport android.support.v4.content.res.ResourcesCompat\nimport android.support.v7.widget.TooltipCompat\nimport android.view.View\nimport android.view.animation.AccelerateInterpolator\nimport android.view.animation.AnticipateOvershootInterpolator\nimport android.widget.ImageButton\nimport android.widget.ImageView\nimport android.widget.LinearLayout\nimport android.widget.TextView\nimport com.alexstyl.android.SimpleAnimatorListener\nimport com.alexstyl.android.Version\nimport com.alexstyl.specialdates.MementoApplication\nimport com.alexstyl.specialdates.R\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.DateLabelCreator\nimport com.alexstyl.specialdates.permissions.MementoPermissions\nimport com.alexstyl.specialdates.ui.base.MementoActivity\nimport javax.inject.Inject\n\nclass UpcomingWidgetConfigureActivity : MementoActivity() {\n\n    lateinit var luminanceAnalyzer: LuminanceAnalyzer\n        @Inject set\n    lateinit var preferences: UpcomingWidgetPreferences\n        @Inject set\n    lateinit var labelCreator: DateLabelCreator\n        @Inject set\n    lateinit var todayUpcomingEventsView: TodayUpcomingEventsView\n        @Inject set\n    lateinit var permission: MementoPermissions\n        @Inject set\n\n    private lateinit var previewLayout: UpcomingWidgetPreviewLayout\n    private lateinit var configurationPanel: UpcomingWidgetConfigurationPanel\n    private lateinit var scrimView: ImageView\n    private lateinit var closeButton: ImageButton\n    private lateinit var titleView: TextView\n    private lateinit var constraintLayout: ConstraintLayout\n\n    private var mAppWidgetId: Int? = null\n    private val enterConstraintSet = ConstraintSet()\n    private val exitConstraintSet = ConstraintSet()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        val applicationModule = (application as MementoApplication).applicationModule\n        applicationModule.inject(this)\n        setResult(Activity.RESULT_CANCELED)\n        setContentView(R.layout.activity_upcoming_events_widget_configure__start)\n\n        mAppWidgetId = extractAppWidgetIdFrom(intent)\n\n        decorateStatusBarOrHide()\n        previewLayout = findViewById(R.id.upcoming_widget_preview)\n        configurationPanel = findViewById(R.id.upcoming_widget_configure_panel)\n        titleView = findViewById(R.id.upcoming_widget_title)\n        closeButton = findViewById(R.id.upcoming_widget_close)\n        scrimView = findViewById(R.id.scrim)\n        constraintLayout = findViewById(R.id.upcoming_widget_constraint)\n\n        enterConstraintSet.clone(this, R.layout.activity_upcoming_events_widget_configure__first_frame)\n        exitConstraintSet.clone(this, R.layout.activity_upcoming_events_widget_configure__start)\n\n        introduceViews()\n\n        initialiseViews()\n        if (permission.canReadExternalStorage()) {\n            displayWallpaper()\n        }\n    }\n\n    private fun introduceViews() {\n        constraintLayout.postDelayed({\n            val transition = ChangeBounds()\n            transition.interpolator = AnticipateOvershootInterpolator(1.0f)\n            transition.duration = resources.getInteger(android.R.integer.config_longAnimTime).toLong()\n\n            TransitionManager.beginDelayedTransition(constraintLayout, transition)\n            enterConstraintSet.applyTo(constraintLayout)\n        }, 450L)\n\n        previewLayout.alpha = 0f\n        previewLayout\n                .animate()\n                .setStartDelay(200L)\n                .alpha(1f)\n                .setDuration(400L)\n                .start()\n    }\n\n\n    @TargetApi(Build.VERSION_CODES.M)\n    private fun initialiseViews() {\n        configurationPanel.setListener(object : UpcomingWidgetConfigurationPanel.ConfigurationListener {\n            override fun onApplyButtonPressed() {\n                preferences.storeUserOptions(configurationPanel.userOptions)\n                todayUpcomingEventsView.reloadUpcomingEventsView()\n\n                if (mAppWidgetId != null) {\n                    val intent = Intent()\n                            .putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId!!)\n                    setResult(Activity.RESULT_OK, intent)\n                }\n                animatedFinish()\n            }\n\n            override fun onOpacityLevelChanged(percentage: Float) {\n                previewLayout.previewBackgroundOpacityLevel(percentage)\n            }\n\n            override fun onWidgetVariantSelected(variant: WidgetVariant) {\n                previewLayout.previewWidgetVariant(variant)\n            }\n        })\n\n        initialisePreview()\n        TooltipCompat.setTooltipText(closeButton, getString(R.string.Close))\n        closeButton.setOnClickListener {\n            animatedFinish()\n        }\n    }\n\n    override fun onBackPressed() {\n        animatedFinish()\n    }\n\n    private fun animatedFinish() {\n        val transition = ChangeBounds()\n        transition.interpolator = AccelerateInterpolator(1.0F)\n        transition.duration = resources.getInteger(android.R.integer.config_shortAnimTime).toLong()\n        TransitionManager.beginDelayedTransition(constraintLayout, transition)\n        exitConstraintSet.applyTo(constraintLayout)\n\n        previewLayout.animate()\n                .alpha(0F)\n                .setStartDelay(400L)\n                .setListener(object : SimpleAnimatorListener() {\n                    override fun onAnimationEnd(animator: Animator?) {\n                        finish()\n                    }\n                })\n                .start()\n    }\n\n    private fun displayWallpaper() {\n        val wallpaper = WallpaperManager.getInstance(this).drawable\n        luminanceAnalyzer.analyse(wallpaper, { isLight ->\n            if (isLight) {\n                loadDarkUI()\n            } else {\n                loadLightUI()\n            }\n        })\n    }\n\n    private fun decorateStatusBarOrHide() {\n        if (supportsTransparentStatusbar()) {\n            window.decorView.systemUiVisibility =\n                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE or\n                    View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN\n            window.statusBarColor = Color.TRANSPARENT\n        } else {\n            val toolbar = findViewById<LinearLayout>(R.id.upcoming_widget_virtual_toolbar)\n            val params = toolbar.layoutParams as ConstraintLayout.LayoutParams\n            params.setMargins(0, 0, 0, 0)\n            toolbar.layoutParams = params\n        }\n    }\n\n    private fun extractAppWidgetIdFrom(intent: Intent?): Int? {\n        return intent?.extras?.getInt(\n                AppWidgetManager.EXTRA_APPWIDGET_ID,\n                AppWidgetManager.INVALID_APPWIDGET_ID\n        )\n    }\n\n    private fun initialisePreview() {\n        configurationPanel.opacityLevel = preferences.oppacityLevel\n        configurationPanel.widgetVariant = preferences.selectedVariant\n    }\n\n    override fun onStart() {\n        super.onStart()\n\n        val title = labelCreator.createWithYearPreferred(Date.today())\n        previewLayout.setTitle(title)\n        previewLayout.setSubtitle(R.string.demo_contact_name)\n\n        val variant = preferences.selectedVariant\n        previewLayout.previewWidgetVariant(variant)\n\n        val oppacityLevel = preferences.oppacityLevel\n        previewLayout.previewBackgroundOpacityLevel(oppacityLevel)\n    }\n\n    private fun loadLightUI() {\n        scrimView.visibility = View.VISIBLE\n\n        titleView.setTextColor(Color.WHITE)\n        closeButton.setImageResource(R.drawable.ic_close_white)\n        if (supportsTransparentStatusbar()) {\n            window.decorView.systemUiVisibility =\n                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE or\n                    View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN\n            window.statusBarColor = Color.TRANSPARENT\n        }\n    }\n\n    private fun loadDarkUI() {\n        scrimView.visibility = View.GONE\n\n        titleView.setTextColor(ResourcesCompat.getColor(resources, R.color.dark_text, null))\n        closeButton.setImageResource(R.drawable.ic_close_black)\n        if (supportsTransparentStatusbar()) {\n            window.decorView.systemUiVisibility =\n                    View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR or\n                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE or\n                    View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN\n            window.statusBarColor = Color.TRANSPARENT\n        }\n    }\n\n    companion object {\n        private fun supportsTransparentStatusbar() = Version.hasMarshmallow()\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/widget/today/UpcomingWidgetPreferences.kt",
    "content": "package com.alexstyl.specialdates.upcoming.widget.today\n\nimport android.content.Context\nimport android.content.SharedPreferences\n\nimport com.alexstyl.specialdates.EasyPreferences\nimport com.alexstyl.specialdates.R\n\nclass UpcomingWidgetPreferences(context: Context) {\n\n    private val preferences: EasyPreferences =\n            EasyPreferences.createForPrivatePreferences(context, R.string.pref_upcoming_widget_config)\n\n    val selectedVariant: WidgetVariant\n        get() {\n            val variantId = preferences.getInt(R.string.key_upcoming_widget_variant, DEFAULT_VARIANT_ID)\n            return WidgetVariant.fromId(variantId)\n        }\n\n    val oppacityLevel: Float\n        get() = preferences.getFloat(R.string.key_upcoming_widget_opacity, DEFAULT_OPACITY)\n\n    fun storeUserOptions(userOptions: UserOptions) {\n        preferences.setFloat(R.string.key_upcoming_widget_opacity, userOptions.opacityLevel)\n        preferences.setInteger(R.string.key_upcoming_widget_variant, userOptions.widgetVariant.id)\n    }\n\n    fun addListener(listener: SharedPreferences.OnSharedPreferenceChangeListener) {\n        preferences.addOnPreferenceChangedListener(listener)\n    }\n\n    fun removeListener(listener: SharedPreferences.OnSharedPreferenceChangeListener) {\n        preferences.removeOnPreferenceChagnedListener(listener)\n    }\n\n    companion object {\n\n        private val DEFAULT_VARIANT_ID = WidgetVariant.LIGHT.id\n        private val DEFAULT_OPACITY = 1.0f\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/widget/today/UpcomingWidgetPreviewLayout.java",
    "content": "package com.alexstyl.specialdates.upcoming.widget.today;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport android.graphics.Color;\nimport android.support.annotation.ColorRes;\nimport android.support.annotation.StringRes;\nimport android.util.AttributeSet;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.widget.FrameLayout;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport com.alexstyl.specialdates.R;\nimport com.novoda.notils.caster.Views;\n\npublic class UpcomingWidgetPreviewLayout extends FrameLayout {\n\n    private static final TransparencyColorCalculator COLOR_CALCULATOR = new TransparencyColorCalculator();\n\n    private final View background;\n    private final TextView header;\n    private final TextView contactNames;\n\n    private WidgetVariant selectedVariant = WidgetVariant.LIGHT;\n    private float opacityLevel = 1.0f;\n\n    @SuppressLint(\"SetTextI18n\")\n    public UpcomingWidgetPreviewLayout(Context context, AttributeSet attrs) {\n        super(context, attrs);\n\n        LayoutInflater.from(context).inflate(R.layout.merge_upcoming_widget_preview, this, true);\n\n        this.header = Views.findById(this, R.id.upcoming_widget_header);\n        this.header.setTextColor(Color.RED);\n        this.contactNames = Views.findById(this, R.id.upcoming_widget_events_text);\n        ImageView avatar = Views.findById(this, R.id.widget_avatar);\n        avatar.setImageDrawable(getResources().getDrawable(R.drawable.ic_contact_portrait));\n        this.background = Views.findById(this, R.id.upcoming_widget_background_image);\n\n\n        if (isInEditMode()) {\n            header.setText(\"This is a Header\");\n            contactNames.setText(\"This is names\");\n        }\n    }\n\n    public void previewWidgetVariant(WidgetVariant variant) {\n        selectedVariant = variant;\n        setTextColor(variant.getTextColor());\n        updateBackgroundColor();\n    }\n\n    private void updateBackgroundColor() {\n        int color = getResources().getColor(selectedVariant.getBackgroundColorResId());\n        int newBackgroundColor = COLOR_CALCULATOR.calculateColor(color, opacityLevel);\n        background.setBackgroundColor(newBackgroundColor);\n    }\n\n    public void previewBackgroundOpacityLevel(float opacityLevel) {\n        this.opacityLevel = opacityLevel;\n        updateBackgroundColor();\n    }\n\n    private void setTextColor(@ColorRes int textColorRes) {\n        int textColor = getResources().getColor(textColorRes);\n        contactNames.setTextColor(textColor);\n    }\n\n    public void setTitle(String title) {\n        header.setText(title);\n    }\n\n    public void setSubtitle(@StringRes int stringResId) {\n        String subtitle = getResources().getString(stringResId);\n        contactNames.setText(subtitle);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/widget/today/UserOptions.kt",
    "content": "package com.alexstyl.specialdates.upcoming.widget.today\n\ndata class UserOptions(val opacityLevel: Float, val widgetVariant: WidgetVariant)\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/widget/today/WidgetColorCalculator.java",
    "content": "package com.alexstyl.specialdates.upcoming.widget.today;\n\nimport android.graphics.Color;\nimport android.support.annotation.ColorInt;\n\nimport com.alexstyl.specialdates.date.Date;\n\nclass WidgetColorCalculator {\n\n    private static final int MODIFIER = 15;\n    private static final double MAX = 100.00;\n    @ColorInt\n    private static final int HIGHLIGHT_COLOR = Color.RED;\n    private static final int DAYS_THRESHOLD = 3;\n    private static final int ONE_DAY = 1;\n\n    @ColorInt\n    private final int baseColor;\n\n    WidgetColorCalculator(int baseColor) {\n        this.baseColor = baseColor;\n    }\n\n    public int getColor(Date today, Date nextEvent) {\n\n        int dayDiff = today.daysDifferenceTo(nextEvent);\n        if (dayDiff <= DAYS_THRESHOLD) {\n            return getColorForDaysDifference(dayDiff);\n        }\n        return baseColor;\n    }\n\n    private int getColorForDaysDifference(int dayDiff) {\n        float modifier = getModifier(dayDiff);\n        return blend(baseColor, HIGHLIGHT_COLOR, modifier);\n    }\n\n    private float getModifier(int dif) {\n        return (float) ((MAX - (dif + ONE_DAY) * MODIFIER) / MAX);\n    }\n\n    @SuppressWarnings({\"MagicNumber\", \"LocalVariableName\"}) // disable checkstyle checks due to the loaded of magic stuff happening\n    private static int blend(@ColorInt int background, @ColorInt int foreground, float ratio) {\n        if (ratio > 1f) {\n            ratio = 1f;\n        } else if (ratio < 0f) {\n            ratio = 0f;\n        }\n        float iRatio = 1.0f - ratio;\n\n        int aA = (background >> 24 & 0xff);\n        int aR = ((background & 0xff0000) >> 16);\n        int aG = ((background & 0xff00) >> 8);\n        int aB = (background & 0xff);\n\n        int bA = (foreground >> 24 & 0xff);\n        int bR = ((foreground & 0xff0000) >> 16);\n        int bG = ((foreground & 0xff00) >> 8);\n        int bB = (foreground & 0xff);\n\n        int A = (int) ((aA * iRatio) + (bA * ratio));\n        int R = (int) ((aR * iRatio) + (bR * ratio));\n        int G = (int) ((aG * iRatio) + (bG * ratio));\n        int B = (int) ((aB * iRatio) + (bB * ratio));\n\n        return A << 24 | R << 16 | G << 8 | B;\n    }\n    //Check:ON\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/widget/today/WidgetImageLoader.java",
    "content": "package com.alexstyl.specialdates.upcoming.widget.today;\n\nimport android.appwidget.AppWidgetManager;\nimport android.graphics.Bitmap;\nimport android.support.annotation.Px;\nimport android.widget.RemoteViews;\n\nimport com.alexstyl.android.widget.AppWidgetId;\nimport com.alexstyl.specialdates.R;\nimport com.alexstyl.specialdates.contact.Contact;\nimport com.alexstyl.specialdates.images.ImageLoader;\nimport com.alexstyl.specialdates.images.SimpleImageLoadedConsumer;\n\nimport java.util.List;\n\npublic class WidgetImageLoader {\n\n    private final AppWidgetManager appWidgetManager;\n    private final ImageLoader imageLoader;\n\n    public WidgetImageLoader(AppWidgetManager appWidgetManager, ImageLoader imageLoader) {\n        this.appWidgetManager = appWidgetManager;\n        this.imageLoader = imageLoader;\n    }\n\n    void loadPicture(List<Contact> contacts, final int appWidgetId, final RemoteViews views, @Px int size) {\n        tryToFetchImageFor(contacts, 0, appWidgetId, views, size);\n    }\n\n    private void tryToFetchImageFor(final List<Contact> contacts,\n                                    final int contactIndex,\n                                    @AppWidgetId final int appWidgetId,\n                                    final RemoteViews views,\n                                    @Px final int size) {\n        if (contacts.size() == 0) {\n            return; //TODO temp fix. Don't merge this\n        }\n        imageLoader\n                .load(contacts.get(contactIndex).getImagePath())\n                .withSize(size, size)\n                .into(new SimpleImageLoadedConsumer() {\n\n                    @Override\n                    public void onLoadingFailed() {\n                        handleImageNotLoaded();\n                    }\n\n                    private void handleImageNotLoaded() {\n                        int contactSize = contacts.size();\n                        if (contactIndex + 1 < contactSize) {\n                            tryToFetchImageFor(contacts, contactIndex + 1, appWidgetId, views, size);\n                        } else {\n                            // no more pictures to load\n                            views.setImageViewResource(R.id.widget_avatar, R.drawable.ic_contact_picture);\n                            appWidgetManager.updateAppWidget(appWidgetId, views);\n                        }\n                    }\n\n                    @Override\n                    public void onImageLoaded(Bitmap loadedImage) {\n                        if (loadedImage == null) {\n                            handleImageNotLoaded();\n                        } else {\n                            views.setImageViewBitmap(R.id.widget_avatar, loadedImage);\n                            appWidgetManager.updateAppWidget(appWidgetId, views);\n                        }\n                    }\n                });\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/upcoming/widget/today/WidgetVariant.java",
    "content": "package com.alexstyl.specialdates.upcoming.widget.today;\n\nimport android.support.annotation.ColorRes;\n\nimport com.alexstyl.specialdates.R;\nimport com.novoda.notils.exception.DeveloperError;\n\npublic enum WidgetVariant {\n    LIGHT(1, R.color.upcoming_widget_light_textcolor, R.color.upcoming_widget_light_background),\n    DARK(0, R.color.upcoming_widget_dark_textcolor, R.color.upcoming_widget_dark_background);\n\n    private final int id;\n    @ColorRes\n    private final int textColor;\n    @ColorRes\n    private int backgroundColorResId;\n\n    public static WidgetVariant fromId(int variantId) {\n        for (WidgetVariant widgetVariant : values()) {\n            if (widgetVariant.id == variantId) {\n                return widgetVariant;\n            }\n        }\n        throw new DeveloperError(\"No Widget Variant with id [%d]\", variantId);\n    }\n\n    WidgetVariant(int id, @ColorRes int textColor, @ColorRes int backgroundColorResId) {\n        this.id = id;\n        this.textColor = textColor;\n        this.backgroundColorResId = backgroundColorResId;\n    }\n\n    public int getId() {\n        return id;\n    }\n\n    @ColorRes\n    public int getTextColor() {\n        return textColor;\n    }\n\n    @ColorRes\n    public int getBackgroundColorResId() {\n        return backgroundColorResId;\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/util/GreekNameUtils.java",
    "content": "package com.alexstyl.specialdates.util;\n\nimport android.content.Context;\n\nimport com.alexstyl.specialdates.R;\n\nimport java.text.Normalizer;\n\npublic final class GreekNameUtils {\n\n    private GreekNameUtils() {\n        // hide this\n    }\n\n    public static boolean isGreekLocaleSelected(Context context) {\n        return context.getResources().getBoolean(R.bool.isGreekLocaleSelected);\n    }\n\n    public static String removeAccents(CharSequence title) {\n        String decomposed = Normalizer.normalize(title, Normalizer.Form.NFD);\n        return decomposed.replaceAll(\"\\\\p{InCombiningDiacriticalMarks}+\", \"\");\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/util/NaturalLanguageUtils.java",
    "content": "package com.alexstyl.specialdates.util;\n\nimport com.alexstyl.specialdates.Strings;\nimport com.alexstyl.specialdates.contact.Contact;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.List;\n\npublic final class NaturalLanguageUtils {\n\n    private NaturalLanguageUtils() {\n        // hide this\n    }\n\n    public static String joinContacts(Strings strings, Collection<Contact> iterable, int displayNo) {\n        int size = iterable.size();\n        if (size == 1) {\n            return iterable.iterator().next().getDisplayName().toString();\n        }\n\n        ArrayList<String> names = new ArrayList<>(size);\n        for (Contact contact : iterable) {\n            names.add(contact.getGivenName());\n        }\n        return join(strings, names, displayNo);\n    }\n\n    private static String join(Strings strings, List<String> iterable, int displayNo) {\n        if (iterable == null || iterable.size() == 0) {\n            return \"\";\n        }\n\n        int size = iterable.size();\n        if (size == 1) {\n            return iterable.get(0);\n        } else if (size == 2) {\n            return strings.todayCelebrateTwo(iterable.get(0), iterable.get(1));\n        }\n        if (size < displayNo) {\n            // set a cap of the number of items in the array\n            displayNo = size;\n        }\n\n        StringBuilder str = new StringBuilder();\n        int hasShown = 0;\n        int toShow = displayNo - 1;\n        if (toShow < 1) {\n            toShow = 1;\n        }\n        for (int i = 0; i < toShow; i++) {\n            if (str.length() != 0) {\n                str.append(\", \");\n            }\n            str.append(iterable.get(i));\n            hasShown++;\n        }\n\n        int remaining = size - hasShown;\n        if (remaining == 1) {\n            // only one left\n            return strings.todayCelebrateTwo(str.toString(), iterable.get(size - 1));\n        } else {\n            return strings.todayCelebrateMany(str.toString(), remaining);\n        }\n\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/wear/WearSyncService.java",
    "content": "package com.alexstyl.specialdates.wear;\n\nimport android.app.IntentService;\nimport android.content.Intent;\n\nimport com.alexstyl.specialdates.AppComponent;\nimport com.alexstyl.specialdates.CrashAndErrorTracker;\nimport com.alexstyl.specialdates.MementoApplication;\nimport com.alexstyl.specialdates.Optional;\nimport com.alexstyl.specialdates.contact.Contact;\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.events.namedays.NamedayUserSettings;\nimport com.alexstyl.specialdates.events.peopleevents.ContactEventsOnADate;\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsProvider;\nimport com.alexstyl.specialdates.permissions.MementoPermissions;\nimport com.google.android.gms.common.api.GoogleApiClient;\nimport com.google.android.gms.wearable.PutDataMapRequest;\nimport com.google.android.gms.wearable.PutDataRequest;\nimport com.google.android.gms.wearable.Wearable;\n\nimport javax.inject.Inject;\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class WearSyncService extends IntentService {\n\n    @Inject NamedayUserSettings namedayUserSettings;\n    @Inject PeopleEventsProvider peopleEventsProvider;\n    @Inject CrashAndErrorTracker tracker;\n    @Inject MementoPermissions permissions;\n\n    public WearSyncService() {\n        super(WearSyncService.class.getSimpleName());\n    }\n\n    @Override\n    public void onCreate() {\n        super.onCreate();\n        AppComponent applicationModule = ((MementoApplication) getApplication())\n                .getApplicationModule();\n        applicationModule.inject(this);\n    }\n\n    @Override\n    protected void onHandleIntent(Intent intent) {\n        if (!permissions.canReadAndWriteContacts()) {\n            return;\n        }\n        Optional<ContactEventsOnADate> eventsOptional = fetchContactEvents();\n        if (eventsOptional.isPresent()) {\n            ContactEventsOnADate contactEvents = eventsOptional.get();\n            PutDataRequest putDataRequest = createDataRequest(contactEvents);\n            GoogleApiClient googleApiClient = new GoogleApiClient.Builder(getApplicationContext())\n                    .addApi(Wearable.API)\n                    .build();\n\n            if (googleApiClient.blockingConnect().isSuccess()) {\n                Wearable.DataApi.putDataItem(googleApiClient, putDataRequest);\n            }\n        }\n    }\n\n    private Optional<ContactEventsOnADate> fetchContactEvents() {\n        Date closestDate = peopleEventsProvider.findClosestEventDateOnOrAfter(Date.Companion.today());\n        if (closestDate != null) {\n            return new Optional<>(peopleEventsProvider.fetchEventsOn(closestDate));\n        } else {\n            return Optional.Companion.absent();\n        }\n    }\n\n    private PutDataRequest createDataRequest(ContactEventsOnADate contactEvents) {\n        PutDataMapRequest putDataMapRequest = PutDataMapRequest.create(SharedConstants.NEXT_CONTACT_EVENTS_PATH);\n        putDataMapRequest.getDataMap().putStringArrayList(SharedConstants.KEY_CONTACTS_NAMES, getContactsNameListFrom(contactEvents.getContacts()));\n        putDataMapRequest.getDataMap().putLong(SharedConstants.KEY_DATE, contactEvents.getDate().toMillis());\n        return putDataMapRequest.asPutDataRequest();\n    }\n\n    private ArrayList<String> getContactsNameListFrom(List<Contact> contacts) {\n        ArrayList<String> namesList = new ArrayList<>(contacts.size());\n        for (Contact contact : contacts) {\n            namesList.add(contact.getDisplayName().toString());\n        }\n        return namesList;\n    }\n\n}\n"
  },
  {
    "path": "android_mobile/src/main/java/com/alexstyl/specialdates/wear/WearSyncUpcomingEventsView.java",
    "content": "package com.alexstyl.specialdates.wear;\n\nimport android.content.Context;\nimport android.content.Intent;\n\nimport com.alexstyl.specialdates.UpcomingEventsView;\n\npublic class WearSyncUpcomingEventsView implements UpcomingEventsView {\n\n    private final Context context;\n\n    public WearSyncUpcomingEventsView(Context context) {\n        this.context = context;\n    }\n\n    @Override\n    public void reloadUpcomingEventsView() {\n        Intent service = new Intent(context, WearSyncService.class);\n        context.startService(service);\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/main/res/anim/bounce.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n  <scale\n    android:duration=\"700\"\n    android:fromXScale=\"0.3\"\n    android:toXScale=\"1.0\"\n    android:fromYScale=\"0.3\"\n    android:toYScale=\"1.0\"\n    android:pivotX=\"50%\"\n    android:pivotY=\"50%\" />\n</set>\n"
  },
  {
    "path": "android_mobile/src/main/res/anim/grow_from_bottom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <scale\n        android:fromXScale=\"0.3\" android:toXScale=\"1.0\"\n        android:fromYScale=\"0.3\" android:toYScale=\"1.0\"\n        android:pivotX=\"50%\" android:pivotY=\"100%\"\n        android:duration=\"@android:integer/config_shortAnimTime\"\n        />\n    <alpha\n        android:interpolator=\"@android:anim/decelerate_interpolator\"\n        android:fromAlpha=\"0.0\" android:toAlpha=\"1.0\"\n        android:duration=\"@android:integer/config_shortAnimTime\"\n        />\n</set>"
  },
  {
    "path": "android_mobile/src/main/res/anim/grow_from_top.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <scale\n        android:fromXScale=\"0.3\" android:toXScale=\"1.0\"\n        android:fromYScale=\"0.3\" android:toYScale=\"1.0\"\n        android:pivotX=\"50%\" android:pivotY=\"0%\"\n        android:duration=\"@android:integer/config_shortAnimTime\"\n        />\n    <alpha\n        android:interpolator=\"@android:anim/decelerate_interpolator\"\n        android:fromAlpha=\"0.0\" android:toAlpha=\"1.0\"\n        android:duration=\"@android:integer/config_shortAnimTime\"\n        />\n</set>"
  },
  {
    "path": "android_mobile/src/main/res/anim/heartbeat.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<scale xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:duration=\"760\"\n  android:fromXScale=\"0.6\"\n  android:fromYScale=\"0.6\"\n  android:pivotX=\"50%\"\n  android:pivotY=\"50%\"\n  android:repeatCount=\"infinite\"\n  android:repeatMode=\"reverse\"\n  android:toXScale=\"1\"\n  android:toYScale=\"1\" />\n"
  },
  {
    "path": "android_mobile/src/main/res/anim/slide_in_below.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n\n    <translate\n        android:fromYDelta=\"50%p\"\n        android:toYDelta=\"0\"\n        android:duration=\"@android:integer/config_mediumAnimTime\" />\n\n    <alpha\n        android:fromAlpha=\"0.0\"\n        android:toAlpha=\"1.0\"\n        android:duration=\"@android:integer/config_longAnimTime\" />\n</set>"
  },
  {
    "path": "android_mobile/src/main/res/anim/slide_in_from_above.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n\n    <!--<scale-->\n\n        <!--android:fromYScale=\"0.3\" android:toYScale=\"1.0\"-->\n        <!--android:pivotX=\"50%\" android:pivotY=\"0%\"-->\n        <!--android:duration=\"@android:integer/config_longAnimTime\"-->\n        <!--/>-->\n\n    <!--<alpha-->\n        <!--android:interpolator=\"@android:anim/decelerate_interpolator\"-->\n        <!--android:fromAlpha=\"0.0\" android:toAlpha=\"1.0\"-->\n        <!--android:duration=\"@android:integer/config_shortAnimTime\"-->\n        <!--/>-->\n\n\n    <translate\n        android:duration=\"@android:integer/config_longAnimTime\"\n        android:fromYDelta=\"-50%\"\n        android:interpolator=\"@android:anim/decelerate_interpolator\"\n        android:toYDelta=\"0%\" />\n\n\n</set>"
  },
  {
    "path": "android_mobile/src/main/res/anim/slide_in_from_below.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<translate xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:duration=\"@android:integer/config_mediumAnimTime\"\n  android:fromYDelta=\"100%\"\n  android:interpolator=\"@android:anim/accelerate_decelerate_interpolator\"\n  android:toYDelta=\"0\" />\n"
  },
  {
    "path": "android_mobile/src/main/res/anim/slide_out_above.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <translate\n        android:fromYDelta=\"0\"\n        android:toYDelta=\"-50%p\"\n        android:duration=\"@android:integer/config_longAnimTime\" />\n    <alpha\n        android:fromAlpha=\"1.0\"\n        android:toAlpha=\"0.0\"\n        android:duration=\"@android:integer/config_shortAnimTime\" />\n</set>"
  },
  {
    "path": "android_mobile/src/main/res/anim/slide_out_from_above.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <translate\n        android:duration=\"@android:integer/config_mediumAnimTime\"\n        android:fromYDelta=\"0%\"\n        android:interpolator=\"@android:anim/decelerate_interpolator\"\n        android:toYDelta=\"-100%\" />\n\n</set>"
  },
  {
    "path": "android_mobile/src/main/res/anim/slide_out_from_below.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<translate xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:duration=\"300\"\n  android:fromYDelta=\"0%p\"\n  android:interpolator=\"@android:anim/accelerate_interpolator\"\n  android:toYDelta=\"110%p\" />\n"
  },
  {
    "path": "android_mobile/src/main/res/anim/slide_up_left.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:interpolator=\"@android:anim/accelerate_interpolator\" >\n\n    <translate\n        android:duration=\"@integer/config_slide_time\"\n        android:fromYDelta=\"100%p\"\n        android:toYDelta=\"0\" />\n\n    <alpha\n        android:duration=\"@integer/config_slide_time\"\n        android:fromAlpha=\"0.0\"\n        android:toAlpha=\"1.0\" />\n\n    <rotate\n        android:duration=\"@integer/config_slide_time\"\n        android:fromDegrees=\"25\"\n        android:pivotX=\"0\"\n        android:pivotY=\"0\"\n        android:toDegrees=\"0\" />\n\n</set>"
  },
  {
    "path": "android_mobile/src/main/res/anim/slide_up_right.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:interpolator=\"@android:anim/accelerate_interpolator\" >\n\n    <translate\n        android:duration=\"@integer/config_slide_time\"\n        android:fromYDelta=\"100%p\"\n        android:toYDelta=\"0\" />\n\n    <alpha\n        android:duration=\"@integer/config_slide_time\"\n        android:fromAlpha=\"0.0\"\n        android:toAlpha=\"1.0\" />\n\n    <rotate\n        android:duration=\"@integer/config_slide_time\"\n        android:fromDegrees=\"-25\"\n        android:pivotX=\"100%\"\n        android:pivotY=\"0\"\n        android:toDegrees=\"0\" />\n\n</set>"
  },
  {
    "path": "android_mobile/src/main/res/anim/stay.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<translate xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:duration=\"@android:integer/config_longAnimTime\"\n  android:fromYDelta=\"0%p\"\n  android:toYDelta=\"0%p\" />\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ab_background_textured_dayslight.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- File created by the Android Action Bar Style Generator\n\n     Copyright (C) 2012 readyState Software Ltd\n\n     Licensed under the Apache License, Version 2.0 (the \"License\");\n     you may not use this file except in compliance with the License.\n     You may obtain a copy of the License at\n  \n          http://www.apache.org/licenses/LICENSE-2.0\n  \n     Unless required by applicable law or agreed to in writing, software\n     distributed under the License is distributed on an \"AS IS\" BASIS,\n     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n     See the License for the specific language governing permissions and\n     limitations under the License.\n-->\n\n<bitmap xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:src=\"@drawable/ab_texture_tile_dayslight\"\n    android:tileMode=\"repeat\" />"
  },
  {
    "path": "android_mobile/src/main/res/drawable/background_daymarker.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"oval\">\n    <solid android:color=\"@color/birthday_red\" />\n</shape>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/background_suggestions.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n\n    <solid android:color=\"@color/light_grey\" />\n\n\n    <stroke\n        android:width=\"1px\"\n        android:color=\"@color/divider_grey\" />\n\n</shape>"
  },
  {
    "path": "android_mobile/src/main/res/drawable/black_to_transparent_gradient_facing_down.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n  <gradient\n    android:angle=\"90\"\n    android:endColor=\"#5a000000\"\n    android:startColor=\"@android:color/transparent\" />\n</shape>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/btn_cab_done_dayslight.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- File created by the Android Action Bar Style Generator\n\n     Copyright (C) 2011 The Android Open Source Project\n     Copyright (C) 2012 readyState Software Ltd\n\n     Licensed under the Apache License, Version 2.0 (the \"License\");\n     you may not use this file except in compliance with the License.\n     You may obtain a copy of the License at\n  \n          http://www.apache.org/licenses/LICENSE-2.0\n  \n     Unless required by applicable law or agreed to in writing, software\n     distributed under the License is distributed on an \"AS IS\" BASIS,\n     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n     See the License for the specific language governing permissions and\n     limitations under the License.\n-->\n\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_pressed=\"true\"\n        android:drawable=\"@drawable/btn_cab_done_pressed_dayslight\" />\n    <item android:state_focused=\"true\" android:state_enabled=\"true\"\n        android:drawable=\"@drawable/btn_cab_done_focused_dayslight\" />\n    <item android:state_enabled=\"true\"\n        android:drawable=\"@drawable/btn_cab_done_default_dayslight\" />\n</selector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/card_noshadow.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n  <corners android:radius=\"@dimen/card_corner_radius\" />\n\n  <solid android:color=\"@android:color/white\" />\n</shape>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/dayslight_progress_horizontal_holo_light.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Copyright (C) 2010 The Android Open Source Project\n\n     Licensed under the Apache License, Version 2.0 (the \"License\");\n     you may not use this file except in compliance with the License.\n     You may obtain a copy of the License at\n\n          http://www.apache.org/licenses/LICENSE-2.0\n\n     Unless required by applicable law or agreed to in writing, software\n     distributed under the License is distributed on an \"AS IS\" BASIS,\n     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n     See the License for the specific language governing permissions and\n     limitations under the License.\n-->\n\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item android:id=\"@android:id/background\"\n          android:drawable=\"@drawable/dayslight_progress_bg_holo_light\" />\n\n    <item android:id=\"@android:id/secondaryProgress\">\n        <scale android:scaleWidth=\"100%\"\n               android:drawable=\"@drawable/dayslight_progress_secondary_holo_light\" />\n    </item>\n\n    <item android:id=\"@android:id/progress\">\n        <scale android:scaleWidth=\"100%\"\n               android:drawable=\"@drawable/dayslight_progress_primary_holo_light\" />\n    </item>\n\n</layer-list>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/dayslight_progress_indeterminate_horizontal_holo_light.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n/*\n** Copyright 2011, The Android Open Source Project\n**\n** Licensed under the Apache License, Version 2.0 (the \"License\"); \n** you may not use this file except in compliance with the License. \n** You may obtain a copy of the License at \n**\n**     http://www.apache.org/licenses/LICENSE-2.0 \n**\n** Unless required by applicable law or agreed to in writing, software \n** distributed under the License is distributed on an \"AS IS\" BASIS, \n** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. \n** See the License for the specific language governing permissions and \n** limitations under the License.\n*/\n-->\n<animation-list\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:oneshot=\"false\">\n    <item android:drawable=\"@drawable/dayslight_progressbar_indeterminate_holo1\" android:duration=\"50\" />\n    <item android:drawable=\"@drawable/dayslight_progressbar_indeterminate_holo2\" android:duration=\"50\" />\n    <item android:drawable=\"@drawable/dayslight_progressbar_indeterminate_holo3\" android:duration=\"50\" />\n    <item android:drawable=\"@drawable/dayslight_progressbar_indeterminate_holo4\" android:duration=\"50\" />\n    <item android:drawable=\"@drawable/dayslight_progressbar_indeterminate_holo5\" android:duration=\"50\" />\n    <item android:drawable=\"@drawable/dayslight_progressbar_indeterminate_holo6\" android:duration=\"50\" />\n    <item android:drawable=\"@drawable/dayslight_progressbar_indeterminate_holo7\" android:duration=\"50\" />\n    <item android:drawable=\"@drawable/dayslight_progressbar_indeterminate_holo8\" android:duration=\"50\" />\n</animation-list>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/divider_top_horizontal.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><!-- inset is used to remove border from top, it can remove border from any other side-->\n<inset xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:insetBottom=\"-1dp\"\n  android:insetLeft=\"-1dp\"\n  android:insetRight=\"-1dp\">\n\n  <shape>\n    <stroke\n      android:width=\"1dp\"\n      android:color=\"@color/divider_grey\" />\n  </shape>\n</inset>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_add_contact_42px.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:width=\"42dp\"\n  android:height=\"42dp\"\n  android:viewportHeight=\"42.0\"\n  android:viewportWidth=\"42.0\">\n  <path\n    android:fillColor=\"#ED6666\"\n    android:fillType=\"evenOdd\"\n    android:pathData=\"M21,21m-21,0a21,21 0,1 1,42 0a21,21 0,1 1,-42 0\"\n    android:strokeColor=\"#00000000\"\n    android:strokeWidth=\"1\" />\n  <path\n    android:fillColor=\"#FFFFFF\"\n    android:fillType=\"nonZero\"\n    android:pathData=\"M24,21C26.21,21 28,19.21 28,17C28,14.79 26.21,13 24,13C21.79,13 20,14.79 20,17C20,19.21 21.79,21 24,21ZM15,19L15,16L13,16L13,19L10,19L10,21L13,21L13,24L15,24L15,21L18,21L18,19L15,19ZM24,23C21.33,23 16,24.34 16,27L16,29L32,29L32,27C32,24.34 26.67,23 24,23Z\"\n    android:strokeColor=\"#00000000\"\n    android:strokeWidth=\"1\" />\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_add_person_24px.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M15,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM6,10L6,7L4,7v3L1,10v2h3v3h2v-3h3v-2L6,10zM15,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z\"/>\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_arrow_back_white_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FFf\"\n        android:pathData=\"M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z\"/>\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_bankholidays.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:width=\"48dp\"\n  android:height=\"48dp\"\n  android:viewportHeight=\"24.0\"\n  android:viewportWidth=\"24.0\">\n  <path\n    android:fillColor=\"#fff\"\n    android:pathData=\"M20,15.31L23.31,12 20,8.69V4h-4.69L12,0.69 8.69,4H4v4.69L0.69,12 4,15.31V20h4.69L12,23.31 15.31,20H20v-4.69zM12,18c-3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6 6,2.69 6,6 -2.69,6 -6,6z\" />\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_bankholidays_disabled.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:width=\"48dp\"\n  android:height=\"48dp\"\n  android:viewportHeight=\"24.0\"\n  android:viewportWidth=\"24.0\">\n  <path\n    android:fillColor=\"#484848\"\n    android:pathData=\"M20,15.31L23.31,12 20,8.69V4h-4.69L12,0.69 8.69,4H4v4.69L0.69,12 4,15.31V20h4.69L12,23.31 15.31,20H20v-4.69zM12,18c-3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6 6,2.69 6,6 -2.69,6 -6,6z\" />\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_call.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:pathData=\"M6.62,10.79C8.06,13.62 10.38,15.93 13.21,17.38L15.41,15.18C15.68,14.91 16.08,14.82 16.43,14.94C17.55,15.31 18.76,15.51 20,15.51C20.55,15.51 21,15.96 21,16.51L21,20C21,20.55 20.55,21 20,21C10.61,21 3,13.39 3,4C3,3.45 3.45,3 4,3L7.5,3C8.05,3 8.5,3.45 8.5,4C8.5,5.25 8.7,6.45 9.07,7.57C9.18,7.92 9.1,8.31 8.82,8.59L6.62,10.79Z\"\n        android:strokeColor=\"#00000000\"\n        android:fillColor=\"#FFFFFF\"\n        android:strokeWidth=\"1\"/>\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_camera.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M12,12m-3.2,0a3.2,3.2 0,1 1,6.4 0a3.2,3.2 0,1 1,-6.4 0\"/>\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M9,2L7.17,4L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2h-3.17L15,2L9,2zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5z\"/>\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_check_white.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z\"/>\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_clear.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z\"/>\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_close_black.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportHeight=\"24.0\"\n    android:viewportWidth=\"24.0\">\n    <path\n        android:fillColor=\"#414141\"\n        android:pathData=\"M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z\" />\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_close_white.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z\"/>\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_contacts.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M9,11.75c-0.69,0 -1.25,0.56 -1.25,1.25s0.56,1.25 1.25,1.25 1.25,-0.56 1.25,-1.25 -0.56,-1.25 -1.25,-1.25zM15,11.75c-0.69,0 -1.25,0.56 -1.25,1.25s0.56,1.25 1.25,1.25 1.25,-0.56 1.25,-1.25 -0.56,-1.25 -1.25,-1.25zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8 0,-0.29 0.02,-0.58 0.05,-0.86 2.36,-1.05 4.23,-2.98 5.21,-5.37C11.07,8.33 14.05,10 17.42,10c0.78,0 1.53,-0.09 2.25,-0.26 0.21,0.71 0.33,1.47 0.33,2.26 0,4.41 -3.59,8 -8,8z\"/>\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_contacts_disabled.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:width=\"48dp\"\n  android:height=\"48dp\"\n  android:viewportHeight=\"24.0\"\n  android:viewportWidth=\"24.0\">\n  <path\n    android:fillColor=\"#484848\"\n    android:pathData=\"M20,0L4,0v2h16L20,0zM4,24h16v-2L4,22v2zM20,4L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM12,6.75c1.24,0 2.25,1.01 2.25,2.25s-1.01,2.25 -2.25,2.25S9.75,10.24 9.75,9 10.76,6.75 12,6.75zM17,17L7,17v-1.5c0,-1.67 3.33,-2.5 5,-2.5s5,0.83 5,2.5L17,17z\" />\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_donate.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z\"/>\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_events.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M19,3h-1L18,1h-2v2L8,3L8,1L6,1v2L5,3c-1.11,0 -1.99,0.9 -1.99,2L3,19c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM19,19L5,19L5,8h14v11zM7,10h5v5L7,15z\"/>\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_f_icon.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"266.895\"\n    android:viewportWidth=\"266.893\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#3C5A99\" android:pathData=\"M248.08,262.31c7.85,0 14.22,-6.37 14.22,-14.23V18.81c0,-7.86 -6.37,-14.22 -14.22,-14.22H18.81c-7.86,0 -14.22,6.37 -14.22,14.22v229.27c0,7.86 6.37,14.23 14.22,14.23H248.08z\"/>\n    <path android:fillColor=\"#FFFFFF\" android:pathData=\"M182.41,262.31v-99.8h33.5l5.02,-38.9h-38.51V98.78c0,-11.26 3.13,-18.93 19.27,-18.93l20.6,-0.01V45.04c-3.56,-0.47 -15.79,-1.53 -30.01,-1.53c-29.69,0 -50.03,18.13 -50.03,51.41v28.68h-33.58v38.9h33.58v99.8H182.41z\"/>\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_facebook_import_friends.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"42dp\"\n    android:height=\"42dp\"\n    android:viewportHeight=\"42.0\"\n    android:viewportWidth=\"42.0\">\n    <path\n        android:fillColor=\"#5773AE\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M21,21m-21,0a21,21 0,1 1,42 0a21,21 0,1 1,-42 0\"\n        android:strokeColor=\"#00000000\"\n        android:strokeWidth=\"1\" />\n    <path\n        android:fillColor=\"#FEFEFE\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M23.39,33.25L23.39,22.07L27.26,22.07L27.84,17.72L23.39,17.72L23.39,14.94C23.39,13.68 23.76,12.82 25.62,12.82L28,12.82L28,8.92C27.59,8.87 26.18,8.75 24.53,8.75C21.1,8.75 18.75,10.78 18.75,14.51L18.75,17.72L14.88,17.72L14.88,22.07L18.75,22.07L18.75,33.25L23.39,33.25Z\"\n        android:strokeColor=\"#00000000\"\n        android:strokeWidth=\"1\" />\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_facebook_like.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"120.0\"\n    android:viewportWidth=\"120.0\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#FFFFFF\"\n        android:pathData=\"M24,22h72v69h-72z\"\n        android:strokeColor=\"#00000000\" android:strokeWidth=\"1\"/>\n    <path android:fillColor=\"#5D9FF6\"\n        android:pathData=\"M88.89,64.84C88.89,67.11 87.33,69.01 85.23,69.54C86.71,70.21 87.75,71.69 87.75,73.42C87.75,75.53 86.21,77.28 84.19,77.61C85.2,78.39 85.84,79.61 85.84,80.97C85.84,83.24 84.06,85.09 81.82,85.22L81.82,85.23L49.77,85.23C48.16,85.23 47.04,83.41 47.04,81.82L47.04,62.05C47.04,60.26 47.09,53.63 50.8,48.36C53.82,44.08 55.72,41.67 57.53,39.86C59.6,37.78 61.27,35.2 61.27,34.28C61.27,32.29 61.26,30.37 61.26,30.37L61.27,30.37C61.28,28.21 62.79,26.17 65.57,26.17C66.92,26.17 68,26.45 69,27.64C70.6,29.39 71.55,32.47 71.55,36.84C71.55,41.22 66.82,50.45 66.82,50.45L83.86,50.45L83.86,50.46C86.81,50.54 89.18,52.99 89.18,56C89.18,57.99 88.14,59.74 86.59,60.72C87.97,61.58 88.89,63.1 88.89,64.84L88.89,64.84ZM43.64,86.08C43.64,87.11 42.8,87.95 41.76,87.95L31.2,87.95C30.16,87.95 29.32,87.11 29.32,86.08L29.32,55.74C29.32,54.7 30.16,53.86 31.2,53.86L41.76,53.86C42.8,53.86 43.64,54.7 43.64,55.74L43.64,86.08ZM60,0C26.86,0 0,26.86 0,60C0,93.14 26.86,120 60,120C93.14,120 120,93.14 120,60C120,26.86 93.14,0 60,0L60,0Z\"\n        android:strokeColor=\"#00000000\" android:strokeWidth=\"1\"/>\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_facebook_logo_traced.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:pathData=\"M22.676,24L1.325,24C0.593,24 0,23.407 0,22.676L0,1.325C0,0.593 0.593,0 1.325,0L22.676,0C23.407,0 24,0.593 24,1.325L24,22.676C24,23.407 23.407,24 22.676,24ZM16.56,24L16.56,14.706L19.679,14.706L20.146,11.084L16.56,11.084L16.56,8.771C16.56,7.723 16.851,7.008 18.355,7.008L20.273,7.007L20.273,3.768C19.941,3.724 18.802,3.625 17.478,3.625C14.712,3.625 12.819,5.313 12.819,8.413L12.819,11.084L9.692,11.084L9.692,14.706L12.819,14.706L12.819,24L16.56,24Z\"\n        android:strokeColor=\"#00000000\"\n        android:fillColor=\"#000000\"\n        android:strokeWidth=\"1\"/>\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_facebook_sad.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"120.0\"\n    android:viewportWidth=\"120.0\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#FDDB73\"\n        android:pathData=\"M59.73,0C26.74,0 0,26.75 0,59.73C0,92.72 26.74,119.46 59.73,119.46C92.72,119.46 119.46,92.72 119.46,59.73C119.46,26.75 92.72,0 59.73,0\"\n        android:strokeColor=\"#00000000\" android:strokeWidth=\"1\"/>\n    <path android:fillColor=\"#5890FF\"\n        android:pathData=\"M95.18,86.53C94.04,86.53 86.1,103.59 86.1,108.42C86.1,113.27 90.17,117.18 95.18,117.18C100.19,117.18 104.26,113.27 104.26,108.42C104.26,103.59 96.32,86.53 95.18,86.53\"\n        android:strokeColor=\"#00000000\" android:strokeWidth=\"1\"/>\n    <path android:fillColor=\"#262C38\"\n        android:pathData=\"M100.68,57.26C98.47,53.09 90.55,47.42 82.73,47.67C81.41,47.71 80.38,48.8 80.43,50.12C80.47,51.43 81.54,52.48 82.87,52.42C88.92,52.24 95.11,56.89 96.48,59.48C96.91,60.29 97.73,60.75 98.59,60.75C98.96,60.75 99.34,60.66 99.7,60.47C100.86,59.86 101.3,58.42 100.68,57.26M85.69,58.2C81.57,58.2 78.22,61.77 78.22,66.18C78.22,70.58 81.57,74.15 85.69,74.15C89.82,74.15 93.16,70.58 93.16,66.18C93.16,61.77 89.82,58.2 85.69,58.2M39.04,50.12C39.08,48.8 38.05,47.71 36.74,47.67C28.9,47.41 20.99,53.09 18.78,57.26C18.16,58.42 18.6,59.86 19.77,60.47C20.12,60.66 20.5,60.75 20.88,60.75C21.72,60.75 22.55,60.29 22.97,59.48C24.36,56.89 30.55,52.23 36.59,52.42C37.9,52.48 39,51.43 39.04,50.12M33.77,58.2C29.64,58.2 26.3,61.77 26.3,66.18C26.3,70.58 29.64,74.15 33.77,74.15C37.89,74.15 41.23,70.58 41.23,66.18C41.23,61.77 37.89,58.2 33.77,58.2M59.73,84.16C53.53,84.16 47.72,86.82 43.78,91.43C42.81,92.57 42.94,94.28 44.09,95.26C44.59,95.7 45.22,95.91 45.84,95.91C46.61,95.91 47.38,95.58 47.91,94.96C50.82,91.55 55.13,89.6 59.73,89.6C64.32,89.6 68.63,91.55 71.53,94.95C72.51,96.09 74.22,96.23 75.36,95.25C76.5,94.28 76.63,92.56 75.66,91.42C71.73,86.81 65.92,84.16 59.73,84.16\"\n        android:strokeColor=\"#00000000\" android:strokeWidth=\"1\"/>\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_friend_invite.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z\"/>\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_gift.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:pathData=\"M20,6L17.82,6C17.93,5.69 18,5.35 18,5C18,3.34 16.66,2 15,2C13.95,2 13.04,2.54 12.5,3.35L12,4.02L11.5,3.34C10.96,2.54 10.05,2 9,2C7.34,2 6,3.34 6,5C6,5.35 6.07,5.69 6.18,6L4,6C2.89,6 2.01,6.89 2.01,8L2,19C2,20.11 2.89,21 4,21L20,21C21.11,21 22,20.11 22,19L22,8C22,6.89 21.11,6 20,6ZM15,4C15.55,4 16,4.45 16,5C16,5.55 15.55,6 15,6C14.45,6 14,5.55 14,5C14,4.45 14.45,4 15,4ZM9,4C9.55,4 10,4.45 10,5C10,5.55 9.55,6 9,6C8.45,6 8,5.55 8,5C8,4.45 8.45,4 9,4ZM20,19L4,19L4,17L20,17L20,19ZM20,14L4,14L4,8L9.08,8L7,10.83L8.62,12L11,8.76L12,7.4L13,8.76L15.38,12L17,10.83L14.92,8L20,8L20,14Z\"\n        android:strokeColor=\"#00000000\"\n        android:fillColor=\"#FFFFFF\"\n        android:strokeWidth=\"1\"/>\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_github.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"118.0\"\n    android:viewportWidth=\"121.0\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#181717\"\n        android:pathData=\"M60.39,-0C27.04,-0 -0,27.03 -0,60.39C-0,87.07 17.3,109.7 41.3,117.69C44.31,118.25 45.42,116.38 45.42,114.78C45.42,113.34 45.37,108.59 45.34,103.54C28.54,107.19 25,96.42 25,96.42C22.25,89.44 18.29,87.58 18.29,87.58C12.81,83.83 18.7,83.91 18.7,83.91C24.77,84.33 27.96,90.13 27.96,90.13C33.35,99.36 42.09,96.69 45.53,95.15C46.08,91.25 47.64,88.58 49.37,87.08C35.95,85.55 21.85,80.37 21.85,57.23C21.85,50.64 24.21,45.25 28.08,41.02C27.45,39.5 25.38,33.36 28.66,25.04C28.66,25.04 33.73,23.42 45.27,31.23C50.09,29.9 55.26,29.22 60.39,29.2C65.52,29.22 70.69,29.9 75.52,31.23C87.04,23.42 92.11,25.04 92.11,25.04C95.39,33.36 93.33,39.5 92.7,41.02C96.57,45.25 98.91,50.64 98.91,57.23C98.91,80.43 84.79,85.53 71.34,87.03C73.5,88.9 75.43,92.58 75.43,98.21C75.43,106.29 75.37,112.79 75.37,114.78C75.37,116.39 76.45,118.27 79.51,117.68C103.49,109.69 120.78,87.06 120.78,60.39C120.78,27.03 93.74,-0 60.39,-0\"\n        android:strokeColor=\"#00000000\" android:strokeWidth=\"1\"/>\n    <path android:fillColor=\"#181717\"\n        android:pathData=\"M22.87,86.7C22.74,87 22.27,87.09 21.84,86.89C21.4,86.69 21.15,86.28 21.3,85.98C21.43,85.67 21.9,85.59 22.34,85.79C22.77,85.99 23.02,86.4 22.87,86.7\"\n        android:strokeColor=\"#00000000\" android:strokeWidth=\"1\"/>\n    <path android:fillColor=\"#181717\"\n        android:pathData=\"M25.32,89.43C25.03,89.7 24.47,89.57 24.09,89.15C23.69,88.73 23.62,88.17 23.91,87.9C24.21,87.63 24.75,87.76 25.15,88.18C25.54,88.6 25.62,89.16 25.32,89.43\"\n        android:strokeColor=\"#00000000\" android:strokeWidth=\"1\"/>\n    <path android:fillColor=\"#181717\"\n        android:pathData=\"M27.7,92.91C27.33,93.17 26.72,92.93 26.35,92.39C25.98,91.85 25.98,91.21 26.36,90.95C26.73,90.69 27.33,90.92 27.71,91.46C28.08,92 28.08,92.65 27.7,92.91\"\n        android:strokeColor=\"#00000000\" android:strokeWidth=\"1\"/>\n    <path android:fillColor=\"#181717\"\n        android:pathData=\"M30.96,96.27C30.63,96.63 29.92,96.54 29.41,96.04C28.88,95.55 28.73,94.86 29.07,94.5C29.4,94.13 30.11,94.23 30.63,94.73C31.15,95.21 31.31,95.91 30.96,96.27\"\n        android:strokeColor=\"#00000000\" android:strokeWidth=\"1\"/>\n    <path android:fillColor=\"#181717\"\n        android:pathData=\"M35.46,98.22C35.31,98.69 34.64,98.91 33.95,98.71C33.27,98.5 32.82,97.95 32.96,97.47C33.1,96.99 33.78,96.77 34.47,96.98C35.15,97.19 35.6,97.74 35.46,98.22\"\n        android:strokeColor=\"#00000000\" android:strokeWidth=\"1\"/>\n    <path android:fillColor=\"#181717\"\n        android:pathData=\"M40.4,98.58C40.42,99.08 39.84,99.49 39.12,99.5C38.4,99.52 37.82,99.11 37.81,98.62C37.81,98.12 38.38,97.71 39.1,97.7C39.81,97.69 40.4,98.09 40.4,98.58\"\n        android:strokeColor=\"#00000000\" android:strokeWidth=\"1\"/>\n    <path android:fillColor=\"#181717\"\n        android:pathData=\"M45,97.8C45.09,98.28 44.59,98.78 43.88,98.92C43.17,99.05 42.53,98.74 42.44,98.26C42.35,97.77 42.86,97.27 43.56,97.14C44.27,97.01 44.91,97.31 45,97.8\"\n        android:strokeColor=\"#00000000\" android:strokeWidth=\"1\"/>\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_licenses.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M7,5h10v2h2L19,3c0,-1.1 -0.9,-1.99 -2,-1.99L7,1c-1.1,0 -2,0.9 -2,2v4h2L7,5zM15.41,16.59L20,12l-4.59,-4.59L14,8.83 17.17,12 14,15.17l1.41,1.42zM10,15.17L6.83,12 10,8.83 8.59,7.41 4,12l4.59,4.59L10,15.17zM17,19L7,19v-2L5,17v4c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2v-4h-2v2z\"/>\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_menu.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M3,18h18v-2L3,16v2zM3,13h18v-2L3,11v2zM3,6v2h18L21,6L3,6z\"/>\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_message.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M20,4L4,4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM20,8l-8,5 -8,-5L4,6l8,5 8,-5v2z\"/>\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_namedays.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:width=\"48dp\"\n  android:height=\"48dp\"\n  android:viewportHeight=\"24.0\"\n  android:viewportWidth=\"24.0\">\n  <path\n    android:fillColor=\"#fff\"\n    android:pathData=\"M9,11.75c-0.69,0 -1.25,0.56 -1.25,1.25s0.56,1.25 1.25,1.25 1.25,-0.56 1.25,-1.25 -0.56,-1.25 -1.25,-1.25zM15,11.75c-0.69,0 -1.25,0.56 -1.25,1.25s0.56,1.25 1.25,1.25 1.25,-0.56 1.25,-1.25 -0.56,-1.25 -1.25,-1.25zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8 0,-0.29 0.02,-0.58 0.05,-0.86 2.36,-1.05 4.23,-2.98 5.21,-5.37C11.07,8.33 14.05,10 17.42,10c0.78,0 1.53,-0.09 2.25,-0.26 0.21,0.71 0.33,1.47 0.33,2.26 0,4.41 -3.59,8 -8,8z\" />\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_namedays_disabled.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:width=\"48dp\"\n  android:height=\"48dp\"\n  android:viewportHeight=\"24.0\"\n  android:viewportWidth=\"24.0\">\n  <path\n    android:fillColor=\"#484848\"\n    android:pathData=\"M9,11.75c-0.69,0 -1.25,0.56 -1.25,1.25s0.56,1.25 1.25,1.25 1.25,-0.56 1.25,-1.25 -0.56,-1.25 -1.25,-1.25zM15,11.75c-0.69,0 -1.25,0.56 -1.25,1.25s0.56,1.25 1.25,1.25 1.25,-0.56 1.25,-1.25 -0.56,-1.25 -1.25,-1.25zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8 0,-0.29 0.02,-0.58 0.05,-0.86 2.36,-1.05 4.23,-2.98 5.21,-5.37C11.07,8.33 14.05,10 17.42,10c0.78,0 1.53,-0.09 2.25,-0.26 0.21,0.71 0.33,1.47 0.33,2.26 0,4.41 -3.59,8 -8,8z\" />\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_person_120.xml",
    "content": "<vector android:height=\"120dp\" android:viewportHeight=\"24.0\"\n    android:viewportWidth=\"24.0\" android:width=\"120dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#FF000000\" android:pathData=\"M12,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM12,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z\"/>\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_person_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM12,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z\"/>\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_person_96dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:width=\"96dp\"\n  android:height=\"96dp\"\n  android:viewportHeight=\"24.0\"\n  android:viewportWidth=\"24.0\">\n  <path\n    android:fillColor=\"#fff\"\n    android:pathData=\"M12,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM12,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z\" />\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_person_light_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M12,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM12,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z\"/>\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_search_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#cc000000\"\n        android:pathData=\"M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z\"/>\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/ic_settings.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M19.43,12.98c0.04,-0.32 0.07,-0.64 0.07,-0.98s-0.03,-0.66 -0.07,-0.98l2.11,-1.65c0.19,-0.15 0.24,-0.42 0.12,-0.64l-2,-3.46c-0.12,-0.22 -0.39,-0.3 -0.61,-0.22l-2.49,1c-0.52,-0.4 -1.08,-0.73 -1.69,-0.98l-0.38,-2.65C14.46,2.18 14.25,2 14,2h-4c-0.25,0 -0.46,0.18 -0.49,0.42l-0.38,2.65c-0.61,0.25 -1.17,0.59 -1.69,0.98l-2.49,-1c-0.23,-0.09 -0.49,0 -0.61,0.22l-2,3.46c-0.13,0.22 -0.07,0.49 0.12,0.64l2.11,1.65c-0.04,0.32 -0.07,0.65 -0.07,0.98s0.03,0.66 0.07,0.98l-2.11,1.65c-0.19,0.15 -0.24,0.42 -0.12,0.64l2,3.46c0.12,0.22 0.39,0.3 0.61,0.22l2.49,-1c0.52,0.4 1.08,0.73 1.69,0.98l0.38,2.65c0.03,0.24 0.24,0.42 0.49,0.42h4c0.25,0 0.46,-0.18 0.49,-0.42l0.38,-2.65c0.61,-0.25 1.17,-0.59 1.69,-0.98l2.49,1c0.23,0.09 0.49,0 0.61,-0.22l2,-3.46c0.12,-0.22 0.07,-0.49 -0.12,-0.64l-2.11,-1.65zM12,15.5c-1.93,0 -3.5,-1.57 -3.5,-3.5s1.57,-3.5 3.5,-3.5 3.5,1.57 3.5,3.5 -1.57,3.5 -3.5,3.5z\"/>\n</vector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/progress_horizontal_dayslight.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- File created by the Android Action Bar Style Generator\n\n     Copyright (C) 2011 The Android Open Source Project\n     Copyright (C) 2012 readyState Software Ltd\n\n     Licensed under the Apache License, Version 2.0 (the \"License\");\n     you may not use this file except in compliance with the License.\n     You may obtain a copy of the License at\n\n          http://www.apache.org/licenses/LICENSE-2.0\n\n     Unless required by applicable law or agreed to in writing, software\n     distributed under the License is distributed on an \"AS IS\" BASIS,\n     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n     See the License for the specific language governing permissions and\n     limitations under the License.\n-->\n\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item android:id=\"@android:id/background\"\n          android:drawable=\"@drawable/progress_bg_dayslight\" />\n\n    <item android:id=\"@android:id/secondaryProgress\">\n        <scale android:scaleWidth=\"100%\"\n               android:drawable=\"@drawable/progress_secondary_dayslight\" />\n    </item>\n\n    <item android:id=\"@android:id/progress\">\n        <scale android:scaleWidth=\"100%\"\n               android:drawable=\"@drawable/progress_primary_dayslight\" />\n    </item>\n\n</layer-list>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/selectable_background_dayslight.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\" android:exitFadeDuration=\"@android:integer/config_mediumAnimTime\">\n    <item android:drawable=\"@drawable/list_focused_dayslight\" android:state_focused=\"true\" android:state_pressed=\"false\" />\n    <item android:drawable=\"@drawable/list_pressed_dayslight\" android:state_pressed=\"true\" />\n    <item android:drawable=\"@android:color/transparent\" />\n</selector>"
  },
  {
    "path": "android_mobile/src/main/res/drawable/spinner_background_ab_dayslight.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- File created by the Android Action Bar Style Generator\n\n     Copyright (C) 2011 The Android Open Source Project\n     Copyright (C) 2012 readyState Software Ltd\n\n     Licensed under the Apache License, Version 2.0 (the \"License\");\n     you may not use this file except in compliance with the License.\n     You may obtain a copy of the License at\n  \n          http://www.apache.org/licenses/LICENSE-2.0\n  \n     Unless required by applicable law or agreed to in writing, software\n     distributed under the License is distributed on an \"AS IS\" BASIS,\n     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n     See the License for the specific language governing permissions and\n     limitations under the License.\n-->\n\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_enabled=\"false\"\n        android:drawable=\"@drawable/spinner_ab_disabled_dayslight\" />\n    <item android:state_pressed=\"true\"\n        android:drawable=\"@drawable/spinner_ab_pressed_dayslight\" />\n    <item android:state_pressed=\"false\" android:state_focused=\"true\"\n        android:drawable=\"@drawable/spinner_ab_focused_dayslight\" />\n    <item android:drawable=\"@drawable/spinner_ab_default_dayslight\" />\n</selector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable/tab_indicator_ab_dayslight.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- File created by the Android Action Bar Style Generator\n\n     Copyright (C) 2011 The Android Open Source Project\n     Copyright (C) 2012 readyState Software Ltd\n\n     Licensed under the Apache License, Version 2.0 (the \"License\");\n     you may not use this file except in compliance with the License.\n     You may obtain a copy of the License at\n  \n          http://www.apache.org/licenses/LICENSE-2.0\n  \n     Unless required by applicable law or agreed to in writing, software\n     distributed under the License is distributed on an \"AS IS\" BASIS,\n     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n     See the License for the specific language governing permissions and\n     limitations under the License.\n-->\n\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <!-- Non focused states -->\n    <item android:state_focused=\"false\" android:state_selected=\"false\" android:state_pressed=\"false\" android:drawable=\"@android:color/transparent\" />\n    <item android:state_focused=\"false\" android:state_selected=\"true\"  android:state_pressed=\"false\" android:drawable=\"@drawable/tab_selected_dayslight\" />\n\n    <!-- Focused states -->\n    <item android:state_focused=\"true\" android:state_selected=\"false\" android:state_pressed=\"false\" android:drawable=\"@drawable/tab_unselected_focused_dayslight\" />\n    <item android:state_focused=\"true\" android:state_selected=\"true\"  android:state_pressed=\"false\" android:drawable=\"@drawable/tab_selected_focused_dayslight\" />\n\n    <!-- Pressed -->\n    <!--    Non focused states -->\n    <item android:state_focused=\"false\" android:state_selected=\"false\" android:state_pressed=\"true\" android:drawable=\"@drawable/tab_unselected_pressed_dayslight\" />\n    <item android:state_focused=\"false\" android:state_selected=\"true\"  android:state_pressed=\"true\" android:drawable=\"@drawable/tab_selected_pressed_dayslight\" />\n\n    <!--    Focused states -->\n    <item android:state_focused=\"true\" android:state_selected=\"false\" android:state_pressed=\"true\" android:drawable=\"@drawable/tab_unselected_pressed_dayslight\" />\n    <item android:state_focused=\"true\" android:state_selected=\"true\"  android:state_pressed=\"true\" android:drawable=\"@drawable/tab_selected_pressed_dayslight\" />\n</selector>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable-v21/blue_ripple.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ripple xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:color=\"@color/nameday_blue\">\n    <item\n        android:id=\"@android:id/mask\"\n        android:drawable=\"@color/white_semi_transparents\" />\n</ripple>"
  },
  {
    "path": "android_mobile/src/main/res/drawable-v21/neutral_ripple.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ripple xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:color=\"@color/neutral_ripple\">\n    <item\n        android:id=\"@android:id/mask\"\n        android:drawable=\"@color/white_semi_transparents\" />\n</ripple>\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable-v21/neutral_ripple_no_mask.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ripple xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:color=\"@color/neutral_ripple\" />\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable-v21/red_ripple.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ripple android:color=\"@color/main_red_semi_transparent\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:id=\"@android:id/mask\"\n        android:drawable=\"@color/white_semi_transparents\" />\n</ripple>\n\n"
  },
  {
    "path": "android_mobile/src/main/res/drawable-v21/red_ripple_no_mask.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ripple android:color=\"@color/main_red_semi_transparent\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n</ripple>\n\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/abc_dropdown_title.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Spinner xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@android:id/title\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\" />\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/activity_add_event.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:orientation=\"vertical\">\n\n  <FrameLayout\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:elevation=\"@dimen/toolbar_elevation\">\n\n    <com.alexstyl.specialdates.addevent.ui.AvatarPickerView\n      android:id=\"@+id/add_event_avatar\"\n      style=\"@style/CardViewStyle\"\n      android:layout_width=\"match_parent\"\n      android:layout_height=\"@dimen/add_event_avatar_height\"\n      android:background=\"@color/nameday_blue\"\n      android:elevation=\"@dimen/toolbar_elevation\" />\n\n\n    <com.alexstyl.specialdates.ui.widget.MementoToolbar\n      android:id=\"@+id/memento_toolbar\"\n      style=\"@style/Widget.Memento.Toolbar\"\n      android:layout_width=\"match_parent\"\n      android:layout_height=\"wrap_content\"\n      android:elevation=\"@dimen/toolbar_elevation\">\n\n      <Button\n        android:id=\"@+id/add_event_save\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"top|end\"\n        android:background=\"?selectableItemBackground\"\n        android:drawableLeft=\"@drawable/ic_check_white\"\n        android:drawablePadding=\"8dp\"\n        android:drawableStart=\"@drawable/ic_check_white\"\n        android:fontFamily=\"sans-serif-condensed\"\n        android:gravity=\"center_vertical\"\n        android:minHeight=\"48dp\"\n        android:padding=\"8dp\"\n        android:text=\"@string/Save\"\n        android:textColor=\"#fff\" />\n    </com.alexstyl.specialdates.ui.widget.MementoToolbar>\n\n  </FrameLayout>\n\n  <android.support.v7.widget.RecyclerView\n    android:id=\"@+id/add_event_events\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:layout_marginLeft=\"@dimen/add_event_margin_horizontal\"\n    android:layout_marginRight=\"@dimen/add_event_margin_horizontal\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/activity_call.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\" android:layout_width=\"match_parent\"\n  android:layout_height=\"match_parent\">\n\n\n  <android.support.v7.widget.RecyclerView\n    android:layout_width=\"match_parent\"\n    android:id=\"@+id/actions_list\"\n    android:layout_height=\"match_parent\"/>\n</FrameLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/activity_contact_permission_request.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"match_parent\"\n  android:background=\"?attr/colorSecondary\"\n  android:paddingBottom=\"@dimen/activity_vertical_margin\"\n  android:paddingLeft=\"@dimen/activity_horizontal_margin\"\n  android:paddingRight=\"@dimen/activity_horizontal_margin\"\n  android:paddingTop=\"@dimen/activity_vertical_margin\">\n\n  <LinearLayout\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"center\"\n    android:orientation=\"vertical\"\n    android:paddingLeft=\"@dimen/activity_horizontal_margin\"\n    android:paddingRight=\"@dimen/activity_horizontal_margin\">\n\n    <LinearLayout\n      android:layout_width=\"match_parent\"\n      android:layout_height=\"wrap_content\"\n      android:gravity=\"center\"\n      android:orientation=\"horizontal\">\n\n      <ImageView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        android:importantForAccessibility=\"no\"\n        android:src=\"@mipmap/ic_launcher\" />\n\n      <ImageView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginLeft=\"@dimen/contact_permission_arrow_horizontal_margin\"\n        android:layout_marginRight=\"@dimen/contact_permission_arrow_horizontal_margin\"\n        android:importantForAccessibility=\"no\"\n        android:src=\"@drawable/ic_arrow_back_white_24dp\" />\n\n      <ImageView\n        android:id=\"@+id/contact_permission_icon\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:importantForAccessibility=\"no\"\n        android:src=\"@drawable/ic_contacts\" />\n    </LinearLayout>\n\n    <TextView\n      android:id=\"@+id/contact_permission_text\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:layout_marginTop=\"24dp\"\n      android:gravity=\"center\"\n      android:text=\"@string/contact_permission_message_request\"\n      android:textColor=\"?android:textColorPrimaryInverse\" />\n\n    <TextView\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:layout_marginTop=\"36dp\"\n      android:gravity=\"center\"\n      android:text=\"@string/contact_permission_fact\"\n      android:textColor=\"?android:textColorPrimaryInverse\" />\n  </LinearLayout>\n\n  <android.support.v7.widget.AppCompatButton\n    android:id=\"@+id/contact_permission_grant_button\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"bottom\"\n    android:minHeight=\"64dp\"\n    android:text=\"@string/contact_permission_button_label\"\n    android:textColor=\"?primaryTextColorInverse\"\n    app:backgroundTint=\"?colorAccent\" />\n\n</FrameLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/activity_dailyreminder.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"match_parent\"\n  android:baselineAligned=\"false\"\n  android:gravity=\"center_horizontal\"\n  android:orientation=\"vertical\">\n\n  <com.alexstyl.specialdates.ui.widget.MementoToolbar\n    style=\"@style/Widget.Memento.Toolbar\"\n    android:id=\"@+id/memento_toolbar\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\" />\n\n  <fragment\n    android:id=\"@+id/main_pref_frag\"\n    android:name=\"com.alexstyl.specialdates.settings.DailyReminderFragment\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/activity_debug_facebook.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"match_parent\"\n  android:orientation=\"vertical\">\n\n</LinearLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/activity_donate.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.design.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n  android:layout_width=\"match_parent\"\n  android:id=\"@+id/donate_coordinator\"\n  android:layout_height=\"match_parent\"\n  android:fitsSystemWindows=\"true\">\n\n  <android.support.design.widget.AppBarLayout\n    android:id=\"@+id/app_bar_layout\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:fitsSystemWindows=\"true\"\n    app:layout_behavior=\"android.support.design.widget.AppBarLayout$Behavior\"\n    android:theme=\"@style/ThemeOverlay.AppCompat.Dark.ActionBar\">\n\n    <android.support.design.widget.CollapsingToolbarLayout\n      android:id=\"@+id/collapsing_toolbar\"\n      android:layout_width=\"match_parent\"\n      android:layout_height=\"310dp\"\n      android:fitsSystemWindows=\"true\"\n      app:contentScrim=\"?attr/colorPrimary\"\n      app:expandedTitleMarginEnd=\"64dp\"\n      app:expandedTitleMarginStart=\"48dp\"\n      app:layout_scrollFlags=\"scroll|exitUntilCollapsed\">\n\n      <ImageView\n        android:id=\"@+id/donate_avatar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"310dp\"\n        android:fitsSystemWindows=\"true\"\n        android:scaleType=\"centerCrop\"\n        app:layout_collapseMode=\"parallax\" />\n\n      <ImageView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"310dp\"\n        android:rotation=\"180\"\n        android:src=\"@drawable/black_to_transparent_gradient_facing_down\" />\n\n\n      <android.support.v7.widget.Toolbar\n        android:id=\"@+id/toolbar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"?attr/actionBarSize\"\n        app:layout_collapseMode=\"pin\"\n        app:popupTheme=\"@style/ThemeOverlay.AppCompat.Light\" />\n\n    </android.support.design.widget.CollapsingToolbarLayout>\n\n  </android.support.design.widget.AppBarLayout>\n\n  <android.support.v4.widget.NestedScrollView\n    android:id=\"@+id/scroll\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:clipToPadding=\"false\"\n    app:layout_behavior=\"@string/appbar_scrolling_view_behavior\">\n\n\n    <LinearLayout\n      android:layout_width=\"match_parent\"\n      android:layout_height=\"wrap_content\"\n      android:layout_margin=\"18dp\"\n      android:orientation=\"vertical\">\n\n\n      <TextView\n        style=\"@style/Donate.Text\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"12dp\"\n        android:text=\"@string/donate_text\" />\n\n      <SeekBar\n        android:id=\"@+id/donation_bar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"14dp\"\n        android:layout_marginTop=\"18dp\" />\n\n\n      <Button\n        android:id=\"@+id/donate_place_donation\"\n        style=\"@style/Card.Text.Action\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"end\"\n        android:text=\"@string/donate\" />\n    </LinearLayout>\n  </android.support.v4.widget.NestedScrollView>\n</android.support.design.widget.CoordinatorLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/activity_facebook_log_in.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"match_parent\"\n  android:background=\"?attr/colorSecondary\"\n  android:orientation=\"vertical\">\n\n  <com.alexstyl.specialdates.ui.widget.MementoToolbar\n    android:id=\"@+id/memento_toolbar\"\n    style=\"@style/Widget.Memento.Toolbar\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"@android:color/transparent\" />\n\n\n  <com.alexstyl.specialdates.facebook.login.FacebookWebView\n    android:id=\"@+id/facebook_import_webview\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:layout_below=\"@id/memento_toolbar\"\n    tools:visibility=\"gone\" />\n\n  <ProgressBar\n    android:id=\"@+id/progress\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_centerInParent=\"true\"\n    android:visibility=\"gone\" />\n\n  <LinearLayout\n    android:id=\"@+id/facebook_cta_bar\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_alignParentBottom=\"true\"\n    android:orientation=\"horizontal\"\n    android:padding=\"20dp\">\n\n    <Button\n      android:id=\"@+id/facebook_import_close\"\n      style=\"@style/FacebookImport.CTAButton\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:text=\"@string/Done\"\n      android:visibility=\"gone\"\n      tools:visibility=\"visible\" />\n\n    <View\n      android:layout_width=\"0dp\"\n      android:layout_height=\"0dp\"\n      android:layout_weight=\"1\" />\n\n    <Button\n      android:id=\"@+id/facebook_import_share\"\n      style=\"@style/FacebookImport.CTAButton\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:text=\"@string/share\"\n      android:visibility=\"gone\"\n      tools:visibility=\"visible\" />\n\n  </LinearLayout>\n\n  <LinearLayout\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:layout_above=\"@id/facebook_cta_bar\"\n    android:gravity=\"center\"\n    android:orientation=\"vertical\"\n    android:paddingLeft=\"@dimen/activity_horizontal_margin\"\n    android:paddingRight=\"@dimen/activity_horizontal_margin\">\n\n    <ImageView\n      android:id=\"@+id/facebook_import_avatar\"\n      android:layout_width=\"@dimen/facebook_avatar_width\"\n      android:layout_height=\"@dimen/facebook_avatar_height\"\n      android:elevation=\"4dp\"\n      android:importantForAccessibility=\"no\"\n      android:src=\"@drawable/ic_facebook_like\"\n      android:visibility=\"gone\"\n      tools:visibility=\"visible\" />\n\n    <TextView\n      android:id=\"@+id/facebook_import_hello\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:layout_marginTop=\"20dp\"\n      android:textColor=\"?attr/primaryTextColorInverse\"\n      android:textSize=\"24sp\"\n      android:visibility=\"gone\"\n      tools:text=\"@string/facebook_hi\"\n      tools:visibility=\"visible\" />\n\n    <TextView\n      android:id=\"@+id/facebook_import_description\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:layout_marginTop=\"10dp\"\n      android:fontFamily=\"sans-serif-light\"\n      android:text=\"@string/facebook_more_description\"\n      android:textColor=\"?attr/primaryTextColorInverse\"\n      android:textSize=\"18sp\"\n      android:visibility=\"gone\"\n      tools:visibility=\"visible\" />\n\n  </LinearLayout>\n\n\n</RelativeLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/activity_facebook_profile.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"match_parent\"\n  android:background=\"?attr/colorSecondary\"\n  android:orientation=\"vertical\">\n\n  <com.alexstyl.specialdates.ui.widget.MementoToolbar\n    android:id=\"@+id/memento_toolbar\"\n    style=\"@style/Widget.Memento.Toolbar\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"@android:color/transparent\" />\n\n\n  <LinearLayout\n    android:id=\"@+id/facebook_profile_group\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:gravity=\"center\"\n    android:orientation=\"vertical\"\n    android:paddingLeft=\"@dimen/activity_horizontal_margin\"\n    android:paddingRight=\"@dimen/activity_horizontal_margin\">\n\n    <ImageView\n      android:id=\"@+id/facebook_profile_avatar\"\n      android:layout_width=\"@dimen/facebook_avatar_width\"\n      android:layout_height=\"@dimen/facebook_avatar_height\"\n      android:elevation=\"4dp\"\n      android:importantForAccessibility=\"no\" />\n\n    <TextView\n      android:id=\"@+id/facebook_profile_name\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:layout_marginTop=\"20dp\"\n      android:textColor=\"?android:textColorPrimaryInverse\"\n      android:textSize=\"24sp\"\n      tools:text=\"Alex Styl\" />\n\n    <TextView\n      android:id=\"@+id/facebook_profile_friends_update_daily\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:layout_marginTop=\"10dp\"\n      android:fontFamily=\"sans-serif-light\"\n      android:text=\"@string/facebook_friends_update_daily\"\n      android:textColor=\"?android:textColorPrimaryInverse\"\n      android:textSize=\"18sp\" />\n\n  </LinearLayout>\n\n  <android.support.v7.widget.AppCompatButton\n    android:id=\"@+id/facebook_profile_fb_page\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_alignParentBottom=\"true\"\n    android:layout_marginBottom=\"@dimen/activity_vertical_margin\"\n    android:layout_marginLeft=\"@dimen/activity_horizontal_margin\"\n    android:layout_marginRight=\"@dimen/activity_horizontal_margin\"\n    android:layout_marginTop=\"@dimen/activity_vertical_margin\"\n    android:minHeight=\"64dp\"\n    android:text=\"@string/facebook_profile_fb_page\"\n    android:textColor=\"?primaryTextColorInverse\"\n    app:backgroundTint=\"?colorAccent\" />\n\n\n</RelativeLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/activity_home.xml",
    "content": "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"match_parent\">\n\n  <FrameLayout\n    android:id=\"@+id/home_toolbar_holder\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"62dp\"\n    android:layout_alignParentTop=\"true\"\n    android:background=\"?attr/colorPrimary\"\n    android:orientation=\"vertical\">\n\n    <com.alexstyl.specialdates.upcoming.view.ExposedSearchToolbar\n      android:id=\"@+id/home_toolbar\"\n      android:layout_width=\"match_parent\"\n      android:layout_height=\"match_parent\"\n      android:layout_gravity=\"center\"\n      android:layout_margin=\"@dimen/padding_tight\"\n      app:titleTextAppearance=\"@style/Upcoming.Toolbar.TitleText\" />\n  </FrameLayout>\n\n  <LinearLayout\n    android:id=\"@+id/home_content\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_above=\"@+id/home_ad_banner\"\n    android:layout_below=\"@id/home_toolbar_holder\"\n    android:orientation=\"vertical\">\n\n    <android.support.design.widget.TabLayout\n      android:id=\"@+id/home_tabs\"\n      android:layout_width=\"match_parent\"\n      android:layout_height=\"wrap_content\"\n      android:background=\"?attr/colorPrimary\"\n      android:elevation=\"@dimen/toolbar_elevation\"\n      app:tabMinWidth=\"52dp\"\n      app:tabMode=\"fixed\"\n      tools:layout_height=\"48dp\" />\n\n    <android.support.v4.view.ViewPager\n      android:id=\"@+id/home_viewpager\"\n      android:layout_width=\"match_parent\"\n      android:layout_height=\"match_parent\" />\n  </LinearLayout>\n\n  <com.alexstyl.specialdates.home.DonationBannerView\n    android:id=\"@+id/home_ad_banner\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_alignParentBottom=\"true\"\n    android:paddingBottom=\"8dp\"\n    android:visibility=\"gone\"\n    app:elevation=\"4dp\" />\n\n  <android.support.design.widget.FloatingActionButton\n    android:id=\"@+id/home_add_event\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_above=\"@id/home_ad_banner\"\n    android:layout_alignParentEnd=\"true\"\n    android:layout_alignParentRight=\"true\"\n    android:layout_alignWithParentIfMissing=\"true\"\n    android:layout_margin=\"16dp\"\n    android:layout_marginBottom=\"8dp\"\n    android:layout_marginEnd=\"8dp\"\n    android:layout_marginRight=\"8dp\"\n    android:src=\"@drawable/ic_add_person_24px\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/activity_namedays.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.design.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"match_parent\">\n\n\n  <android.support.design.widget.AppBarLayout\n    android:id=\"@+id/app_bar_layout\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:fitsSystemWindows=\"true\"\n    android:theme=\"@style/ThemeOverlay.AppCompat.Dark.ActionBar\"\n    app:layout_behavior=\"android.support.design.widget.AppBarLayout$Behavior\">\n\n    <android.support.design.widget.CollapsingToolbarLayout\n      android:layout_width=\"match_parent\"\n      android:layout_height=\"wrap_content\"\n      android:fitsSystemWindows=\"true\"\n      app:contentScrim=\"?attr/colorPrimary\"\n      app:expandedTitleMarginEnd=\"64dp\"\n      app:expandedTitleMarginStart=\"48dp\"\n      app:layout_scrollFlags=\"scroll|exitUntilCollapsed\">\n\n\n      <com.alexstyl.specialdates.ui.widget.MementoToolbar\n        android:id=\"@+id/memento_toolbar\"\n        style=\"@style/Widget.Memento.Toolbar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        app:elevation=\"8dp\"\n        app:layout_collapseMode=\"pin\">\n\n        <LinearLayout\n          android:layout_width=\"match_parent\"\n          android:layout_height=\"wrap_content\"\n          android:layout_marginBottom=\"48dp\"\n          android:layout_marginTop=\"48dp\"\n          android:orientation=\"vertical\">\n\n          <TextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:fontFamily=\"sans-serif-light\"\n            android:text=\"@string/namedays\"\n            android:textColor=\"#bfffffff\"\n            android:textSize=\"28sp\" />\n\n          <TextView\n            android:id=\"@+id/namedays_date\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:textColor=\"#fff\"\n            android:textSize=\"28sp\"\n            tools:text=\"Friday, 24 January\" />\n        </LinearLayout>\n\n      </com.alexstyl.specialdates.ui.widget.MementoToolbar>\n\n    </android.support.design.widget.CollapsingToolbarLayout>\n\n  </android.support.design.widget.AppBarLayout>\n\n  <android.support.v7.widget.RecyclerView\n    android:id=\"@+id/namedays_list\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:clipToPadding=\"false\"\n    android:paddingBottom=\"20dp\"\n    android:paddingLeft=\"16dp\"\n    android:paddingRight=\"16dp\"\n    android:paddingTop=\"20dp\"\n    app:layout_behavior=\"@string/appbar_scrolling_view_behavior\" />\n\n</android.support.design.widget.CoordinatorLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/activity_person.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.design.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"match_parent\"\n  android:fitsSystemWindows=\"true\">\n\n  <android.support.design.widget.AppBarLayout\n    android:id=\"@+id/person_appbar\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:fitsSystemWindows=\"true\"\n    android:theme=\"@style/ThemeOverlay.AppCompat.Dark.ActionBar\"\n    app:elevation=\"@dimen/toolbar_elevation\"\n    app:layout_behavior=\"android.support.design.widget.AppBarLayout$Behavior\">\n\n    <android.support.design.widget.CollapsingToolbarLayout\n      android:layout_width=\"match_parent\"\n      android:layout_height=\"310dp\"\n      android:fitsSystemWindows=\"true\"\n      app:contentScrim=\"?attr/colorPrimary\"\n      app:layout_scrollFlags=\"scroll|exitUntilCollapsed\">\n\n      <FrameLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:fitsSystemWindows=\"true\">\n\n        <ImageView\n          android:id=\"@+id/person_avatar\"\n          android:layout_width=\"match_parent\"\n          android:layout_height=\"310dp\"\n          android:contentDescription=\"@null\"\n          \n          android:scaleType=\"centerCrop\"\n          app:layout_collapseMode=\"parallax\"\n          tools:background=\"#007c87\" />\n\n        <ImageView\n          android:id=\"@+id/person_toolbar_gradient\"\n          android:layout_width=\"match_parent\"\n          android:layout_height=\"wrap_content\"\n          android:contentDescription=\"@null\"\n          android:minHeight=\"@dimen/toolbar_minHeight\"\n          android:visibility=\"gone\"\n          tools:src=\"@drawable/black_to_transparent_gradient_facing_down\" />\n\n        <com.alexstyl.specialdates.ui.widget.MementoToolbar\n          android:id=\"@+id/person_toolbar\"\n          android:layout_width=\"match_parent\"\n          android:layout_height=\"wrap_content\"\n          android:layout_marginTop=\"@dimen/content_padding_vertical\"\n          android:minHeight=\"@dimen/toolbar_minHeight\"\n          app:layout_collapseMode=\"pin\"\n          app:popupTheme=\"@style/ThemeOverlay.AppCompat.Light\" />\n\n      </FrameLayout>\n\n    </android.support.design.widget.CollapsingToolbarLayout>\n\n  </android.support.design.widget.AppBarLayout>\n\n  <android.support.v4.widget.NestedScrollView\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:clipToPadding=\"false\"\n    android:fillViewport=\"true\"\n    app:layout_behavior=\"@string/appbar_scrolling_view_behavior\">\n\n    <LinearLayout\n      android:layout_width=\"match_parent\"\n      android:layout_height=\"match_parent\"\n      android:orientation=\"vertical\">\n\n\n      <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"?attr/colorPrimary\"\n        android:orientation=\"vertical\"\n        android:padding=\"16dp\">\n\n        <TextView\n          android:id=\"@+id/person_name\"\n          style=\"@style/Person.Name\"\n          android:layout_width=\"wrap_content\"\n          android:layout_height=\"wrap_content\"\n          tools:text=\"Cora Fernandez\" />\n\n        <TextView\n          android:id=\"@+id/person_age_and_sign\"\n          style=\"@style/Person.AgeAndSign\"\n          android:layout_width=\"wrap_content\"\n          android:layout_height=\"wrap_content\"\n          android:layout_marginTop=\"8dp\"\n          tools:text=\"26, Pisces\" />\n\n      </LinearLayout>\n\n      <android.support.v4.view.ViewPager\n        android:id=\"@+id/person_viewpager\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <android.support.design.widget.TabLayout\n          android:id=\"@+id/person_tabs\"\n          android:layout_width=\"match_parent\"\n          android:layout_height=\"wrap_content\"\n          android:background=\"?colorPrimaryDark\"\n          app:tabMinWidth=\"52dp\"\n          app:tabMode=\"fixed\" />\n\n      </android.support.v4.view.ViewPager>\n    </LinearLayout>\n  </android.support.v4.widget.NestedScrollView>\n</android.support.design.widget.CoordinatorLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/activity_preferences.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:baselineAligned=\"false\"\n    android:gravity=\"center_horizontal\"\n    android:orientation=\"horizontal\"\n    android:weightSum=\"1\" >\n\n    <fragment\n        android:id=\"@+id/main_pref_frag\"\n        android:name=\"com.alexstyl.specialdates.settings.UserSettingsFragment\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/activity_rate_dialog.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"match_parent\">\n\n  <FrameLayout\n    android:id=\"@+id/support_heroimage_container\"\n    style=\"@style/Support.HeartView.Container\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:padding=\"24dp\">\n\n    <ImageView\n      android:id=\"@+id/support_heroimage\"\n      style=\"@style/Support.HeartView\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:layout_gravity=\"center\" />\n  </FrameLayout>\n\n  <TextView\n    android:id=\"@+id/support_description\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_below=\"@id/support_heroimage_container\"\n    android:padding=\"24dp\"\n    android:text=\"@string/support_app_description\"\n    android:textSize=\"18sp\" />\n\n\n  <Button\n    android:id=\"@+id/support_cancel_button\"\n    style=\"@style/Base.Widget.AppCompat.Button.Borderless.Colored\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_alignParentLeft=\"true\"\n    android:layout_below=\"@id/support_description\"\n    android:layout_marginLeft=\"12dp\"\n    android:layout_marginRight=\"12dp\"\n    android:text=\"@string/support_app_cancel_button\" />\n\n  <Button\n    android:id=\"@+id/support_rate_button\"\n    style=\"@style/Base.Widget.AppCompat.Button.Borderless.Colored\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_alignParentRight=\"true\"\n    android:layout_below=\"@id/support_description\"\n    android:layout_marginLeft=\"12dp\"\n    android:layout_marginRight=\"12dp\"\n    android:text=\"@string/support_app_rate_button\" />\n\n\n</RelativeLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/activity_search.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"match_parent\"\n  android:orientation=\"vertical\">\n\n  <com.alexstyl.specialdates.search.SearchBar\n    android:id=\"@+id/search_searchbar\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"@dimen/toolbar_semi_expanded_height\"\n    android:elevation=\"@dimen/toolbar_elevation\"\n    android:gravity=\"top\" />\n\n  <LinearLayout\n    android:id=\"@+id/search_content\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <android.support.v7.widget.RecyclerView\n      android:id=\"@+id/search_results\"\n      android:layout_width=\"match_parent\"\n      android:layout_height=\"0dp\"\n      android:layout_weight=\"1\"\n      android:clipToPadding=\"false\"\n      android:paddingBottom=\"@dimen/search_result_card_vertical_padding\"\n      android:paddingLeft=\"@dimen/search_result_card_horizontal_padding\"\n      android:paddingRight=\"@dimen/search_result_card_horizontal_padding\"\n      android:paddingTop=\"@dimen/search_result_card_vertical_padding\" />\n\n    <android.support.v7.widget.RecyclerView\n      android:id=\"@+id/search_nameday_suggestions\"\n      android:layout_width=\"match_parent\"\n      android:layout_height=\"38dp\"\n      android:layout_gravity=\"top\"\n      android:background=\"@drawable/background_suggestions\"\n      android:clipChildren=\"false\"\n      android:clipToPadding=\"false\"\n      android:paddingBottom=\"4dp\"\n      android:paddingLeft=\"@dimen/card_padding_from_screen\"\n      android:paddingRight=\"@dimen/card_padding_from_screen\"\n      android:paddingTop=\"4dp\" />\n  </LinearLayout>\n\n</LinearLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/activity_try.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.constraint.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n\n    <Button\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"8dp\"\n        android:layout_marginEnd=\"8dp\"\n        android:layout_marginLeft=\"8dp\"\n        android:layout_marginRight=\"8dp\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_marginTop=\"8dp\"\n        android:text=\"Im a button\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n\n</android.support.constraint.ConstraintLayout>"
  },
  {
    "path": "android_mobile/src/main/res/layout/activity_upcoming_events_widget_configure__first_frame.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.constraint.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/upcoming_widget_constraint\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <ImageView\n        android:id=\"@+id/scrim\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"90dp\"\n        android:src=\"@drawable/black_to_transparent_gradient_facing_down\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <LinearLayout\n        android:id=\"@+id/upcoming_widget_virtual_toolbar\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"22dp\"\n        android:gravity=\"center_vertical\"\n        android:minHeight=\"@dimen/toolbar_minHeight\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:layout_marginTop=\"0dp\">\n\n        <ImageButton\n            android:id=\"@+id/upcoming_widget_close\"\n            style=\"@style/Widget.AppCompat.Button.Borderless\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:minWidth=\"48dp\"\n            android:src=\"@drawable/ic_close_white\"\n            app:layout_constraintTop_toTopOf=\"@+id/status_bar_guideline\" />\n\n        <TextView\n            android:id=\"@+id/upcoming_widget_title\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginLeft=\"16dp\"\n            android:layout_marginStart=\"16dp\"\n            android:layout_weight=\"1\"\n            android:gravity=\"center_vertical\"\n            android:minHeight=\"@dimen/toolbar_minHeight\"\n            android:text=\"@string/Configure_widget\"\n            android:textAppearance=\"@style/TextAppearance.AppCompat.Title\"\n            android:textColor=\"@android:color/white\"\n            app:layout_constraintBottom_toBottomOf=\"@+id/upcoming_widget_close\"\n            app:layout_constraintStart_toEndOf=\"@+id/upcoming_widget_close\"\n            app:layout_constraintTop_toTopOf=\"@+id/upcoming_widget_close\" />\n    </LinearLayout>\n\n    <com.alexstyl.specialdates.upcoming.widget.today.UpcomingWidgetConfigurationPanel\n        android:id=\"@+id/upcoming_widget_configure_panel\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"220dp\"\n        android:background=\"@drawable/card\"\n        android:clipToPadding=\"false\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\" />\n\n    <com.alexstyl.specialdates.upcoming.widget.today.UpcomingWidgetPreviewLayout\n        android:id=\"@+id/upcoming_widget_preview\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintVertical_bias=\"0.3\" />\n\n\n</android.support.constraint.ConstraintLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/activity_upcoming_events_widget_configure__start.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.constraint.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/upcoming_widget_constraint\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <ImageView\n        android:id=\"@+id/scrim\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"90dp\"\n        android:src=\"@drawable/black_to_transparent_gradient_facing_down\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <LinearLayout\n        android:id=\"@+id/upcoming_widget_virtual_toolbar\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"22dp\"\n        android:gravity=\"center_vertical\"\n        android:minHeight=\"@dimen/toolbar_minHeight\"\n        app:layout_constraintBottom_toTopOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        tools:layout_marginTop=\"0dp\">\n\n        <ImageButton\n            android:id=\"@+id/upcoming_widget_close\"\n            style=\"@style/Widget.AppCompat.Button.Borderless\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:minWidth=\"48dp\"\n            android:src=\"@drawable/ic_close_white\"\n            app:layout_constraintTop_toTopOf=\"@+id/status_bar_guideline\" />\n\n        <TextView\n            android:id=\"@+id/upcoming_widget_title\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginLeft=\"16dp\"\n            android:layout_marginStart=\"16dp\"\n            android:layout_weight=\"1\"\n            android:gravity=\"center_vertical\"\n            android:minHeight=\"@dimen/toolbar_minHeight\"\n            android:text=\"@string/Configure_widget\"\n            android:textAppearance=\"@style/TextAppearance.AppCompat.Title\"\n            android:textColor=\"@android:color/white\"\n            app:layout_constraintBottom_toBottomOf=\"@+id/upcoming_widget_close\"\n            app:layout_constraintStart_toEndOf=\"@+id/upcoming_widget_close\"\n            app:layout_constraintTop_toTopOf=\"@+id/upcoming_widget_close\" />\n    </LinearLayout>\n\n    <com.alexstyl.specialdates.upcoming.widget.today.UpcomingWidgetConfigurationPanel\n        android:id=\"@+id/upcoming_widget_configure_panel\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"220dp\"\n        android:background=\"@drawable/card\"\n        android:clipToPadding=\"false\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"parent\" />\n\n    <com.alexstyl.specialdates.upcoming.widget.today.UpcomingWidgetPreviewLayout\n        android:id=\"@+id/upcoming_widget_preview\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintVertical_bias=\"0.3\" />\n\n\n</android.support.constraint.ConstraintLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/card_bankholiday.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.alexstyl.specialdates.datedetails.BankCardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\" />\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/card_compact_support_heart.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.alexstyl.specialdates.ui.MementoCardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:id=\"@+id/parent\"\n  style=\"@style/CardViewStyle\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\">\n\n  <LinearLayout\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\"\n    android:paddingBottom=\"@dimen/card_spacing\">\n\n    <FrameLayout\n      android:id=\"@+id/support_card_heroimage_container\"\n      style=\"@style/Support.HeartView.Container\"\n      android:layout_width=\"match_parent\"\n      android:layout_height=\"@dimen/card_contact_avatar_size\">\n\n      <ImageView\n        android:id=\"@+id/support_card_heroimage\"\n        style=\"@style/Support.HeartView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/card_contact_avatar_size\"\n        android:layout_gravity=\"center\" />\n    </FrameLayout>\n\n\n    <TextView\n      android:id=\"@+id/support_card_description\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:layout_marginLeft=\"@dimen/card_spacing\"\n      android:layout_marginRight=\"@dimen/card_spacing\"\n      android:layout_marginTop=\"@dimen/card_spacing\"\n      android:fontFamily=\"sans-serif-light\"\n      android:text=\"@string/support_app_description_short\"\n      android:textSize=\"@dimen/card_text_size_body_smaller\" />\n\n  </LinearLayout>\n\n</com.alexstyl.specialdates.ui.MementoCardView>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/card_contact_event_full.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.alexstyl.specialdates.ui.MementoCardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:id=\"@+id/parent\"\n  style=\"@style/CardViewStyle\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\">\n\n  <LinearLayout\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"@dimen/card_contact_avatar_size\"\n    android:orientation=\"horizontal\">\n\n\n    <com.alexstyl.specialdates.ui.widget.ColorImageView\n      android:id=\"@+id/search_result_avatar\"\n      android:layout_width=\"0dp\"\n      android:layout_height=\"@dimen/card_contact_avatar_size\"\n      android:layout_weight=\"2\"\n      app:letterSize=\"@dimen/contact_details_text_size\" />\n\n\n    <RelativeLayout\n      android:layout_width=\"0dp\"\n      android:layout_height=\"match_parent\"\n      android:layout_weight=\"5\">\n\n      <TextView\n        android:id=\"@id/search_result_contact_name\"\n        style=\"@style/Card.Text\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"@dimen/card_content_padding\"\n        android:layout_marginLeft=\"@dimen/card_content_padding\"\n        android:layout_marginRight=\"@dimen/card_content_padding\"\n        android:layout_marginStart=\"@dimen/card_content_padding\"\n        android:layout_marginTop=\"@dimen/card_content_padding\"\n        android:ellipsize=\"end\"\n        android:singleLine=\"true\"\n        tools:text=\"Darth Vader\" />\n\n      <TextView\n        android:id=\"@+id/event_label\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignLeft=\"@id/search_result_contact_name\"\n        android:layout_alignStart=\"@id/search_result_contact_name\"\n        android:layout_below=\"@id/search_result_contact_name\"\n        android:layout_marginBottom=\"@dimen/padding_tight\"\n        android:fontFamily=\"sans-serif-light\"\n        android:singleLine=\"true\"\n        android:textSize=\"@dimen/card_text_size_body\"\n        tools:text=\"Birthday\"\n        tools:textColor=\"@color/birthday_red\" />\n\n\n      <LinearLayout\n        android:id=\"@+id/card_actions\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_alignParentEnd=\"true\"\n        android:layout_alignParentRight=\"true\"\n        android:layout_marginLeft=\"@dimen/card_content_padding\"\n        android:layout_marginRight=\"@dimen/card_content_padding\"\n        android:layout_marginTop=\"@dimen/dialog_button_content_paddingTop\"\n        android:gravity=\"right\"\n        android:minHeight=\"@dimen/contact_cards_actionbutton_size\"\n        android:orientation=\"horizontal\">\n\n        <!--<include layout=\"@layout/row_card_action\" />-->\n        <!--<include layout=\"@layout/row_card_action\" />-->\n        <!--<include layout=\"@layout/row_card_action\" />-->\n      </LinearLayout>\n\n\n    </RelativeLayout>\n\n  </LinearLayout>\n\n\n</com.alexstyl.specialdates.ui.MementoCardView>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/card_full_support_heart.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.alexstyl.specialdates.ui.MementoCardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:id=\"@+id/parent\"\n  style=\"@style/CardViewStyle\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\">\n\n  <LinearLayout\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"@dimen/card_contact_avatar_size\"\n    android:orientation=\"horizontal\">\n\n    <FrameLayout\n      style=\"@style/Support.HeartView.Container\"\n      android:layout_width=\"0dp\"\n      android:layout_height=\"@dimen/card_contact_avatar_size\"\n      android:layout_weight=\"2\">\n\n      <ImageView\n        android:id=\"@+id/support_card_heroimage\"\n        style=\"@style/Support.HeartView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\" />\n    </FrameLayout>\n\n    <LinearLayout\n      android:layout_width=\"0dp\"\n      android:layout_height=\"match_parent\"\n      android:layout_weight=\"5\"\n      android:orientation=\"vertical\"\n      android:paddingLeft=\"@dimen/card_content_padding\"\n      android:paddingRight=\"@dimen/card_content_padding\">\n\n      <TextView\n        android:id=\"@+id/support_card_title\"\n        style=\"@style/Card.Text\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"@dimen/card_content_padding\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"3\"\n        android:text=\"@string/support_title\" />\n\n      <TextView\n        android:id=\"@+id/support_card_description\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"@dimen/padding_tight\"\n        android:fontFamily=\"sans-serif-light\"\n        android:textSize=\"@dimen/card_text_size_body\"\n        tools:text=\"@string/support_app_description_short\" />\n\n    </LinearLayout>\n\n  </LinearLayout>\n\n\n</com.alexstyl.specialdates.ui.MementoCardView>\n\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/card_load_more.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<com.alexstyl.specialdates.ui.MementoCardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  style=\"@style/CardViewStyle\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:layout_marginTop=\"8dp\">\n\n  <LinearLayout\n    android:id=\"@+id/layout\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\"\n    android:paddingBottom=\"@dimen/card_content_padding\"\n    android:paddingLeft=\"@dimen/card_content_padding\"\n    android:paddingRight=\"@dimen/card_content_padding\"\n    android:paddingTop=\"@dimen/card_content_padding\">\n\n    <TextView\n      android:id=\"@+id/label_more\"\n      style=\"@style/Card\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:layout_gravity=\"center\"\n      android:text=\"@string/show_more\"\n      android:textColor=\"@color/nameday_blue\"\n      android:textSize=\"@dimen/card_text_size_body\" />\n\n    <ProgressBar\n      android:id=\"@+id/progress\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:layout_gravity=\"center\" />\n\n  </LinearLayout>\n\n\n</com.alexstyl.specialdates.ui.MementoCardView>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/card_nameday_single.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<com.alexstyl.specialdates.ui.MementoCardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  style=\"@style/CardViewStyle\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\">\n\n  <LinearLayout\n    android:id=\"@+id/layout\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\"\n    android:paddingBottom=\"@dimen/card_content_padding\"\n    android:paddingLeft=\"@dimen/card_content_padding\"\n    android:paddingRight=\"@dimen/card_content_padding\"\n    android:paddingTop=\"@dimen/card_content_padding\">\n\n    <TextView\n      android:id=\"@+id/name_celebrating\"\n      style=\"@style/Card.Header\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      tools:text=\"Αλέκος\" />\n\n    <TextView\n      style=\"@style/Card.Subtitle\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:layout_marginBottom=\"@dimen/padding_tight\"\n      android:text=\"@string/search_namedays_on\"\n      android:textColor=\"@color/nameday_blue\" />\n\n    <LinearLayout\n      android:id=\"@+id/dates\"\n      android:layout_width=\"match_parent\"\n      android:layout_height=\"wrap_content\"\n      android:divider=\"@drawable/abc_list_divider_mtrl_alpha\"\n      android:orientation=\"vertical\"\n      android:showDividers=\"middle\" />\n\n  </LinearLayout>\n\n\n</com.alexstyl.specialdates.ui.MementoCardView>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/card_namedays.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.alexstyl.specialdates.datedetails.NamedayCardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:id=\"@+id/nameday_card\"\n  style=\"@style/CardViewStyle\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:addStatesFromChildren=\"true\" />\n\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/dialog_birthday_picker.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"match_parent\"\n  android:orientation=\"vertical\">\n\n  <com.alexstyl.specialdates.addevent.ui.EventDatePicker\n    android:id=\"@+id/dialog_birthday_picker\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\" />\n</LinearLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/dialog_bottom_dialog.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:layout_width=\"@dimen/bottom_sheet_layout_width\"\n  android:layout_height=\"match_parent\"\n  android:layout_gravity=\"center_horizontal\"\n  android:orientation=\"vertical\"\n  android:paddingBottom=\"24dp\"\n  android:paddingLeft=\"24dp\"\n  android:paddingRight=\"24dp\"\n  android:paddingTop=\"16dp\"\n  tools:layout_width=\"match_parent\">\n\n  <TextView\n    android:id=\"@+id/bottom_sheet_title\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:fontFamily=\"sans-serif-medium\"\n    android:text=\"@string/add_event_pick_image_title\"\n    android:textColor=\"#000000\"\n    android:textSize=\"16sp\" />\n\n  <android.support.v7.widget.RecyclerView\n    android:id=\"@+id/bottom_sheet_grid\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"center_horizontal\"\n    android:layout_marginTop=\"16dp\"\n    app:layoutManager=\"GridLayoutManager\"\n    app:spanCount=\"4\"\n    tools:listitem=\"@layout/row_image_option\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/dialog_donate.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:paddingLeft=\"?attr/dialogPreferredPadding\"\n    android:paddingRight=\"?attr/dialogPreferredPadding\"\n    android:paddingTop=\"@dimen/abc_dialog_padding_top_material\">\n\n    <TextView\n        android:id=\"@android:id/message\"\n        style=\"@style/TextAppearance.AppCompat.Subhead\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/select_donation_amount\" />\n\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"64dp\"\n        android:layout_marginTop=\"@dimen/abc_dialog_padding_top_material\"\n        android:orientation=\"horizontal\">\n\n        <Button\n            android:id=\"@+id/donate_1\"\n            style=\"@style/Widget.AppCompat.Button.Borderless\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\"\n            android:tag=\"1\"\n            android:textAppearance=\"@style/TextAppearance.AppCompat.Large\"\n            tools:text=\"2.5E\" />\n\n        <Button\n            android:id=\"@+id/donate_2\"\n            style=\"@style/Widget.AppCompat.Button.Borderless\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\"\n            android:tag=\"2\"\n            android:textAppearance=\"@style/TextAppearance.AppCompat.Large\"\n            tools:text=\"5E\" />\n\n    </LinearLayout>\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"64dp\"\n        android:orientation=\"horizontal\">\n\n        <Button\n            android:id=\"@+id/donate_3\"\n            style=\"@style/Widget.AppCompat.Button.Borderless\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\"\n            android:tag=\"3\"\n            android:textAppearance=\"@style/TextAppearance.AppCompat.Large\"\n            tools:text=\"10 E\" />\n\n        <Button\n            android:id=\"@+id/donate_4\"\n            style=\"@style/Widget.AppCompat.Button.Borderless\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\"\n            android:tag=\"4\"\n            android:textAppearance=\"@style/TextAppearance.AppCompat.Large\"\n            tools:text=\"25 E\" />\n\n        <Button\n            android:id=\"@+id/donate_5\"\n            style=\"@style/Widget.AppCompat.Button.Borderless\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\"\n            android:tag=\"5\"\n            android:textAppearance=\"@style/TextAppearance.AppCompat.Large\"\n            tools:text=\"50 E\" />\n\n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "android_mobile/src/main/res/layout/dialog_pick_image.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:layout_width=\"@dimen/bottom_sheet_layout_width\"\n  android:layout_height=\"match_parent\"\n  android:layout_gravity=\"center_horizontal\"\n  android:orientation=\"vertical\"\n  android:paddingBottom=\"24dp\"\n  android:paddingLeft=\"24dp\"\n  android:paddingRight=\"24dp\"\n  android:paddingTop=\"16dp\">\n\n  <TextView\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"@string/add_event_pick_image_title\"\n    android:textSize=\"16sp\" />\n\n  <android.support.v7.widget.RecyclerView\n    android:id=\"@+id/pick_image_grid\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"center_horizontal\"\n    android:layout_marginTop=\"16dp\"\n    app:layoutManager=\"GridLayoutManager\"\n    app:spanCount=\"4\"\n    tools:listitem=\"@layout/row_image_option\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/dialog_progress.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<ProgressBar xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:layout_gravity=\"center\" />\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/dialog_rate_prompt.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:orientation=\"vertical\"\n  android:paddingBottom=\"@dimen/padding\"\n  android:paddingTop=\"@dimen/padding\">\n\n\n  <RatingBar\n    android:id=\"@+id/ratingBar\"\n    style=\"@style/DaysLight.RatingBar\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"center\"\n    android:numStars=\"5\"\n    android:stepSize=\"1\" />\n\n  <TextView\n    android:id=\"@+id/rate_summary\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"center_horizontal\"\n    android:textAppearance=\"@style/TextAppearance.RateMeText\"\n    tools:text=\"@string/rate_1_stars\" />\n</LinearLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/dialog_support.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:paddingLeft=\"?attr/dialogPreferredPadding\"\n    android:paddingRight=\"?attr/dialogPreferredPadding\"\n    android:paddingTop=\"@dimen/abc_dialog_padding_top_material\">\n\n    <TextView\n        android:id=\"@android:id/message\"\n        style=\"@style/TextAppearance.AppCompat.Subhead\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/support_message\" />\n\n    <ListView\n        android:id=\"@android:id/list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_marginTop=\"@dimen/abc_dialog_padding_top_material\"\n        android:clipToPadding=\"false\"\n        android:divider=\"@null\"\n        android:fadingEdge=\"none\"\n        android:scrollbars=\"none\" />\n\n</LinearLayout>"
  },
  {
    "path": "android_mobile/src/main/res/layout/dialog_translate.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:id=\"@+id/url_link\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:clickable=\"false\"\n  android:focusable=\"false\"\n  android:orientation=\"vertical\"\n  android:paddingTop=\"@dimen/abc_dialog_padding_top_material\">\n\n\n  <TextView\n    android:id=\"@android:id/message\"\n    style=\"@style/TextAppearance.AppCompat.Subhead\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:paddingLeft=\"?attr/dialogPreferredPadding\"\n    android:paddingRight=\"?attr/dialogPreferredPadding\"\n    android:paddingTop=\"@dimen/abc_dialog_padding_top_material\"\n    android:text=\"@string/translate_the_app_message\" />\n\n\n  <View\n    android:id=\"@+id/textSpacerNoButtons\"\n    android:layout_width=\"0dp\"\n    android:layout_height=\"@dimen/abc_dialog_padding_top_material\"\n    android:visibility=\"gone\" />\n\n  <TextView\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:layout_marginTop=\"@dimen/abc_dialog_padding_top_material\"\n    android:background=\"?attr/colorAccent\"\n    android:clickable=\"true\"\n    android:enabled=\"true\"\n    android:focusable=\"true\"\n    android:fontFamily=\"sans-serif-condensed\"\n    android:gravity=\"center\"\n    android:longClickable=\"true\"\n    android:paddingBottom=\"@dimen/abc_dialog_padding_top_material\"\n    android:paddingTop=\"@dimen/abc_dialog_padding_top_material\"\n    android:text=\"@string/link_translate_short\"\n    android:textAppearance=\"@style/TextAppearance.AppCompat.Large\"\n    android:textColor=\"@android:color/white\" />\n\n  <FrameLayout\n    style=\"?attr/buttonBarStyle\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:paddingBottom=\"8dp\"\n    android:paddingLeft=\"12dp\"\n    android:paddingRight=\"12dp\"\n    android:paddingTop=\"8dp\">\n\n    <Button\n      android:id=\"@+id/button_ok\"\n      style=\"@style/Widget.AppCompat.Button.Borderless.Colored\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:layout_gravity=\"end\"\n      android:text=\"@android:string/ok\" />\n\n    <Button\n      android:id=\"@+id/button_copy\"\n      style=\"@style/Widget.AppCompat.Button.Borderless.Colored\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:layout_gravity=\"start\"\n      android:text=\"@android:string/copyUrl\" />\n  </FrameLayout>\n\n</LinearLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/fragment_first.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"@color/main_red\"\n    android:orientation=\"vertical\">\n\n\n    <TextView\n        android:id=\"@+id/url\"\n        style=\"@style/TextAppearance.AppCompat.Medium.Inverse\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:fontFamily=\"sans-serif-light\" />\n\n    <TextView\n        style=\"@style/TextAppearance.AppCompat.Medium.Inverse\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"Proccessing\" />\n\n    <ProgressBar\n        android:id=\"@+id/progress\"\n        style=\"@style/Widget.AppCompat.ProgressBar.Horizontal\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_gravity=\"center\" />\n\n</LinearLayout>"
  },
  {
    "path": "android_mobile/src/main/res/layout/fragment_people.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"match_parent\"\n  android:orientation=\"vertical\">\n\n  <android.support.v7.widget.RecyclerView\n    android:id=\"@+id/people_list\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:clipToPadding=\"false\"\n    android:paddingBottom=\"30dp\"\n    android:paddingTop=\"30dp\" />\n\n  <ProgressBar\n    android:id=\"@+id/people_loading\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"center\" />\n\n</FrameLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/fragment_upcoming_events.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:id=\"@+id/root\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"match_parent\">\n\n  <ProgressBar\n    android:id=\"@+id/upcoming_events_progress\"\n    style=\"?android:attr/progressBarStyle\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"center\"\n    android:visibility=\"gone\" />\n\n  <android.support.v7.widget.RecyclerView\n    android:id=\"@+id/upcoming_events_list\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:clipToPadding=\"false\"\n    android:paddingBottom=\"@dimen/fab_total_size\"\n    android:paddingLeft=\"16dp\"\n    android:paddingRight=\"16dp\"\n    tools:listitem=\"@layout/row_upcoming_events_contact_event\"\n    tools:visibility=\"gone\" />\n\n\n  <TextView\n    android:id=\"@+id/upcoming_events_emptyview\"\n    style=\"@style/NoContacts.Text\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"center\"\n    android:gravity=\"center\"\n    android:paddingLeft=\"@dimen/activity_horizontal_margin\"\n    android:paddingRight=\"@dimen/activity_horizontal_margin\"\n    android:text=\"@string/no_contacts_text\"\n    android:visibility=\"gone\"\n    tools:visibility=\"visible\" />\n\n</FrameLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/merge_avatar_picker_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<merge xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  tools:background=\"#000\"\n  tools:layout_height=\"@dimen/add_event_avatar_height\"\n  tools:layout_width=\"match_parent\"\n  tools:parentTag=\"android.widget.RelativeLayout\">\n\n  <android.support.v4.widget.Space\n    android:id=\"@+id/camera_button_image_top_space\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"@dimen/toolbar_minHeight\" />\n\n  <ImageView\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:layout_below=\"@id/camera_button_image_top_space\"\n    android:src=\"@drawable/ic_person_96dp\" />\n\n  <ImageView\n    android:id=\"@+id/avatar_picker_image\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:layout_alignParentBottom=\"true\"\n    android:layout_alignParentLeft=\"true\"\n    android:layout_alignParentStart=\"true\"\n    android:scaleType=\"centerCrop\"\n    tools:background=\"@color/white_semi_transparents\" />\n\n  <ImageView\n    android:id=\"@+id/avatar_picker_gradient__top\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"@dimen/toolbar_minHeight\"\n    android:layout_alignParentTop=\"true\"\n    android:src=\"@drawable/black_to_transparent_gradient_facing_down\"\n    android:visibility=\"gone\"\n    tools:visibility=\"visible\"\n\n    />\n\n  <ImageView\n    android:id=\"@+id/avatar_picker_gradient__bottom\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"@dimen/toolbar_minHeight\"\n    android:layout_alignParentBottom=\"true\"\n    android:rotation=\"180\"\n    android:src=\"@drawable/black_to_transparent_gradient_facing_down\"\n    android:visibility=\"gone\"\n    tools:visibility=\"visible\" />\n\n  <ImageView\n    android:id=\"@+id/avatar_picker_icon\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_alignParentBottom=\"true\"\n    android:layout_alignParentRight=\"true\"\n    android:padding=\"16dp\"\n    android:src=\"@drawable/ic_camera\" />\n\n</merge>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/merge_birthday_picker.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:orientation=\"vertical\">\n\n  <LinearLayout\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"center_horizontal\"\n    android:orientation=\"horizontal\">\n\n    <NumberPicker\n      android:id=\"@+id/day_picker\"\n      style=\"@style/BirthdayPicker.Picker\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\" />\n\n    <NumberPicker\n      android:id=\"@+id/month_picker\"\n      style=\"@style/BirthdayPicker.Picker\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\" />\n\n    <NumberPicker\n      android:id=\"@+id/year_picker\"\n      style=\"@style/BirthdayPicker.Picker\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\" />\n  </LinearLayout>\n\n  <CheckedTextView\n    android:id=\"@+id/include_year_checkbox\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"center_horizontal\"\n    android:checked=\"true\"\n    android:drawablePadding=\"@dimen/padding_tight\"\n    android:drawableRight=\"?android:attr/listChoiceIndicatorMultiple\"\n    android:gravity=\"center\"\n    android:text=\"@string/add_birthday_include_year_label\" />\n</LinearLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/merge_birthdaypicker_label_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<merge xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\">\n\n  <ImageView\n    android:layout_width=\"@dimen/add_event_image_width\"\n    android:layout_height=\"@dimen/add_event_image_height\"\n    android:scaleType=\"center\"\n    android:src=\"@drawable/ic_cake\" />\n\n  <TextView\n    android:id=\"@+id/birthdaypicker_label\"\n    style=\"@style/Widget.AppCompat.EditText\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:layout_marginLeft=\"@dimen/padding\"\n    android:clickable=\"false\"\n    android:drawableRight=\"@drawable/spinner_ab_default_dayslight\"\n    android:focusable=\"false\"\n    android:hint=\"@string/birthday\"\n    android:visibility=\"visible\"\n    tools:text=\"No birthday set\" />\n</merge>\n\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/merge_color_imageview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<merge xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <TextView\n        android:id=\"@android:id/text1\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:gravity=\"center\"\n        android:textAppearance=\"@style/TextAppearance.InitialsView\"\n        tools:text=\"A\" />\n\n    <ImageView\n        android:id=\"@android:id/icon\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:scaleType=\"centerCrop\" />\n\n</merge>"
  },
  {
    "path": "android_mobile/src/main/res/layout/merge_compact_cardview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<merge xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n  <LinearLayout\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"@dimen/card_contact_avatar_size\"\n    android:orientation=\"horizontal\">\n\n\n    <com.alexstyl.specialdates.ui.widget.ColorImageView\n      android:id=\"@+id/search_result_avatar\"\n      android:layout_width=\"0dp\"\n      android:layout_height=\"@dimen/card_contact_avatar_size\"\n      android:layout_weight=\"2\"\n      app:letterSize=\"@dimen/contact_details_text_size\" />\n\n\n    <RelativeLayout\n      android:layout_width=\"0dp\"\n      android:layout_height=\"match_parent\"\n      android:layout_weight=\"5\">\n\n      <TextView\n        android:id=\"@id/search_result_contact_name\"\n        style=\"@style/Card.Text\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"@dimen/card_content_padding\"\n        android:layout_marginLeft=\"@dimen/card_content_padding\"\n        android:layout_marginRight=\"@dimen/card_content_padding\"\n        android:layout_marginStart=\"@dimen/card_content_padding\"\n        android:layout_marginTop=\"@dimen/card_content_padding\"\n        android:ellipsize=\"end\"\n        android:singleLine=\"true\"\n        android:text=\"Darth Vader\" />\n\n      <TextView\n        android:id=\"@+id/event_label\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignLeft=\"@id/search_result_contact_name\"\n        android:layout_alignStart=\"@id/search_result_contact_name\"\n        android:layout_below=\"@id/search_result_contact_name\"\n        android:layout_marginBottom=\"@dimen/padding_tight\"\n        android:fontFamily=\"sans-serif-light\"\n        android:singleLine=\"true\"\n        android:text=\"Birthday\"\n        android:textColor=\"@color/birthday_red\"\n        android:textSize=\"@dimen/card_text_size_body\" />\n\n\n      <LinearLayout\n        android:id=\"@+id/card_actions\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_marginTop=\"@dimen/dialog_button_content_paddingTop\"\n        android:orientation=\"horizontal\" />\n\n\n    </RelativeLayout>\n\n  </LinearLayout>\n\n</merge>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/merge_contact_permission_required.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<merge xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  tools:showIn=\"@layout/fragment_upcoming_events\">\n\n\n\n</merge>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/merge_contact_suggestion_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<merge xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:gravity=\"center_vertical\"\n  tools:orientation=\"horizontal\"\n  tools:parentTag=\"LinearLayout\">\n\n  <ImageView\n    android:id=\"@+id/add_event_event_icon\"\n    android:layout_width=\"@dimen/add_event_image_width\"\n    android:layout_height=\"@dimen/add_event_image_height\"\n    android:scaleType=\"center\"\n    android:src=\"@drawable/ic_person_24dp\" />\n\n  <AutoCompleteTextView\n    android:id=\"@+id/contact_suggestion_autocomplete\"\n    android:layout_width=\"0dp\"\n    android:layout_height=\"match_parent\"\n    android:layout_marginLeft=\"@dimen/padding\"\n    android:layout_marginRight=\"@dimen/padding\"\n    android:layout_weight=\"1\"\n    android:textColor=\"?primaryTextColor\"\n    android:hint=\"@string/addbirthday_autocomplete_hint\"\n     />\n\n  <ImageButton\n    android:id=\"@+id/add_event_remove_contact\"\n    android:layout_width=\"48dp\"\n    android:layout_height=\"48dp\"\n    android:layout_gravity=\"center_vertical\"\n    android:background=\"@drawable/selectable_back_no_bounds\"\n    android:src=\"@drawable/ic_clear\"\n    android:visibility=\"gone\"\n    tools:visibility=\"visible\" />\n\n</merge>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/merge_daymarker.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:layout_width=\"@dimen/size_daymarker\"\n  android:layout_height=\"@dimen/size_daymarker\"\n  android:gravity=\"center\"\n  android:orientation=\"vertical\">\n\n\n  <TextView\n    android:id=\"@+id/daycircle_dayofweek\"\n    style=\"@style/DayCircle.Day\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:includeFontPadding=\"false\"\n    tools:text=\"ΠΑΡ\"\n    tools:textColor=\"@color/past_date_grey\" />\n\n  <TextView\n    android:id=\"@+id/daycircle_dateofmonth\"\n    style=\"@style/DayCircle.Date\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:includeFontPadding=\"false\"\n    tools:text=\"24\"\n    tools:textColor=\"@color/past_date_grey\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/merge_donation_banner_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<merge xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  tools:layout_height=\"wrap_content\"\n  tools:layout_width=\"match_parent\"\n  tools:orientation=\"horizontal\"\n  tools:parentTag=\"android.widget.LinearLayout\">\n\n\n  <LinearLayout\n    android:id=\"@+id/banner_ad_holder\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.google.android.gms.ads.AdView\n      android:id=\"@+id/banner_ad\"\n      android:layout_width=\"0dp\"\n      android:layout_height=\"wrap_content\"\n      android:layout_weight=\"1\"\n      app:adSize=\"BANNER\"\n      app:adUnitId=\"@string/admob_unit_id\" />\n\n    <ImageButton\n      android:id=\"@+id/banner_close\"\n      android:layout_width=\"48dp\"\n      android:layout_height=\"48dp\"\n      android:layout_marginLeft=\"8dp\"\n      android:background=\"?android:selectableItemBackground\"\n      android:minHeight=\"56dp\"\n      android:src=\"@drawable/ic_close_black\" />\n  </LinearLayout>\n\n  <android.support.v7.widget.AppCompatButton\n    android:id=\"@+id/banner_support_holder\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:minHeight=\"56dp\"\n    android:text=\"@string/support_app\"\n    android:textColor=\"?primaryTextColorInverse\"\n    android:visibility=\"gone\"\n    app:backgroundTint=\"?colorAccent\" />\n\n</merge>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/merge_dummy_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<merge xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n\n</merge>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/merge_logo_view.xml",
    "content": "<merge xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  tools:layout_height=\"wrap_content\"\n  tools:layout_width=\"wrap_content\"\n  tools:orientation=\"vertical\"\n  tools:parentTag=\"RelativeLayout\">\n\n  <TextView\n    android:id=\"@+id/logo_view_app_version\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_alignRight=\"@+id/logo_view_app_name\"\n    android:fontFamily=\"sans-serif-light\"\n    android:lines=\"1\"\n    android:textSize=\"12sp\"\n    tools:text=\"v1.2.3\" />\n\n  <TextView\n    android:id=\"@id/logo_view_app_name\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_below=\"@id/logo_view_app_version\"\n    android:includeFontPadding=\"false\"\n    android:text=\"memento\"\n    android:textColor=\"?colorPrimary\"\n    android:textSize=\"36sp\" />\n\n</merge>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/merge_memento_toolbar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<merge xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n  <android.support.v7.widget.Toolbar\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/colorPrimary\"\n    android:elevation=\"4dp\" />\n</merge>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/merge_namedaycardview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<merge xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\">\n\n  <LinearLayout\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:clickable=\"false\"\n    android:focusable=\"false\"\n    android:orientation=\"vertical\">\n\n    <LinearLayout\n      android:layout_width=\"match_parent\"\n      android:layout_height=\"wrap_content\"\n      android:orientation=\"vertical\"\n      android:paddingLeft=\"@dimen/card_content_padding\"\n      android:paddingRight=\"@dimen/card_content_padding\"\n      android:paddingTop=\"@dimen/card_content_padding\">\n\n      <TextView\n        style=\"@style/Card.Header\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:singleLine=\"true\"\n        android:text=\"@string/namedays\" />\n\n      <TextView\n        android:id=\"@+id/namedaycard_names\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"@dimen/card_content_padding\"\n        android:layout_marginTop=\"@dimen/card_content_padding\"\n        android:textAppearance=\"@style/Card\"\n        tools:text=\"@string/namedays_no_names\" />\n    </LinearLayout>\n\n    <com.alexstyl.specialdates.ui.HorizontalDivider style=\"@style/Divider\" />\n\n    <Button\n      android:id=\"@+id/namedays_card_share\"\n      style=\"@style/TouchTarget\"\n      android:layout_width=\"match_parent\"\n      android:layout_height=\"wrap_content\"\n      android:text=\"@string/share\"\n      android:visibility=\"gone\"\n      tools:visibility=\"visible\" />\n\n  </LinearLayout>\n</merge>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/merge_no_contact_events.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--<merge xmlns:android=\"http://schemas.android.com/apk/res/android\">-->\n<merge xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <TextView\n        android:id=\"@android:id/empty\"\n        style=\"@style/NoContacts.Text\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"center\"\n        android:text=\"@string/no_contacts_text\" />\n\n\n</merge>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/merge_searchbar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<merge xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  tools:showIn=\"@layout/activity_search\">\n\n  <com.alexstyl.specialdates.search.BackKeyEditText\n    android:id=\"@+id/toolbar_search_edittext\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"@null\"\n    android:imeOptions=\"actionSearch\"\n    android:inputType=\"text\"\n    android:maxLines=\"1\"\n    android:textAppearance=\"@style/TextAppearance.Widget.AppCompat.Toolbar.Subtitle\" />\n\n</merge>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/merge_upcoming_widget_configure_panel.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<merge xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:clipToPadding=\"false\"\n    tools:layout_height=\"wrap_content\"\n    tools:layout_width=\"match_parent\"\n    tools:parentTag=\"android.support.constraint.ConstraintLayout\">\n\n    <TextView\n        android:id=\"@+id/textView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginLeft=\"16dp\"\n        android:layout_marginStart=\"16dp\"\n        android:gravity=\"center_vertical\"\n        android:minHeight=\"56dp\"\n        android:text=\"@string/Use_dark_theme\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <android.support.v7.widget.SwitchCompat\n        android:id=\"@+id/upcoming_widget_dark_theme\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginRight=\"16dp\"\n        android:layout_marginTop=\"8dp\"\n        android:minHeight=\"36dp\"\n        app:layout_constraintBottom_toBottomOf=\"@+id/textView\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"@+id/textView\" />\n\n\n    <TextView\n        android:id=\"@+id/textView2\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginLeft=\"16dp\"\n        android:layout_marginRight=\"16dp\"\n        android:text=\"@string/Opacity\"\n        android:textAppearance=\"@style/Memento.TextAppearance.ListSeparator\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/textView\" />\n\n    <SeekBar\n        android:id=\"@+id/upcoming_widget_opacity\"\n        style=\"@style/UpcomingWidget.Seekbar\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginLeft=\"16dp\"\n        android:layout_marginRight=\"16dp\"\n        android:layout_marginStart=\"16dp\"\n        android:minHeight=\"56dp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/textView2\" />\n\n\n    <Button\n        android:id=\"@+id/upcoming_widget_apply\"\n        style=\"@style/Base.Widget.AppCompat.Button.Colored\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"8dp\"\n        android:layout_marginEnd=\"8dp\"\n        android:layout_marginLeft=\"8dp\"\n        android:layout_marginRight=\"8dp\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_marginTop=\"8dp\"\n        android:minHeight=\"56dp\"\n        android:text=\"@string/Apply\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/upcoming_widget_opacity\"\n        app:layout_constraintVertical_bias=\"1\" />\n\n\n</merge>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/merge_upcoming_widget_preview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<merge xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    tools:background=\"#00ff00\"\n    tools:layout_height=\"wrap_content\"\n    tools:layout_width=\"match_parent\"\n    tools:parentTag=\"android.widget.FrameLayout\">\n\n    <include\n        layout=\"@layout/widget_today\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center_vertical\"\n        android:layout_margin=\"8dp\"\n        android:elevation=\"8dp\" />\n\n</merge>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/nameday_date.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@android:id/text1\"\n    style=\"@style/Card\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"@drawable/selectable_back\"\n    android:gravity=\"center_vertical\"\n    android:minHeight=\"48dp\" />\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/names_suggestions.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.v7.widget.RecyclerView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:id=\"@+id/nameday_suggestions\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"38dp\"\n  android:layout_gravity=\"top\"\n\n  android:background=\"@drawable/background_suggestions\"\n  android:clipChildren=\"false\"\n  android:clipToPadding=\"false\"\n  android:paddingBottom=\"4dp\"\n  android:paddingLeft=\"@dimen/card_padding_from_screen\"\n  android:paddingRight=\"@dimen/card_padding_from_screen\"\n  android:paddingTop=\"4dp\" />\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/navigation_header.xml",
    "content": "<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:padding=\"16dp\">\n\n  <com.alexstyl.specialdates.ui.widget.LogoView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"center_horizontal\"\n    android:layout_marginTop=\"36dp\" />\n\n</FrameLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/navigation_new_feature.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:layout_width=\"wrap_content\"\n  android:layout_height=\"match_parent\"\n  android:gravity=\"center_vertical\"\n  android:text=\"@string/New\"\n  android:textAllCaps=\"true\"\n  android:textColor=\"@color/primary_red\"\n  android:textSize=\"12sp\"\n  android:textStyle=\"bold\" />\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/page_person_items.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.v7.widget.RecyclerView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:id=\"@+id/page_person_list\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"match_parent\" />\n\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/preference_list_fragment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n/*\n** Copyright 2010, The Android Open Source Project\n**\n** Licensed under the Apache License, Version 2.0 (the \"License\");\n** you may not use this file except in compliance with the License.\n** You may obtain a copy of the License at\n**\n**     http://www.apache.org/licenses/LICENSE-2.0\n**\n** Unless required by applicable law or agreed to in writing, software\n** distributed under the License is distributed on an \"AS IS\" BASIS,\n** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n** See the License for the specific language governing permissions and\n** limitations under the License.\n*/\n-->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:orientation=\"vertical\"\n    android:layout_height=\"fill_parent\"\n    android:layout_width=\"fill_parent\"\n    android:background=\"@android:color/transparent\">\n\n    <ListView android:id=\"@android:id/list\"\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"0px\"\n        android:layout_weight=\"1\"\n        android:paddingTop=\"0dip\"\n        android:paddingBottom=\"@dimen/preference_fragment_padding_bottom\"\n        android:paddingLeft=\"@dimen/preference_fragment_padding_side\"\n        android:paddingRight=\"@dimen/preference_fragment_padding_side\"\n        android:scrollbarStyle=\"@integer/preference_fragment_scrollbarStyle\"\n        android:clipToPadding=\"false\"\n        android:drawSelectorOnTop=\"false\"\n        android:cacheColorHint=\"@android:color/transparent\"\n        android:scrollbarAlwaysDrawVerticalTrack=\"true\" />\n\n    <TextView android:id=\"@android:id/empty\"\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"fill_parent\"\n        android:padding=\"@dimen/preference_fragment_padding_side\"\n        android:gravity=\"center\"\n        android:visibility=\"gone\" />\n\n    <RelativeLayout android:id=\"@+id/button_bar\"\n        android:layout_height=\"wrap_content\"\n        android:layout_width=\"fill_parent\"\n        android:layout_weight=\"0\"\n        android:visibility=\"gone\">\n\n        <Button android:id=\"@+id/back_button\"\n            android:layout_width=\"150dip\"\n            android:layout_height=\"wrap_content\"\n            android:layout_margin=\"5dip\"\n            android:layout_alignParentLeft=\"true\"\n            android:text=\"@string/back_button_label\"\n        />\n        <LinearLayout\n            android:orientation=\"horizontal\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentRight=\"true\">\n\n            <Button android:id=\"@+id/skip_button\"\n                android:layout_width=\"150dip\"\n                android:layout_height=\"wrap_content\"\n                android:layout_margin=\"5dip\"\n                android:text=\"@string/skip_button_label\"\n                android:visibility=\"gone\"\n            />\n\n            <Button android:id=\"@+id/next_button\"\n                android:layout_width=\"150dip\"\n                android:layout_height=\"wrap_content\"\n                android:layout_margin=\"5dip\"\n                android:text=\"@string/next_button_label\"\n            />\n        </LinearLayout>\n    </RelativeLayout>\n</LinearLayout>"
  },
  {
    "path": "android_mobile/src/main/res/layout/preference_theme_select.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"match_parent\"\n  android:orientation=\"horizontal\">\n\n  <TextView\n    android:layout_width=\"0dp\"\n    android:layout_height=\"wrap_content\"\n    android:layout_weight=\"1\"\n    android:gravity=\"center_vertical\"\n    android:minHeight=\"?attr/listPreferredItemHeight\"\n    android:text=\"@string/theme_preference_title\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/row_account.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:minHeight=\"52dp\"\n  android:orientation=\"horizontal\">\n\n  <ImageView\n    android:id=\"@+id/account_icon\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    tools:src=\"@mipmap/ic_launcher\" />\n\n  <TextView\n    android:id=\"@+id/account_name\"\n    android:layout_width=\"0dp\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"center_vertical\"\n    android:layout_marginLeft=\"@dimen/list_padding_horizontal\"\n    android:layout_marginRight=\"@dimen/list_padding_horizontal\"\n    android:layout_weight=\"1\"\n    tools:text=\"Account name\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/row_add_event_contact_event.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:gravity=\"center_vertical\"\n  android:orientation=\"horizontal\">\n\n  <ImageView\n    android:id=\"@+id/add_event_event_icon\"\n    android:layout_width=\"@dimen/add_event_image_width\"\n    android:layout_height=\"@dimen/add_event_image_height\"\n    android:scaleType=\"center\"\n    tools:src=\"@drawable/ic_cake\" />\n\n  <TextView\n    android:id=\"@+id/add_event_date_picker\"\n    style=\"@style/Widget.AppCompat.EditText\"\n    android:layout_width=\"0dp\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginLeft=\"@dimen/padding\"\n    android:layout_marginRight=\"@dimen/padding\"\n    android:layout_weight=\"1\"\n    android:clickable=\"false\"\n    android:focusable=\"false\"\n    tools:hint=\"@string/birthday\" />\n\n  <ImageButton\n    android:id=\"@+id/add_event_remove_event\"\n    android:layout_width=\"48dp\"\n    android:layout_height=\"48dp\"\n    android:background=\"@drawable/selectable_back_no_bounds\"\n    android:src=\"@drawable/ic_clear\" />\n\n\n</LinearLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/row_add_event_contact_suggestion.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.alexstyl.specialdates.addevent.ui.ContactSuggestionView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:id=\"@+id/add_event_contact_autocomplete\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:layout_below=\"@id/add_event_avatar\"\n  android:inputType=\"textPersonName\"\n  android:maxLines=\"1\" />\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/row_contact.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.alexstyl.specialdates.ui.widget.ForegroundLinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"horizontal\"\n    android:padding=\"8dp\"\n    app:foreground=\"@drawable/selectable_back\">\n\n    <com.alexstyl.specialdates.ui.widget.ColorImageView\n        android:id=\"@+id/search_result_avatar\"\n        android:layout_width=\"@dimen/avatar_size_min\"\n        android:layout_height=\"@dimen/avatar_size_min\"\n        app:isCircle=\"true\"\n        app:letterSize=\"18sp\" />\n\n    <TextView\n        android:id=\"@+id/display_name\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_marginLeft=\"16dp\"\n        android:layout_marginRight=\"16dp\"\n        android:gravity=\"center_vertical\"\n        android:textColor=\"@android:color/black\"\n        tools:text=\"Display Name\" />\n</com.alexstyl.specialdates.ui.widget.ForegroundLinearLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/row_datatype.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:gravity=\"center_vertical\"\n    android:minHeight=\"?android:attr/listPreferredItemHeight\"\n    android:orientation=\"vertical\"\n    android:paddingLeft=\"@dimen/padding\"\n    android:paddingRight=\"@dimen/padding\" >\n\n    <TextView\n        android:id=\"@android:id/text1\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"Home\"\n        android:textAppearance=\"@style/TextAppearance.BloodCherry.NumberPickerTitle\" />\n\n    <TextView\n        android:id=\"@android:id/text2\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"2dp\"\n        android:text=\"30697xxxxxxx\"\n        android:textAppearance=\"@style/TextAppearance.BloodCherry.NumberPickerSummary\" />\n\n</LinearLayout>"
  },
  {
    "path": "android_mobile/src/main/res/layout/row_image_option.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:gravity=\"center_horizontal\"\n  android:orientation=\"vertical\">\n\n  <ImageView\n    android:id=\"@+id/pick_image_activity_icon\"\n    android:layout_width=\"48dp\"\n    android:layout_height=\"48dp\"\n    tools:src=\"@mipmap/ic_launcher\" />\n\n  <TextView\n    android:id=\"@+id/pick_image_activity_label\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginTop=\"12dp\"\n    android:gravity=\"center_horizontal\"\n    android:lines=\"2\"\n    android:textSize=\"14sp\"\n    tools:text=\"@string/app_name\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/row_nameday_checkbox.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<CheckedTextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"48dp\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:checkMark=\"?android:attr/listChoiceIndicatorMultiple\"\n    android:clickable=\"true\"\n    android:gravity=\"center_vertical\"\n    android:orientation=\"horizontal\"\n    android:text=\"30 February\" />"
  },
  {
    "path": "android_mobile/src/main/res/layout/row_nameday_contact.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.alexstyl.specialdates.ui.widget.ForegroundLinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:gravity=\"center_vertical\"\n    android:minHeight=\"@dimen/nameday_item_minheight\"\n    android:orientation=\"horizontal\"\n    app:foreground=\"@drawable/selectable_back\">\n\n    <com.alexstyl.specialdates.ui.widget.ColorImageView\n        android:id=\"@+id/row_nameday_contact_avatar\"\n        android:layout_width=\"40dp\"\n        android:layout_height=\"40dp\"\n        app:isCircle=\"true\"\n        tools:src=\"@mipmap/ic_launcher\" />\n\n    <TextView\n        android:id=\"@+id/row_nameday_contact_name\"\n        style=\"@style/NamedayScreen.Text.ContactName\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginLeft=\"20dp\"\n        tools:text=\"Αναστασία Κάτρανίδου\" />\n\n</com.alexstyl.specialdates.ui.widget.ForegroundLinearLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/row_nameday_name.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:id=\"@+id/nameday_name\"\n  style=\"@style/NamedayScreen.Text.Name\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:gravity=\"center_vertical\"\n  android:minHeight=\"@dimen/nameday_item_minheight\"\n  tools:text=\"Αλέξανδρος\" />\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/row_no_search_results.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:id=\"@android:id/text1\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:fontFamily=\"sans-serif-light\"\n  android:gravity=\"center\"\n  android:text=\"@string/no_results_found\"\n  android:textAppearance=\"@style/TextAppearance.AppCompat.Light.SearchResult.Subtitle\" />\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/row_people.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.alexstyl.specialdates.ui.widget.ForegroundLinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  app:foreground=\"?android:attr/selectableItemBackground\"\n  android:gravity=\"center_vertical\"\n  android:minHeight=\"56dp\"\n  android:orientation=\"horizontal\"\n  android:paddingLeft=\"16dp\"\n  android:paddingRight=\"16dp\"\n  tools:background=\"#31225b61\">\n\n  <com.alexstyl.specialdates.ui.widget.ColorImageView\n    android:id=\"@+id/people_avatar\"\n    android:layout_width=\"48dp\"\n    android:layout_height=\"48dp\"\n    app:isCircle=\"true\" />\n\n  <TextView\n    android:id=\"@+id/people_name\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginLeft=\"30dp\"\n    android:textColor=\"@color/black_light\"\n    tools:text=\"Hello FriendArin\" />\n\n</com.alexstyl.specialdates.ui.widget.ForegroundLinearLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/row_people_import_from_facebook.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.alexstyl.specialdates.ui.widget.ForegroundLinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:gravity=\"center_vertical\"\n  android:minHeight=\"52dp\"\n  android:orientation=\"horizontal\"\n  android:paddingLeft=\"16dp\"\n  android:paddingRight=\"16dp\"\n  app:foreground=\"?android:attr/selectableItemBackground\">\n\n  <ImageView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:src=\"@drawable/ic_facebook_import_friends\" />\n\n  <TextView\n    android:id=\"@+id/row_people_facebook_import\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginLeft=\"30dp\"\n    android:textColor=\"@color/black_light\"\n    tools:text=\"@string/title_facebook_friends_import\" />\n\n</com.alexstyl.specialdates.ui.widget.ForegroundLinearLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/row_people_no_contacts.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.alexstyl.specialdates.ui.widget.ForegroundLinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:gravity=\"center_vertical\"\n  android:minHeight=\"52dp\"\n  android:orientation=\"horizontal\"\n  android:paddingLeft=\"16dp\"\n  android:paddingRight=\"16dp\"\n  app:foreground=\"?android:attr/selectableItemBackground\">\n\n  <ImageView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:src=\"@drawable/ic_add_contact_42px\" />\n\n  <TextView\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginLeft=\"30dp\"\n    android:text=\"@string/no_contacts_text\"\n    android:textColor=\"@color/black_light\" />\n\n</com.alexstyl.specialdates.ui.widget.ForegroundLinearLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/row_person_action.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.alexstyl.specialdates.ui.MementoCardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:orientation=\"vertical\"\n  android:paddingBottom=\"10dp\"\n  android:paddingLeft=\"16dp\"\n  android:paddingRight=\"16dp\"\n  android:paddingTop=\"10dp\">\n\n  <LinearLayout\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"@drawable/selectable_back\"\n    android:gravity=\"center_vertical\"\n    android:orientation=\"horizontal\"\n    android:padding=\"20dp\">\n\n    <ImageView\n      android:id=\"@+id/row_person_call_icon\"\n      android:layout_width=\"22dp\"\n      android:layout_height=\"22dp\"\n      android:layout_marginEnd=\"22dp\"\n      android:layout_marginRight=\"22dp\"\n      tools:tint=\"?colorAccent\"\n      tools:src=\"@drawable/ic_call\" />\n\n    <LinearLayout\n      android:layout_width=\"match_parent\"\n      android:layout_height=\"wrap_content\"\n      android:gravity=\"center_vertical\"\n      android:orientation=\"vertical\">\n\n      <TextView\n        android:id=\"@+id/row_person_call_number\"\n        style=\"@style/Person.Text\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:fontFamily=\"sans-serif-condensed\"\n        android:textColor=\"?colorAccent\"\n        tools:text=\"(555) 54-23-493\" />\n\n      <TextView\n        android:id=\"@+id/row_person_action_type\"\n        style=\"@style/Person.Text\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"6dp\"\n        android:fontFamily=\"sans-serif-condensed\"\n        android:textColor=\"#a0000000\"\n        tools:text=\"Home\" />\n    </LinearLayout>\n  </LinearLayout>\n\n</com.alexstyl.specialdates.ui.MementoCardView>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/row_person_event.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:background=\"@drawable/selectable_back\"\n  android:orientation=\"vertical\"\n  android:paddingBottom=\"10dp\"\n  android:paddingLeft=\"16dp\"\n  android:paddingRight=\"16dp\"\n  android:paddingTop=\"10dp\">\n\n  <TextView\n    android:id=\"@+id/row_person_event_title\"\n    style=\"@style/Person.Text\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:fontFamily=\"sans-serif-condensed\"\n    android:textColor=\"?colorAccent\"\n    tools:text=\"Birthday\" />\n\n  <TextView\n    android:id=\"@+id/row_person_event_date\"\n    style=\"@style/Person.Text\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginTop=\"6dp\"\n    android:fontFamily=\"sans-serif-condensed\"\n    android:textColor=\"#000\"\n    tools:text=\"29 March, 1990\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/row_search_result_contact_event.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<com.alexstyl.specialdates.ui.MementoCardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  style=\"@style/CardViewStyle\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\">\n\n  <LinearLayout\n    style=\"@style/SearchResult.Card\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"horizontal\">\n\n    <com.alexstyl.specialdates.ui.widget.ColorImageView\n      android:id=\"@+id/search_result_avatar\"\n      style=\"@style/SearchResult.Avatar\"\n      tools:background=\"#000\" />\n\n    <LinearLayout\n      android:layout_width=\"match_parent\"\n      android:layout_height=\"wrap_content\"\n      android:layout_gravity=\"center_vertical\"\n      android:layout_marginLeft=\"@dimen/card_content_padding\"\n      android:layout_marginRight=\"@dimen/card_content_padding\"\n      android:orientation=\"vertical\">\n\n      <TextView\n        android:id=\"@+id/search_result_contact_name\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        style=\"@style/SearchResult.ContactName\"\n        tools:text=\"Darth Vader\" />\n\n      <TextView\n        android:id=\"@+id/search_result_event_label\"\n        style=\"@style/SearchResult.EventLabel\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        tools:text=\"Birthday on December 12\"\n        tools:textColor=\"@color/birthday_red\" />\n\n    </LinearLayout>\n  </LinearLayout>\n</com.alexstyl.specialdates.ui.MementoCardView>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/row_suggested_name.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.alexstyl.specialdates.ui.MementoCardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  style=\"@style/CardViewStyle\"\n  android:layout_width=\"wrap_content\"\n  android:layout_height=\"wrap_content\"\n  android:layout_marginLeft=\"1dp\"\n  android:layout_marginRight=\"1dp\"\n  android:addStatesFromChildren=\"true\"\n  android:clipChildren=\"false\"\n  app:cardBackgroundColor=\"?attr/colorAccent\">\n\n  <TextView\n    android:id=\"@+id/suggested_name_text\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:gravity=\"center_vertical|center_horizontal\"\n    android:minHeight=\"48dp\"\n    android:minWidth=\"88dp\"\n    android:textColor=\"@color/main_white\"\n    tools:text=\"Alex\" />\n\n</com.alexstyl.specialdates.ui.MementoCardView>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/row_theme_select.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:padding=\"8dp\">\n\n    <com.alexstyl.specialdates.ui.widget.ForegroundLinearLayout\n        android:id=\"@+id/themeSelect_primary_color\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"@color/nameday_blue\"\n        android:gravity=\"center_vertical\"\n        android:minHeight=\"48dp\"\n        android:orientation=\"horizontal\"\n        android:paddingLeft=\"@dimen/card_padding_from_screen\"\n        android:paddingRight=\"@dimen/card_padding_from_screen\"\n        app:foreground=\"@drawable/selectable_background_dayslight\">\n\n        <TextView\n            android:id=\"@+id/themeSelect_name\"\n            style=\"@style/TextAppearance.AppCompat.Title\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_weight=\"1\"\n            android:padding=\"8dp\"\n            tools:text=\"Theme Name\" />\n\n        <View\n            android:id=\"@+id/themeSelect_accent_color\"\n            android:layout_width=\"28dp\"\n            android:layout_height=\"28dp\"\n            android:clickable=\"false\"\n            android:focusable=\"false\"\n            android:padding=\"8dp\"\n            tools:background=\"@color/primary_red\" />\n\n    </com.alexstyl.specialdates.ui.widget.ForegroundLinearLayout>\n</FrameLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/row_upcoming_events_bankholiday.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.v7.widget.CardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\">\n\n  <LinearLayout\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginBottom=\"10dp\"\n    android:layout_marginLeft=\"16dp\"\n    android:layout_marginRight=\"16dp\"\n    android:layout_marginTop=\"10dp\"\n    android:orientation=\"vertical\">\n\n    <TextView\n      style=\"@style/Upcoming.Text.Header\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:text=\"@string/Bank_holiday\"\n      android:textColor=\"@color/bankholiday_green\" />\n\n    <TextView\n      android:id=\"@+id/row_upcoming_bankholiday\"\n      style=\"@style/Upcoming.Text.Content\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:layout_marginTop=\"@dimen/upcoming_space_between_title_and_content\"\n      tools:text=\"October Fest\" />\n\n  </LinearLayout>\n\n</android.support.v7.widget.CardView>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/row_upcoming_events_contact_event.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.v7.widget.CardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:foreground=\"?android:attr/selectableItemBackground\">\n\n  <LinearLayout\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:gravity=\"center_vertical\"\n    android:orientation=\"horizontal\">\n\n    <com.alexstyl.specialdates.ui.widget.ColorImageView\n      android:id=\"@+id/row_upcoming_event_contact_image\"\n      style=\"@style/Upcoming.Avatar\"\n      android:layout_marginBottom=\"10dp\"\n      android:layout_marginLeft=\"16dp\"\n      android:layout_marginRight=\"16dp\"\n      android:layout_marginTop=\"10dp\"\n      tools:background=\"#000\" />\n\n    <LinearLayout\n      android:layout_width=\"0dp\"\n      android:layout_height=\"wrap_content\"\n      android:layout_weight=\"1\"\n      android:orientation=\"vertical\">\n\n      <TextView\n        android:id=\"@+id/row_upcoming_event_contact_name\"\n        style=\"@style/Upcoming.Text\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        tools:text=\"Alex Styl\" />\n\n      <TextView\n        android:id=\"@+id/row_upcoming_event_contact_event\"\n        style=\"@style/Upcoming.Text\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8sp\"\n        tools:text=\"Turns 26\"\n        tools:textColor=\"@color/anniversary_yellow\" />\n\n    </LinearLayout>\n\n  </LinearLayout>\n</android.support.v7.widget.CardView>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/row_upcoming_events_date_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:id=\"@+id/upcoming_event_date_header\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:gravity=\"center_vertical\"\n  android:textAllCaps=\"true\"\n  tools:textColor=\"@color/upcoming_header_text_color\"\n  android:textSize=\"14sp\"\n  android:textStyle=\"bold\"\n  tools:text=\"February 24, Sunday\" />\n\n\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/row_upcoming_events_nameday.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.v7.widget.CardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:foreground=\"?android:attr/selectableItemBackground\">\n\n  <LinearLayout\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginBottom=\"10dp\"\n    android:layout_marginLeft=\"16dp\"\n    android:layout_marginRight=\"16dp\"\n    android:layout_marginTop=\"10dp\"\n    android:orientation=\"vertical\">\n\n    <TextView\n      style=\"@style/Upcoming.Text.Header\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:text=\"@string/namedays\"\n      android:textColor=\"@color/nameday_blue\" />\n\n    <TextView\n      android:id=\"@+id/row_upcoming_namedays\"\n      style=\"@style/Upcoming.Text.Content\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:layout_marginTop=\"@dimen/upcoming_space_between_title_and_content\"\n      android:ellipsize=\"end\"\n      tools:text=\"Πέτρος, Μάκης, Δήμητρα, Μαρία και πόοοοοοσι ακόμα, πωπω, πόσα ονόματα γιορτάζουν πια σε αυτή την ημέρα είναι τρελό\" />\n\n  </LinearLayout>\n\n</android.support.v7.widget.CardView>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/toolbar_search.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.v7.widget.Toolbar xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:id=\"@+id/memento_toolbar\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:background=\"@drawable/card_no_paddings\"\n  tools:targetApi=\"lollipop\">\n\n  <TextView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:drawablePadding=\"@dimen/card_padding_from_screen\"\n    android:gravity=\"center_vertical\"\n    android:lines=\"1\"\n    android:text=\"@string/search_hint_contacts\"\n    android:textColor=\"@color/search_hint_color\" />\n\n</android.support.v7.widget.Toolbar>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/widget_loading.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:id=\"@+id/upcoming_widget_background\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:orientation=\"horizontal\"\n  android:padding=\"@dimen/widget_margin\">\n\n  <LinearLayout\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"@dimen/avatar_size\"\n    android:background=\"@drawable/card_no_paddings\"\n    android:gravity=\"center_vertical\"\n    android:orientation=\"vertical\">\n\n    <ProgressBar\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:layout_gravity=\"center\" />\n\n  </LinearLayout>\n\n</LinearLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/widget_prompt_permissions.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"match_parent\"\n  android:background=\"#EF9A9A\"\n  android:gravity=\"center\"\n  android:id=\"@+id/widget_prompt_permission_background\"\n  android:orientation=\"horizontal\">\n\n  <ImageView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"match_parent\"\n    android:importantForAccessibility=\"no\"\n    android:src=\"@mipmap/ic_launcher\" />\n\n  <ImageView\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginLeft=\"@dimen/contact_permission_arrow_horizontal_margin\"\n    android:layout_marginRight=\"@dimen/contact_permission_arrow_horizontal_margin\"\n    android:importantForAccessibility=\"no\"\n    android:src=\"@drawable/ic_arrow_back_white_24dp\" />\n\n  <ImageView\n    android:id=\"@+id/contact_permission_icon\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:importantForAccessibility=\"no\"\n    android:src=\"@drawable/ic_contacts\" />\n</LinearLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/widget_today.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:padding=\"@dimen/widget_margin\">\n\n  <ImageView\n    android:id=\"@+id/upcoming_widget_background_image\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"@dimen/widget_avatar_size\"\n    android:background=\"@android:color/transparent\"\n    tools:background=\"@android:color/black\" />\n\n  <LinearLayout\n    android:id=\"@+id/upcoming_widget_background\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"horizontal\">\n\n    <LinearLayout\n      android:layout_width=\"0dp\"\n      android:layout_height=\"match_parent\"\n      android:layout_weight=\"1\"\n      android:clickable=\"false\"\n      android:focusable=\"false\"\n      android:gravity=\"center_vertical\"\n      android:orientation=\"vertical\"\n      android:paddingLeft=\"@dimen/padding_tight\"\n      android:paddingRight=\"@dimen/padding_tight\">\n\n      <TextView\n        android:id=\"@+id/upcoming_widget_header\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:clickable=\"false\"\n        android:fontFamily=\"sans-serif-condensed\"\n        android:singleLine=\"true\"\n        android:textColor=\"@color/card_text\"\n        android:textSize=\"@dimen/minicard_text_size_header\"\n        tools:text=\"Septeber 3\" />\n\n      <TextView\n        android:id=\"@+id/upcoming_widget_events_text\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:clickable=\"false\"\n        android:paddingTop=\"2sp\"\n        android:textColor=\"@color/card_text\"\n        android:textSize=\"@dimen/minicard_text_size_header\"\n        tools:text=\"Bob Marley and 2 more\" />\n    </LinearLayout>\n\n    <ImageView\n      android:id=\"@+id/widget_avatar\"\n      android:layout_width=\"@dimen/widget_avatar_size\"\n      android:layout_height=\"@dimen/widget_avatar_size\"\n      android:adjustViewBounds=\"true\"\n      android:clickable=\"false\"\n      android:focusable=\"false\"\n      tools:src=\"@drawable/ic_contact_picture\" />\n  </LinearLayout>\n</FrameLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/widget_today_nocontacts.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:padding=\"@dimen/widget_margin\">\n\n  <RelativeLayout\n    android:id=\"@+id/upcoming_widget_background\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"@dimen/avatar_size\"\n    android:background=\"@drawable/card_no_paddings\"\n    android:padding=\"@dimen/padding_tight\">\n\n    <TextView\n      android:id=\"@android:id/text1\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:clickable=\"false\"\n      android:text=\"@string/today_widget_empty\"\n      android:textColor=\"@color/card_text\"\n      android:textSize=\"18sp\" />\n  </RelativeLayout>\n\n</FrameLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/widget_upcoming_events.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:orientation=\"vertical\">\n\n  <LinearLayout\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"@color/teal\"\n    android:gravity=\"center_vertical\"\n    android:orientation=\"horizontal\">\n\n    <TextView\n      android:id=\"@+id/widget_upcoming_events_date\"\n      style=\"@style/Widget.Upcoming.TodayDate\"\n      android:layout_width=\"0dp\"\n      android:layout_height=\"wrap_content\"\n      android:layout_weight=\"1\"\n      android:elevation=\"@dimen/toolbar_elevation\"\n      android:minHeight=\"@dimen/toolbar_minHeight\"\n      tools:text=\"Tuesday, 27 May\" />\n\n    <ImageView\n      android:id=\"@+id/widget_upcoming_events_add_event\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:minHeight=\"48dp\"\n      android:minWidth=\"48dp\"\n      android:scaleType=\"center\"\n      android:src=\"@drawable/ic_content_add\" />\n  </LinearLayout>\n\n  <ListView\n    android:id=\"@+id/widget_upcoming_events_list\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"@color/light_grey\"\n    android:divider=\"@null\"\n    android:dividerHeight=\"20dp\"\n    android:paddingLeft=\"@dimen/upcoming_event_padding_horizontal\"\n    android:paddingRight=\"@dimen/upcoming_event_padding_horizontal\" />\n</LinearLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/widget_upcoming_events_list_contact_event.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:id=\"@+id/widgetrow_upcoming_contact_event\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:foreground=\"?android:attr/selectableItemBackground\">\n\n  <LinearLayout\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:gravity=\"center_vertical\"\n    android:orientation=\"horizontal\">\n\n    <ImageView\n      android:id=\"@+id/row_upcoming_event_contact_image\"\n      style=\"@style/Upcoming.Avatar\"\n      android:layout_marginRight=\"16dp\"\n      tools:background=\"@mipmap/ic_launcher\" />\n\n    <LinearLayout\n      android:layout_width=\"0dp\"\n      android:layout_height=\"wrap_content\"\n      android:layout_weight=\"1\"\n      android:orientation=\"vertical\">\n\n      <TextView\n        android:id=\"@+id/row_upcoming_event_contact_name\"\n        style=\"@style/Widget.Upcoming.Text\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        tools:text=\"Alex Styl\" />\n\n      <TextView\n        android:id=\"@+id/row_upcoming_event_contact_event\"\n        style=\"Upcoming.Text\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8sp\"\n        android:textColor=\"@color/anniversary_yellow\"\n        tools:text=\"Turns 26\" />\n\n    </LinearLayout>\n\n  </LinearLayout>\n</FrameLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/widget_upcoming_events_list_date.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:id=\"@+id/upcoming_event_date_header\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:clickable=\"false\"\n  android:focusable=\"false\"\n  android:gravity=\"center_vertical\"\n  android:paddingTop=\"30sp\"\n  android:textAllCaps=\"true\"\n  android:textColor=\"#B0B0B0\"\n  android:textSize=\"14sp\"\n  android:textStyle=\"bold\"\n  tools:text=\"February 24, Sunday\" />\n\n\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/widget_upcoming_events_list_nameday.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:id=\"@+id/widget_row_upcoming_nameday_background\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:foreground=\"?android:attr/selectableItemBackground\"\n  android:orientation=\"vertical\">\n\n  <TextView\n    style=\"@style/Widget.Upcoming.Header\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"@string/namedays\"\n    android:textColor=\"@color/nameday_blue\" />\n\n  <TextView\n    android:id=\"@+id/row_upcoming_namedays\"\n    style=\"@style/Widget.Upcoming.Text\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginTop=\"@dimen/upcoming_space_between_title_and_content\"\n    tools:text=\"Πέτρος, Μάκης, Δήμητρα, Μαρία και πόοοοοοσι ακόμα, πωπω, πόσα ονόματα γιορτάζουν πια σε αυτή την ημέρα είναι τρελό\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/layout/widget_upcomingevents_list_bankholiday.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:id=\"@+id/widget_row_upcoming_bankholiday_background\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"wrap_content\"\n  android:orientation=\"vertical\">\n\n  <TextView\n    style=\"@style/Widget.Upcoming.Header\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:text=\"@string/Bank_holiday\"\n    android:textColor=\"@color/bankholiday_green\" />\n\n  <TextView\n    android:id=\"@+id/row_upcoming_bankholiday\"\n    style=\"@style/Widget.Upcoming.Text\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginTop=\"@dimen/upcoming_space_between_title_and_content\"\n    tools:text=\"October Fest\" />\n\n</LinearLayout>\n\n"
  },
  {
    "path": "android_mobile/src/main/res/layout-land/activity_add_event.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"match_parent\">\n\n  <com.alexstyl.specialdates.ui.widget.MementoToolbar\n    android:id=\"@+id/memento_toolbar\"\n    style=\"@style/Widget.Memento.Toolbar\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:elevation=\"@dimen/toolbar_elevation\" />\n\n  <com.alexstyl.specialdates.addevent.ui.AvatarPickerView\n    android:id=\"@+id/add_event_avatar\"\n    style=\"@style/CardViewStyle\"\n    android:layout_width=\"240dp\"\n    android:layout_height=\"match_parent\"\n    android:layout_below=\"@id/memento_toolbar\"\n    android:background=\"@color/nameday_blue\" />\n\n  <android.support.v7.widget.RecyclerView\n    android:id=\"@+id/add_event_events\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:layout_below=\"@id/memento_toolbar\"\n    android:layout_toRightOf=\"@id/add_event_avatar\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "android_mobile/src/main/res/menu/menu_date_details.xml",
    "content": "<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto/android\">\n\n    <item\n        android:id=\"@+id/action_hide\"\n        android:icon=\"@drawable/ic_face\"\n        android:title=\"@string/today\"\n        app:showAsAction=\"always\" />\n\n\n</menu>\n"
  },
  {
    "path": "android_mobile/src/main/res/menu/menu_nameday_view.xml",
    "content": "<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:app=\"http://schemas.android.com/apk/res-auto/android\">\n\n  <item\n    android:id=\"@+id/action_share\"\n    android:enabled=\"true\"\n    android:icon=\"@drawable/abc_ic_menu_share_mtrl_alpha\"\n    android:orderInCategory=\"100\"\n    android:title=\"@string/share\"\n    app:showAsAction=\"always\" />\n\n</menu>\n"
  },
  {
    "path": "android_mobile/src/main/res/menu/menu_nav_drawer.xml",
    "content": "<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n  <group android:id=\"@+id/import_events\">\n    <item\n      android:id=\"@+id/nav_import_facebook\"\n      android:icon=\"@drawable/ic_facebook_logo_traced\"\n      android:title=\"@string/title_facebook_friends_import\"\n      app:actionLayout=\"@layout/navigation_new_feature\" />\n  </group>\n\n  <group android:id=\"@+id/open_source\">\n    <item\n      android:id=\"@+id/nav_github_link\"\n      android:icon=\"@drawable/ic_github\"\n      android:title=\"@string/Memento_on_Github\" />\n  </group>\n\n  <group android:id=\"@+id/memento\">\n    <item\n      android:id=\"@+id/nav_donate\"\n      android:icon=\"@drawable/ic_donate\"\n      android:title=\"@string/Donate_Remove_ads\" />\n    <item\n      android:id=\"@+id/nav_invite_friend\"\n      android:icon=\"@drawable/ic_friend_invite\"\n      android:title=\"@string/Invite_friend\" />\n  </group>\n  <item\n    android:id=\"@+id/nav_settings\"\n    android:icon=\"@drawable/ic_settings\"\n    android:title=\"@string/action_settings\" />\n</menu>\n"
  },
  {
    "path": "android_mobile/src/main/res/menu/menu_person_details.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n  <item\n    android:id=\"@+id/menu_view_contact\"\n    android:title=\"@string/View_contact\"\n    app:showAsAction=\"never\" />\n\n</menu>\n"
  },
  {
    "path": "android_mobile/src/main/res/menu/menu_search.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n  <item\n    android:id=\"@+id/action_clear\"\n    android:icon=\"@drawable/ic_clear\"\n    android:title=\"@string/search_clear_title\"\n    app:showAsAction=\"always\" />\n\n</menu>\n"
  },
  {
    "path": "android_mobile/src/main/res/raw/cs_namedays.json",
    "content": "{\"data\":[{\"names\":[\"Karina\"],\"date\":\"2/1\"},{\"names\":[\"Radmila\"],\"date\":\"3/1\"},{\"names\":[\"Diana\"],\"date\":\"4/1\"},{\"names\":[\"Dalimil\"],\"date\":\"5/1\"},{\"names\":[\"Vilma\"],\"date\":\"7/1\"},{\"names\":[\"Čestmír\"],\"date\":\"8/1\"},{\"names\":[\"Vladan\"],\"date\":\"9/1\"},{\"names\":[\"Břetislav\"],\"date\":\"10/1\"},{\"names\":[\"Bohdana\"],\"date\":\"11/1\"},{\"names\":[\"Pravoslav\"],\"date\":\"12/1\"},{\"names\":[\"Edita\"],\"date\":\"13/1\"},{\"names\":[\"Radovan\"],\"date\":\"14/1\"},{\"names\":[\"Alice\"],\"date\":\"15/1\"},{\"names\":[\"Ctirad\"],\"date\":\"16/1\"},{\"names\":[\"Drahoslav\"],\"date\":\"17/1\"},{\"names\":[\"Vladislav\"],\"date\":\"18/1\"},{\"names\":[\"Doubravka\"],\"date\":\"19/1\"},{\"names\":[\"Ilona\"],\"date\":\"20/1\"},{\"names\":[\"Běla\"],\"date\":\"21/1\"},{\"names\":[\"Slavomír\"],\"date\":\"22/1\"},{\"names\":[\"Zdeněk\"],\"date\":\"23/1\"},{\"names\":[\"Milena\"],\"date\":\"24/1\"},{\"names\":[\"Miloš\"],\"date\":\"25/1\"},{\"names\":[\"Zora\"],\"date\":\"26/1\"},{\"names\":[\"Ingrid\"],\"date\":\"27/1\"},{\"names\":[\"Otýlie\"],\"date\":\"28/1\"},{\"names\":[\"Zdislava\"],\"date\":\"29/1\"},{\"names\":[\"Robin\"],\"date\":\"30/1\"},{\"names\":[\"Marika\"],\"date\":\"31/1\"},{\"names\":[\"Hynek\"],\"date\":\"1/2\"},{\"names\":[\"Nela\"],\"date\":\"2/2\"},{\"names\":[\"Blažej\"],\"date\":\"3/2\"},{\"names\":[\"Jarmila\"],\"date\":\"4/2\"},{\"names\":[\"Dobromila\"],\"date\":\"5/2\"},{\"names\":[\"Vanda\"],\"date\":\"6/2\"},{\"names\":[\"Veronika\"],\"date\":\"7/2\"},{\"names\":[\"Milada\"],\"date\":\"8/2\"},{\"names\":[\"Apolena\"],\"date\":\"9/2\"},{\"names\":[\"Mojmír\"],\"date\":\"10/2\"},{\"names\":[\"Božena\"],\"date\":\"11/2\"},{\"names\":[\"Slavěna\"],\"date\":\"12/2\"},{\"names\":[\"Věnceslav\"],\"date\":\"13/2\"},{\"names\":[\"Valentýn\"],\"date\":\"14/2\"},{\"names\":[\"Jiřina\"],\"date\":\"15/2\"},{\"names\":[\"Ljuba\"],\"date\":\"16/2\"},{\"names\":[\"Miloslava\"],\"date\":\"17/2\"},{\"names\":[\"Gizela\"],\"date\":\"18/2\"},{\"names\":[\"Patrik\"],\"date\":\"19/2\"},{\"names\":[\"Oldřich\"],\"date\":\"20/2\"},{\"names\":[\"Lenka\"],\"date\":\"21/2\"},{\"names\":[\"Petr\"],\"date\":\"22/2\"},{\"names\":[\"Svatopluk\"],\"date\":\"23/2\"},{\"names\":[\"Matěj\"],\"date\":\"24/2\"},{\"names\":[\"Liliana\"],\"date\":\"25/2\"},{\"names\":[\"Dorota\"],\"date\":\"26/2\"},{\"names\":[\"Alexandr\"],\"date\":\"27/2\"},{\"names\":[\"Lumír\"],\"date\":\"28/2\"},{\"names\":[\"Horymír\"],\"date\":\"29/2\"},{\"names\":[\"Bedřich\"],\"date\":\"1/3\"},{\"names\":[\"Anežka\"],\"date\":\"2/3\"},{\"names\":[\"Kamil\"],\"date\":\"3/3\"},{\"names\":[\"Stela\"],\"date\":\"4/3\"},{\"names\":[\"Kazimír\"],\"date\":\"5/3\"},{\"names\":[\"Miroslav\"],\"date\":\"6/3\"},{\"names\":[\"Tomáš\"],\"date\":\"7/3\"},{\"names\":[\"Gabriela\"],\"date\":\"8/3\"},{\"names\":[\"Františka\",\"Rebeka\"],\"date\":\"9/3\"},{\"names\":[\"Viktorie\"],\"date\":\"10/3\"},{\"names\":[\"Anděla\"],\"date\":\"11/3\"},{\"names\":[\"Řehoř\"],\"date\":\"12/3\"},{\"names\":[\"Růžena\"],\"date\":\"13/3\"},{\"names\":[\"Rút\",\"Matylda\"],\"date\":\"14/3\"},{\"names\":[\"Ida\"],\"date\":\"15/3\"},{\"names\":[\"Elena\",\"Ella\",\"Herbert\"],\"date\":\"16/3\"},{\"names\":[\"Vlastimil\"],\"date\":\"17/3\"},{\"names\":[\"Eduard\"],\"date\":\"18/3\"},{\"names\":[\"Josef\"],\"date\":\"19/3\"},{\"names\":[\"Světlana\"],\"date\":\"20/3\"},{\"names\":[\"Radek\"],\"date\":\"21/3\"},{\"names\":[\"Leona\"],\"date\":\"22/3\"},{\"names\":[\"Ivona\"],\"date\":\"23/3\"},{\"names\":[\"Gabriel\"],\"date\":\"24/3\"},{\"names\":[\"Marián\"],\"date\":\"25/3\"},{\"names\":[\"Emanuel\"],\"date\":\"26/3\"},{\"names\":[\"Dita\"],\"date\":\"27/3\"},{\"names\":[\"Soňa\"],\"date\":\"28/3\"},{\"names\":[\"Taťána\"],\"date\":\"29/3\"},{\"names\":[\"Arnošt\"],\"date\":\"30/3\"},{\"names\":[\"Kvido\"],\"date\":\"31/3\"},{\"names\":[\"Hugo\"],\"date\":\"1/4\"},{\"names\":[\"Erika\"],\"date\":\"2/4\"},{\"names\":[\"Richard\"],\"date\":\"3/4\"},{\"names\":[\"Ivana\"],\"date\":\"4/4\"},{\"names\":[\"Miroslava\"],\"date\":\"5/4\"},{\"names\":[\"Vendula\"],\"date\":\"6/4\"},{\"names\":[\"Heřman\",\"Hermína\"],\"date\":\"7/4\"},{\"names\":[\"Ema\"],\"date\":\"8/4\"},{\"names\":[\"Dušan\"],\"date\":\"9/4\"},{\"names\":[\"Darja\"],\"date\":\"10/4\"},{\"names\":[\"Izabela\"],\"date\":\"11/4\"},{\"names\":[\"Julius\"],\"date\":\"12/4\"},{\"names\":[\"Aleš\"],\"date\":\"13/4\"},{\"names\":[\"Vincenc\"],\"date\":\"14/4\"},{\"names\":[\"Anastázie\"],\"date\":\"15/4\"},{\"names\":[\"Irena\",\"Bernadeta\"],\"date\":\"16/4\"},{\"names\":[\"Rudolf\"],\"date\":\"17/4\"},{\"names\":[\"Valérie\"],\"date\":\"18/4\"},{\"names\":[\"Rostislav\"],\"date\":\"19/4\"},{\"names\":[\"Marcela\"],\"date\":\"20/4\"},{\"names\":[\"Alexandra\"],\"date\":\"21/4\"},{\"names\":[\"Evženie\"],\"date\":\"22/4\"},{\"names\":[\"Vojtěch\"],\"date\":\"23/4\"},{\"names\":[\"Jiří\"],\"date\":\"24/4\"},{\"names\":[\"Marek\"],\"date\":\"25/4\"},{\"names\":[\"Oto\"],\"date\":\"26/4\"},{\"names\":[\"Jaroslav\"],\"date\":\"27/4\"},{\"names\":[\"Vlastislav\"],\"date\":\"28/4\"},{\"names\":[\"Robert\"],\"date\":\"29/4\"},{\"names\":[\"Blahoslav\"],\"date\":\"30/4\"},{\"names\":[\"Zikmund\"],\"date\":\"2/5\"},{\"names\":[\"Alexej\"],\"date\":\"3/5\"},{\"names\":[\"Květoslav\"],\"date\":\"4/5\"},{\"names\":[\"Klaudie\"],\"date\":\"5/5\"},{\"names\":[\"Radoslav\"],\"date\":\"6/5\"},{\"names\":[\"Stanislav\"],\"date\":\"7/5\"},{\"names\":[\"Ctibor\"],\"date\":\"9/5\"},{\"names\":[\"Blažena\"],\"date\":\"10/5\"},{\"names\":[\"Svatava\"],\"date\":\"11/5\"},{\"names\":[\"Pankrác\"],\"date\":\"12/5\"},{\"names\":[\"Servác\"],\"date\":\"13/5\"},{\"names\":[\"Bonifác\"],\"date\":\"14/5\"},{\"names\":[\"Žofie\"],\"date\":\"15/5\"},{\"names\":[\"Přemysl\"],\"date\":\"16/5\"},{\"names\":[\"Aneta\"],\"date\":\"17/5\"},{\"names\":[\"Nataša\"],\"date\":\"18/5\"},{\"names\":[\"Ivo\"],\"date\":\"19/5\"},{\"names\":[\"Zbyšek\"],\"date\":\"20/5\"},{\"names\":[\"Monika\"],\"date\":\"21/5\"},{\"names\":[\"Emil\"],\"date\":\"22/5\"},{\"names\":[\"Vladimír\"],\"date\":\"23/5\"},{\"names\":[\"JanaaVanesa\"],\"date\":\"24/5\"},{\"names\":[\"Viola\"],\"date\":\"25/5\"},{\"names\":[\"Filip\"],\"date\":\"26/5\"},{\"names\":[\"Valdemar\"],\"date\":\"27/5\"},{\"names\":[\"Vilém\"],\"date\":\"28/5\"},{\"names\":[\"Maxmilián\"],\"date\":\"29/5\"},{\"names\":[\"Ferdinand\"],\"date\":\"30/5\"},{\"names\":[\"Kamila\"],\"date\":\"31/5\"},{\"names\":[\"Laura\"],\"date\":\"1/6\"},{\"names\":[\"Jarmil\"],\"date\":\"2/6\"},{\"names\":[\"Tamara\"],\"date\":\"3/6\"},{\"names\":[\"Dalibor\"],\"date\":\"4/6\"},{\"names\":[\"Dobroslav\"],\"date\":\"5/6\"},{\"names\":[\"Norbert\"],\"date\":\"6/6\"},{\"names\":[\"Iveta\",\"Slavoj\"],\"date\":\"7/6\"},{\"names\":[\"Medard\"],\"date\":\"8/6\"},{\"names\":[\"Stanislava\"],\"date\":\"9/6\"},{\"names\":[\"Gita\"],\"date\":\"10/6\"},{\"names\":[\"Bruno\"],\"date\":\"11/6\"},{\"names\":[\"Antonie\"],\"date\":\"12/6\"},{\"names\":[\"Antonín\"],\"date\":\"13/6\"},{\"names\":[\"Roland\"],\"date\":\"14/6\"},{\"names\":[\"Vít\"],\"date\":\"15/6\"},{\"names\":[\"Zbyněk\"],\"date\":\"16/6\"},{\"names\":[\"Adolf\"],\"date\":\"17/6\"},{\"names\":[\"Milan\"],\"date\":\"18/6\"},{\"names\":[\"Leoš\"],\"date\":\"19/6\"},{\"names\":[\"Květa\"],\"date\":\"20/6\"},{\"names\":[\"Alois\"],\"date\":\"21/6\"},{\"names\":[\"Pavla\"],\"date\":\"22/6\"},{\"names\":[\"Zdeňka\"],\"date\":\"23/6\"},{\"names\":[\"Jan\"],\"date\":\"24/6\"},{\"names\":[\"Ivan\"],\"date\":\"25/6\"},{\"names\":[\"Adriana\"],\"date\":\"26/6\"},{\"names\":[\"Ladislav\"],\"date\":\"27/6\"},{\"names\":[\"Lubomír\"],\"date\":\"28/6\"},{\"names\":[\"PetraPavel\"],\"date\":\"29/6\"},{\"names\":[\"Šárka\"],\"date\":\"30/6\"},{\"names\":[\"Jaroslava\"],\"date\":\"1/7\"},{\"names\":[\"Patricie\"],\"date\":\"2/7\"},{\"names\":[\"Radomír\"],\"date\":\"3/7\"},{\"names\":[\"Prokop\"],\"date\":\"4/7\"},{\"names\":[\"CyrilaMetoděj\"],\"date\":\"5/7\"},{\"names\":[\"Bohuslava\"],\"date\":\"7/7\"},{\"names\":[\"Nora\"],\"date\":\"8/7\"},{\"names\":[\"Berenika\",\"Drahoslava\"],\"date\":\"9/7\"},{\"names\":[\"Libuše\",\"Amálie\"],\"date\":\"10/7\"},{\"names\":[\"Olga\"],\"date\":\"11/7\"},{\"names\":[\"Bořek\"],\"date\":\"12/7\"},{\"names\":[\"Markéta\"],\"date\":\"13/7\"},{\"names\":[\"Karolína\"],\"date\":\"14/7\"},{\"names\":[\"Jindřich\"],\"date\":\"15/7\"},{\"names\":[\"Luboš\"],\"date\":\"16/7\"},{\"names\":[\"Martina\"],\"date\":\"17/7\"},{\"names\":[\"Drahomíra\"],\"date\":\"18/7\"},{\"names\":[\"Čeněk\"],\"date\":\"19/7\"},{\"names\":[\"Ilja\"],\"date\":\"20/7\"},{\"names\":[\"Vítězslav\"],\"date\":\"21/7\"},{\"names\":[\"Magdaléna\"],\"date\":\"22/7\"},{\"names\":[\"Libor\"],\"date\":\"23/7\"},{\"names\":[\"Kristýna\"],\"date\":\"24/7\"},{\"names\":[\"Jakub\"],\"date\":\"25/7\"},{\"names\":[\"Anna\"],\"date\":\"26/7\"},{\"names\":[\"Věroslav\"],\"date\":\"27/7\"},{\"names\":[\"Viktor\"],\"date\":\"28/7\"},{\"names\":[\"Marta\"],\"date\":\"29/7\"},{\"names\":[\"Bořivoj\"],\"date\":\"30/7\"},{\"names\":[\"Ignác\"],\"date\":\"31/7\"},{\"names\":[\"Oskar\"],\"date\":\"1/8\"},{\"names\":[\"Gustav\"],\"date\":\"2/8\"},{\"names\":[\"Miluše\"],\"date\":\"3/8\"},{\"names\":[\"Dominik\"],\"date\":\"4/8\"},{\"names\":[\"Kristián\"],\"date\":\"5/8\"},{\"names\":[\"Oldřiška\"],\"date\":\"6/8\"},{\"names\":[\"Lada\"],\"date\":\"7/8\"},{\"names\":[\"Soběslav\"],\"date\":\"8/8\"},{\"names\":[\"Roman\"],\"date\":\"9/8\"},{\"names\":[\"Vavřinec\"],\"date\":\"10/8\"},{\"names\":[\"Zuzana\"],\"date\":\"11/8\"},{\"names\":[\"Klára\"],\"date\":\"12/8\"},{\"names\":[\"Alena\"],\"date\":\"13/8\"},{\"names\":[\"Alan\"],\"date\":\"14/8\"},{\"names\":[\"Hana\"],\"date\":\"15/8\"},{\"names\":[\"Jáchym\"],\"date\":\"16/8\"},{\"names\":[\"Petra\"],\"date\":\"17/8\"},{\"names\":[\"Helena\"],\"date\":\"18/8\"},{\"names\":[\"Ludvík\"],\"date\":\"19/8\"},{\"names\":[\"Bernard\"],\"date\":\"20/8\"},{\"names\":[\"Johana\"],\"date\":\"21/8\"},{\"names\":[\"Bohuslav\"],\"date\":\"22/8\"},{\"names\":[\"Sandra\"],\"date\":\"23/8\"},{\"names\":[\"Bartoloměj\"],\"date\":\"24/8\"},{\"names\":[\"Radim\"],\"date\":\"25/8\"},{\"names\":[\"Luděk\"],\"date\":\"26/8\"},{\"names\":[\"Otakar\"],\"date\":\"27/8\"},{\"names\":[\"Augustýn\"],\"date\":\"28/8\"},{\"names\":[\"Evelína\"],\"date\":\"29/8\"},{\"names\":[\"Vladěna\"],\"date\":\"30/8\"},{\"names\":[\"Pavlína\"],\"date\":\"31/8\"},{\"names\":[\"Linda\",\"Samuel\"],\"date\":\"1/9\"},{\"names\":[\"Adéla\"],\"date\":\"2/9\"},{\"names\":[\"Bronislav\"],\"date\":\"3/9\"},{\"names\":[\"Jindřiška\"],\"date\":\"4/9\"},{\"names\":[\"Boris\"],\"date\":\"5/9\"},{\"names\":[\"Boleslav\"],\"date\":\"6/9\"},{\"names\":[\"Regína\"],\"date\":\"7/9\"},{\"names\":[\"Mariana\"],\"date\":\"8/9\"},{\"names\":[\"Daniela\"],\"date\":\"9/9\"},{\"names\":[\"Irma\"],\"date\":\"10/9\"},{\"names\":[\"Denisa\"],\"date\":\"11/9\"},{\"names\":[\"Marie\"],\"date\":\"12/9\"},{\"names\":[\"Lubor\"],\"date\":\"13/9\"},{\"names\":[\"Radka\"],\"date\":\"14/9\"},{\"names\":[\"Jolana\"],\"date\":\"15/9\"},{\"names\":[\"Ludmila\"],\"date\":\"16/9\"},{\"names\":[\"Naděžda\"],\"date\":\"17/9\"},{\"names\":[\"Kryštof\"],\"date\":\"18/9\"},{\"names\":[\"Zita\"],\"date\":\"19/9\"},{\"names\":[\"Oleg\"],\"date\":\"20/9\"},{\"names\":[\"Matouš\"],\"date\":\"21/9\"},{\"names\":[\"Darina\"],\"date\":\"22/9\"},{\"names\":[\"Berta\"],\"date\":\"23/9\"},{\"names\":[\"Jaromír\"],\"date\":\"24/9\"},{\"names\":[\"Zlata\"],\"date\":\"25/9\"},{\"names\":[\"Andrea\"],\"date\":\"26/9\"},{\"names\":[\"Jonáš\"],\"date\":\"27/9\"},{\"names\":[\"Václav\"],\"date\":\"28/9\"},{\"names\":[\"Michal\",\"Michael\"],\"date\":\"29/9\"},{\"names\":[\"Jeroným\"],\"date\":\"30/9\"},{\"names\":[\"Igor\"],\"date\":\"1/10\"},{\"names\":[\"Olivie\",\"Oliver\"],\"date\":\"2/10\"},{\"names\":[\"Bohumil\"],\"date\":\"3/10\"},{\"names\":[\"František\"],\"date\":\"4/10\"},{\"names\":[\"Eliška\"],\"date\":\"5/10\"},{\"names\":[\"Hanuš\"],\"date\":\"6/10\"},{\"names\":[\"Justýna\"],\"date\":\"7/10\"},{\"names\":[\"Věra\"],\"date\":\"8/10\"},{\"names\":[\"Štefan\",\"Sára\"],\"date\":\"9/10\"},{\"names\":[\"Marina\"],\"date\":\"10/10\"},{\"names\":[\"Andrej\"],\"date\":\"11/10\"},{\"names\":[\"Marcel\"],\"date\":\"12/10\"},{\"names\":[\"Renáta\"],\"date\":\"13/10\"},{\"names\":[\"Agáta\"],\"date\":\"14/10\"},{\"names\":[\"Tereza\"],\"date\":\"15/10\"},{\"names\":[\"Havel\"],\"date\":\"16/10\"},{\"names\":[\"Hedvika\"],\"date\":\"17/10\"},{\"names\":[\"Lukáš\"],\"date\":\"18/10\"},{\"names\":[\"Michaela\",\"Michala\"],\"date\":\"19/10\"},{\"names\":[\"Vendelín\"],\"date\":\"20/10\"},{\"names\":[\"Brigita\"],\"date\":\"21/10\"},{\"names\":[\"Sabina\"],\"date\":\"22/10\"},{\"names\":[\"Teodor\"],\"date\":\"23/10\"},{\"names\":[\"Nina\"],\"date\":\"24/10\"},{\"names\":[\"Beáta\"],\"date\":\"25/10\"},{\"names\":[\"Erik\"],\"date\":\"26/10\"},{\"names\":[\"Šarlota\",\"Zoe\"],\"date\":\"27/10\"},{\"names\":[\"Jidáš\"],\"date\":\"28/10\"},{\"names\":[\"Silvie\",\"Sylva\"],\"date\":\"29/10\"},{\"names\":[\"Tadeáš\"],\"date\":\"30/10\"},{\"names\":[\"Štěpánka\"],\"date\":\"31/10\"},{\"names\":[\"Felix\"],\"date\":\"1/11\"},{\"names\":[\"Hubert\"],\"date\":\"3/11\"},{\"names\":[\"Karel\",\"Karla\"],\"date\":\"4/11\"},{\"names\":[\"Miriam\"],\"date\":\"5/11\"},{\"names\":[\"Liběna\"],\"date\":\"6/11\"},{\"names\":[\"Saskie\"],\"date\":\"7/11\"},{\"names\":[\"Bohumír\"],\"date\":\"8/11\"},{\"names\":[\"Bohdan\"],\"date\":\"9/11\"},{\"names\":[\"Evžen\"],\"date\":\"10/11\"},{\"names\":[\"Martin\"],\"date\":\"11/11\"},{\"names\":[\"Benedikt\"],\"date\":\"12/11\"},{\"names\":[\"Tibor\"],\"date\":\"13/11\"},{\"names\":[\"Sáva\"],\"date\":\"14/11\"},{\"names\":[\"Leopold\"],\"date\":\"15/11\"},{\"names\":[\"Otmar\"],\"date\":\"16/11\"},{\"names\":[\"Mahulena\"],\"date\":\"17/11\"},{\"names\":[\"Romana\"],\"date\":\"18/11\"},{\"names\":[\"Alžběta\"],\"date\":\"19/11\"},{\"names\":[\"Nikola\"],\"date\":\"20/11\"},{\"names\":[\"Albert\"],\"date\":\"21/11\"},{\"names\":[\"Cecílie\"],\"date\":\"22/11\"},{\"names\":[\"Klement\"],\"date\":\"23/11\"},{\"names\":[\"Emílie\"],\"date\":\"24/11\"},{\"names\":[\"Kateřina\"],\"date\":\"25/11\"},{\"names\":[\"Artur\"],\"date\":\"26/11\"},{\"names\":[\"Xenie\"],\"date\":\"27/11\"},{\"names\":[\"René\"],\"date\":\"28/11\"},{\"names\":[\"Zina\"],\"date\":\"29/11\"},{\"names\":[\"Ondřej\"],\"date\":\"30/11\"},{\"names\":[\"Iva\"],\"date\":\"1/12\"},{\"names\":[\"Blanka\"],\"date\":\"2/12\"},{\"names\":[\"Svatoslav\"],\"date\":\"3/12\"},{\"names\":[\"Barbora\"],\"date\":\"4/12\"},{\"names\":[\"Jitka\"],\"date\":\"5/12\"},{\"names\":[\"Mikuláš\"],\"date\":\"6/12\"},{\"names\":[\"Benjamín\"],\"date\":\"7/12\"},{\"names\":[\"Květoslava\"],\"date\":\"8/12\"},{\"names\":[\"Vratislav\"],\"date\":\"9/12\"},{\"names\":[\"Julie\"],\"date\":\"10/12\"},{\"names\":[\"Dana\"],\"date\":\"11/12\"},{\"names\":[\"Simona\"],\"date\":\"12/12\"},{\"names\":[\"Lucie\"],\"date\":\"13/12\"},{\"names\":[\"Lýdie\"],\"date\":\"14/12\"},{\"names\":[\"Radana\"],\"date\":\"15/12\"},{\"names\":[\"Albína\"],\"date\":\"16/12\"},{\"names\":[\"Daniel\"],\"date\":\"17/12\"},{\"names\":[\"Miloslav\"],\"date\":\"18/12\"},{\"names\":[\"Ester\"],\"date\":\"19/12\"},{\"names\":[\"Dagmar\"],\"date\":\"20/12\"},{\"names\":[\"Natálie\"],\"date\":\"21/12\"},{\"names\":[\"Šimon\"],\"date\":\"22/12\"},{\"names\":[\"Vlasta\"],\"date\":\"23/12\"},{\"names\":[\"AdamaEva\"],\"date\":\"24/12\"},{\"names\":[\"Štěpán\"],\"date\":\"26/12\"},{\"names\":[\"Žaneta\"],\"date\":\"27/12\"},{\"names\":[\"Bohumila\"],\"date\":\"28/12\"},{\"names\":[\"Judita\"],\"date\":\"29/12\"},{\"names\":[\"David\"],\"date\":\"30/12\"},{\"names\":[\"Silvestr\"],\"date\":\"31/12\"}]}\n"
  },
  {
    "path": "android_mobile/src/main/res/raw/gr_namedays.json",
    "content": "{\"data\":[{\"names\":[\"Αχιλλέας\",\"Αχιλλεύς\"],\"date\":\"24\\/04\"},{\"names\":[\"Αχίλιος\",\"Αχίλλιος\",\"Αχίλειος\",\"Αχίλλειος\"],\"date\":\"15\\/05\"},{\"names\":[\"Αχμέτ\"],\"date\":\"24\\/12\"},{\"names\":[\"Αγγελος\",\"Αγγελής\",\"Αγγελική\",\"Αντζελα\",\"Ατζελα\",\"Αντζυ\",\"Αγγέλα\",\"Αγγέλλω\",\"Αγγελίνα\",\"Αγγελικούλα\",\"Κούλα\"],\"date\":\"08\\/11\"},{\"names\":[\"Αγάπη\",\"Αγάπιος\"],\"date\":\"17\\/09\"},{\"names\":[\"Αγαπητός\"],\"date\":\"18\\/02\"},{\"names\":[\"Αγάπιος\"],\"date\":\"15\\/03\"},{\"names\":[\"Αγαθάγγελος\",\"Αγαθαγγέλα\",\"Αγαθαγγέλη\"],\"date\":\"23\\/01\"},{\"names\":[\"Αγαθή\",\"Αγαθούλα\",\"Αγαθώ\",\"Αγαθία\",\"Αγαθίτσα\"],\"date\":\"05\\/02\"},{\"names\":[\"Αγαθόκλεια\",\"Αγαθοκλής\",\"Αγαθοκλέας\",\"Αγαθόκλεος\"],\"date\":\"17\\/09\"},{\"names\":[\"Αγαθονίκη\"],\"date\":\"13\\/10\"},{\"names\":[\"Αγαθόνικος\"],\"date\":\"22\\/08\"},{\"names\":[\"Αγάθων\"],\"date\":\"08\\/01\"},{\"names\":[\"Αδαμάντιος\",\"Αδαμαντία\",\"Αμάντα\"],\"date\":\"01\\/09\"},{\"names\":[\"Αβέρκιος\",\"Αβερκία\"],\"date\":\"22\\/10\"},{\"names\":[\"Αγλαία\"],\"date\":\"19\\/12\"},{\"names\":[\"Αγνή\",\"Αγνούλα\"],\"date\":\"21\\/01\"},{\"names\":[\"Αβραάμ\",\"Αβραμία\"],\"date\":\"29\\/10\"},{\"names\":[\"Αδριανή\",\"Αδριάνα\",\"Αντριάνα\",\"Ανδριάννα\",\"Ανδριαννή\"],\"date\":\"26\\/08\"},{\"names\":[\"Αδριανός\"],\"date\":\"26\\/08\"},{\"names\":[\"Αγριππίνα\"],\"date\":\"23\\/06\"},{\"names\":[\"Αέτιος\",\"Αετός\",\"Αέτης\",\"Αετίς\",\"Αετίνα\",\"Αετίων\"],\"date\":\"09\\/03\"},{\"names\":[\"Απελλής\"],\"date\":\"31\\/10\"},{\"names\":[\"Απόλλων\"],\"date\":\"05\\/06\"},{\"names\":[\"Απολλωνία\"],\"date\":\"30\\/10\"},{\"names\":[\"Απόστολος\",\"Αποστόλης\",\"Τόλης\",\"Αποστολία\",\"Λία\",\"Αποστολίνα\",\"Πολίνα\"],\"date\":\"30\\/06\"},{\"names\":[\"Απόστολος\",\"Αποστόλης\",\"Τόλης\",\"Αποστολία\",\"Λία\",\"Αποστολίνα\",\"Πολίνα\"],\"date\":\"16\\/08\"},{\"names\":[\"Ακάκιος\"],\"date\":\"12\\/04\"},{\"names\":[\"Ακάκιος\",\"Κάχι\",\"Κάκι\"],\"date\":\"28\\/07\"},{\"names\":[\"Αλεξάνδρα\",\"Αλεξάντρα\",\"Αλέκα\"],\"date\":\"17\\/07\"},{\"names\":[\"Αλεξάνδρα\",\"Αλεξάντρα\",\"Αλέκα\"],\"date\":\"21\\/04\"},{\"names\":[\"Αλέξανδρος\",\"Αλέξαντρος\",\"Αλέκος\",\"Αλέξης\"],\"date\":\"30\\/08\"},{\"names\":[\"Αθανάσιος\",\"Αθανασία\",\"Θανάσης\",\"Νάσια\",\"Νάνσυ\",\"Νάσος\",\"Θανάσος\",\"Θανασάκης\",\"Σάκης\",\"Θάνος\",\"Θανασία\",\"Θανασούλα\",\"Σούλα\",\"Νάσα\"],\"date\":\"18\\/01\"},{\"names\":[\"Αλέξιος\",\"Αλεξία\",\"Αλέξης\",\"Αλέκος\",\"Αλέξα\"],\"date\":\"17\\/03\"},{\"names\":[\"Αθηνά\"],\"date\":\"01\\/09\"},{\"names\":[\"Αθηναγόρας\"],\"date\":\"24\\/07\"},{\"names\":[\"Αθηνόδωρος\",\"Αθηνόδωρας\",\"Αθηνοδωρής\",\"Δώρης\",\"Αθηνοδώρα\"],\"date\":\"07\\/11\"},{\"names\":[\"Αικατερίνα\",\"Κατερίνα\",\"Αικατερίνη\",\"Καίτη\",\"Κατίνα\",\"Κατερινιώ\",\"Κατινιώ\",\"Κατίνγκω\",\"Κατίγκα\",\"Τίγκα\",\"Κάτια\",\"Ρίνα\",\"Καλοτίνα\",\"Κάρεν\"],\"date\":\"25\\/11\"},{\"names\":[\"Αλκιβιάδης\",\"Αλκης\",\"Αλτσος\"],\"date\":\"16\\/08\"},{\"names\":[\"Αλίκη\"],\"date\":\"17\\/07\"},{\"names\":[\"Ακίνδυνος\",\"Ακίνδυνη\"],\"date\":\"02\\/11\"},{\"names\":[\"Αιμιλιανός\",\"Αιμιλιανή\"],\"date\":\"18\\/07\"},{\"names\":[\"Αιμίλιος\",\"Αιμιλία\",\"Εμυ\",\"Εμιλία\",\"Εμιλυ\",\"Εμμα\",\"Μίλιος\",\"Μίλια\"],\"date\":\"22\\/05\"},{\"names\":[\"Ακριβή\"],\"date\":\"01\\/09\"},{\"names\":[\"Αλφαίος\"],\"date\":\"26\\/05\"},{\"names\":[\"Αλύπιος\",\"Αλυπία\"],\"date\":\"27\\/05\"},{\"names\":[\"Ακύλας\"],\"date\":\"14\\/07\"},{\"names\":[\"Ακυλίνα\",\"Ακυλίνη\",\"Ακυλήνη\"],\"date\":\"27\\/09\"},{\"names\":[\"Αιτωλία\"],\"date\":\"24\\/08\"},{\"names\":[\"Αμαλία\",\"Αμελί\"],\"date\":\"10\\/07\"},{\"names\":[\"Αναίς\"],\"date\":\"09\\/12\"},{\"names\":[\"Αναίς\"],\"date\":\"25\\/07\"},{\"names\":[\"Ανεμπόδιστος\",\"Ανεμπόδιστη\"],\"date\":\"02\\/11\"},{\"names\":[\"Ανανίας\",\"Νίνος\"],\"date\":\"01\\/10\"},{\"names\":[\"Αναξιμένης\",\"Μένης\"],\"date\":\"10\\/04\"},{\"names\":[\"Ανδρέας\",\"Αντρέας\",\"Ανδρίκος\",\"Αντρίκος\",\"Ανδρούλα\",\"Αντρούλα\",\"Ανδρίτσα\",\"Αντρίτσα\"],\"date\":\"30\\/11\"},{\"names\":[\"Ανάργυρος\",\"Ανάργυρη\",\"Αναργυρούλα\"],\"date\":\"28\\/06\"},{\"names\":[\"Ανάργυρος\",\"Ανάργυρη\",\"Αναργυρούλα\"],\"date\":\"01\\/07\"},{\"names\":[\"Ανάργυρος\",\"Ανάργυρη\",\"Αναργυρούλα\"],\"date\":\"01\\/11\"},{\"names\":[\"Ανδρομάχη\",\"Μάχη\",\"Μαχούλα\"],\"date\":\"12\\/10\"},{\"names\":[\"Ανδρόμαχος\",\"Μάχος\"],\"date\":\"12\\/10\"},{\"names\":[\"Ανδρόνικος\",\"Ανδρονίκη\"],\"date\":\"17\\/05\"},{\"names\":[\"Ανδρόνικος\",\"Ανδρονίκη\"],\"date\":\"30\\/07\"},{\"names\":[\"Αμβρόσιος\",\"Αμβρόσης\",\"Αμβροσία\"],\"date\":\"07\\/12\"},{\"names\":[\"Ανατολή\"],\"date\":\"26\\/02\"},{\"names\":[\"Ανατόλιος\"],\"date\":\"03\\/07\"},{\"names\":[\"Αναστασία\",\"Τασία\",\"Σία\",\"Τατία\",\"Τάσα\",\"Τέσα\",\"Τασούλα\",\"Τασσώ\"],\"date\":\"22\\/12\"},{\"names\":[],\"date\":\"12\\/04\"},{\"names\":[\"Αναστάσιος\",\"Αναστασία\",\"Τάσος\",\"Αναστάσης\",\"Τασία\",\"Σία\",\"Τατία\",\"Τάσα\",\"Τέσα\",\"Τασούλα\",\"Τασσώ\"],\"date\":\"22\\/01\"},{\"names\":[\"Αμπλία\",\"Αμπλίος\"],\"date\":\"31\\/10\"},{\"names\":[\"Ανθή\",\"Ανθούλα\",\"Ανθια\",\"Ανθεια\"],\"date\":\"15\\/12\"},{\"names\":[\"Ανθιμος\",\"Ανθιμη\"],\"date\":\"03\\/09\"},{\"names\":[\"Ανθούσα\",\"Ανθούση\"],\"date\":\"22\\/02\"},{\"names\":[\"Αννα\",\"Αννούλα\",\"Αννίτα\",\"Ανίτα\",\"Ανέτα\",\"Αννέτα\",\"Ανναμπέλλα\",\"Ανναμαρία\",\"Ανέζα\",\"Ανεζούλα\"],\"date\":\"09\\/12\"},{\"names\":[\"Αννα\",\"Αννούλα\",\"Αννίτα\",\"Ανίτα\",\"Ανέτα\",\"Αννέτα\",\"Ανναμπέλλα\",\"Ανναμαρία\"],\"date\":\"25\\/07\"},{\"names\":[\"Αντιγόνη\",\"Γόνη\"],\"date\":\"01\\/09\"},{\"names\":[\"Αντίγονος\"],\"date\":\"17\\/10\"},{\"names\":[\"Αμφιλόχιος\",\"Αμφιλοχία\"],\"date\":\"23\\/11\"},{\"names\":[\"Αντίπας\",\"Αντύπας\"],\"date\":\"11\\/04\"},{\"names\":[\"Ανύσιος\",\"Ανυσία\"],\"date\":\"30\\/12\"},{\"names\":[\"Αντώνιος\",\"Αντώνης\",\"Αντώνας\",\"Τόνης\",\"Τόνυ\",\"Αντωνάκος\",\"Νάκος\",\"Αντωνάκης\",\"Αντωνία\",\"Αντωνούλα\",\"Τόνια\"],\"date\":\"17\\/01\"},{\"names\":[\"Αρχέλαος\"],\"date\":\"05\\/03\"},{\"names\":[\"Αρχοντή\",\"Αρχοντία\",\"Αρχοντούλα\",\"Αρχόντισσα\",\"Αρχόντω\"],\"date\":\"03\\/09\"},{\"names\":[\"Αρχοντίων\",\"Αρχοντίωνας\"],\"date\":\"03\\/09\"},{\"names\":[\"Αρετή\",\"Αρετούσα\"],\"date\":\"01\\/12\"},{\"names\":[\"Αργύρης\",\"Αργυρός\",\"Αργύριος\"],\"date\":\"11\\/05\"},{\"names\":[\"Αργυρή\",\"Αργυρούλα\",\"Ρούλα\",\"Αργυρώ\"],\"date\":\"30\\/04\"},{\"names\":[\"Αρης\"],\"date\":\"13\\/12\"},{\"names\":[\"Αρης\"],\"date\":\"19\\/12\"},{\"names\":[\"Αρκαδία\",\"Αρκάδα\"],\"date\":\"27\\/08\"},{\"names\":[\"Αρκάδιος\",\"Αρκάδης\"],\"date\":\"27\\/08\"},{\"names\":[\"Αρκάδιος\",\"Αρκαδία\"],\"date\":\"29\\/08\"},{\"names\":[\"Αριάδνη\",\"Αριάνα\"],\"date\":\"18\\/09\"},{\"names\":[\"Αριστέα\",\"Αρίστη\",\"Αρέστια\"],\"date\":\"03\\/09\"},{\"names\":[\"Αριστείδης\",\"Αρίστος\",\"Αριστέα\",\"Αρης\",\"Αριστούλα\",\"Αριστίνα\",\"Αρίστη\",\"Αρίστω\"],\"date\":\"13\\/09\"},{\"names\":[\"Αρίσταρχος\"],\"date\":\"14\\/04\"},{\"names\":[\"Αριστίων\",\"Αριστίωνας\",\"Αριστέας\",\"Αρέστης\"],\"date\":\"03\\/09\"},{\"names\":[\"Αριστόβουλος\",\"Αριστοβούλη\"],\"date\":\"31\\/10\"},{\"names\":[\"Αριστοκλής\",\"Αριστοκλέας\",\"Αριστόκλεος\"],\"date\":\"23\\/06\"},{\"names\":[\"Αριστοτέλης\",\"Τέλης\"],\"date\":\"14\\/05\"},{\"names\":[\"Αρμόδιος\"],\"date\":\"11\\/05\"},{\"names\":[\"Αρριανός\",\"Αριανός\",\"Αρρειανός\",\"Αρειανός\",\"Αρριανή\"],\"date\":\"14\\/12\"},{\"names\":[\"Αρτέμιος\",\"Αρτέμης\"],\"date\":\"20\\/10\"},{\"names\":[\"Αρσένιος\",\"Αρσένης\",\"Αρσενία\",\"Αρσίνα\"],\"date\":\"18\\/08\"},{\"names\":[\"Αρσένιος\",\"Αρσένης\",\"Αρσενία\",\"Αρσίνα\"],\"date\":\"10\\/11\"},{\"names\":[\"Αρτεμις\",\"Αρτεμία\",\"Αρτέμη\",\"Αρτεμισία\",\"Αρτέμιδα\"],\"date\":\"20\\/10\"},{\"names\":[\"Αρσινόη\"],\"date\":\"10\\/11\"},{\"names\":[\"Αυγερινός\",\"Αυγέρης\",\"Αυγίτης\",\"Αυγέρας\",\"Αυγέρου\",\"Αυγερινή\",\"Αβα\"],\"date\":\"02\\/05\"},{\"names\":[\"Αυγή\",\"Αυγούλα\"],\"date\":\"11\\/02\"},{\"names\":[\"Αυγούστα\",\"Αυγουστία\",\"Αυγουστίνα\"],\"date\":\"15\\/06\"},{\"names\":[\"Αυγουστίνος\",\"Αύγουστος\",\"Αυγουστής\"],\"date\":\"15\\/06\"},{\"names\":[\"Ασημάκης\"],\"date\":\"03\\/02\"},{\"names\":[\"Ασημάκης\"],\"date\":\"30\\/04\"},{\"names\":[\"Ασημίνα\"],\"date\":\"03\\/02\"},{\"names\":[\"Ασημίνα\"],\"date\":\"30\\/04\"},{\"names\":[\"Ασπασία\"],\"date\":\"01\\/09\"},{\"names\":[\"Ασκληπιός\",\"Ασκληπιάς\",\"Ασκληπιάδα\"],\"date\":\"27\\/02\"},{\"names\":[\"Αφθόνιος\",\"Αφθονία\"],\"date\":\"02\\/11\"},{\"names\":[\"Αυξέντιος\",\"Αυξέντης\",\"Αυξεντία\",\"Αυξεντούλα\"],\"date\":\"28\\/07\"},{\"names\":[\"Αύρα\"],\"date\":\"30\\/01\"},{\"names\":[\"Αφροδίτη\",\"Φρέγια\"],\"date\":\"01\\/09\"},{\"names\":[\"Αφροδίσιος\",\"Αφροδισία\"],\"date\":\"21\\/06\"},{\"names\":[\"Αστέριος\",\"Αστέρης\",\"Αστρης\"],\"date\":\"07\\/08\"},{\"names\":[\"Αστέριος\",\"Αστέρης\",\"Αστρης\"],\"date\":\"30\\/10\"},{\"names\":[\"Αστέρω\",\"Αστερία\",\"Αστρούλα\"],\"date\":\"07\\/08\"},{\"names\":[\"Αστέρω\",\"Αστερία\",\"Αστρούλα\"],\"date\":\"30\\/10\"},{\"names\":[\"Αστρινή\",\"Αστερινή\",\"Αστρινός\",\"Αστερινός\"],\"date\":\"07\\/08\"},{\"names\":[\"Βάκχος\",\"Βάκχη\",\"Βακχία\"],\"date\":\"07\\/10\"},{\"names\":[\"Βαλεντίων\",\"Βαλεντίνος\",\"Βαλεντίνο\",\"Ντίνος\",\"Βαλεντίνη\",\"Βαλεντίνα\",\"Ντίνα\"],\"date\":\"14\\/02\"},{\"names\":[\"Βαλάντιος\",\"Βαλάντης\"],\"date\":\"12\\/10\"},{\"names\":[\"Βαλεριανός\",\"Βαλεριάνα\",\"Βαλέρια\",\"Βαλέριος\",\"Βαλέρης\",\"Βάλιος\",\"Βάλια\"],\"date\":\"22\\/11\"},{\"names\":[\"Βενέδικτος\",\"Βενεδίκτη\",\"Βενεδικτίνη\",\"Βενεδικτίνα\"],\"date\":\"14\\/03\"},{\"names\":[\"Βενιαμίν\"],\"date\":\"29\\/12\"},{\"names\":[\"Βαρβάρα\",\"Βαρβάρω\",\"Βαρβαρούλα\",\"Ρούλα\",\"Βαρβαρίτσα\",\"Ρίτσα\"],\"date\":\"04\\/12\"},{\"names\":[\"Βερενίκη\"],\"date\":\"12\\/07\"},{\"names\":[\"Βερίνα\",\"Βερίνη\",\"Βέρα\",\"Βερούλα\",\"Βερούλη\"],\"date\":\"04\\/10\"},{\"names\":[\"Βαρθολομαίος\"],\"date\":\"11\\/06\"},{\"names\":[\"Βαρθολομαίος\"],\"date\":\"25\\/08\"},{\"names\":[\"Βαρνάβας\"],\"date\":\"11\\/06\"},{\"names\":[\"Βερονίκη\",\"Βερόνικα\",\"Βερούλα\",\"Βέρα\"],\"date\":\"12\\/07\"},{\"names\":[\"Βαρσαμία\",\"Βαρσάμω\",\"Βαλσάμω\",\"Βαλσαμία\",\"Βαρσιμαίος\",\"Βαρσάμης\",\"Βαλσάμης\"],\"date\":\"29\\/01\"},{\"names\":[\"Βασίλειος\",\"Βασίλης\",\"Βάσος\",\"Βασίλας\",\"Βασιλάκης\",\"Μπίλλης\",\"Μπίλης\",\"Βίλυ\"],\"date\":\"01\\/01\"},{\"names\":[\"Βασιλική\",\"Βασιλεία\",\"Βασιλίνα\",\"Βασιλικούλα\",\"Βάσω\",\"Βάσια\",\"Βασούλα\",\"Βίκυ\"],\"date\":\"01\\/01\"},{\"names\":[\"Βασίλισσα\"],\"date\":\"08\\/01\"},{\"names\":[\"Βήλη\",\"Βίλια\"],\"date\":\"28\\/10\"},{\"names\":[\"Βηθλεέμ\"],\"date\":\"25\\/12\"},{\"names\":[\"Βησσαρίων\",\"Βησσαρίωνας\"],\"date\":\"15\\/09\"},{\"names\":[\"Βλαδίμηρος\",\"Βλαντίμηρος\"],\"date\":\"15\\/07\"},{\"names\":[\"Βιβιανός\",\"Βιβιάνα\",\"Βιβιανή\",\"Βίβιαν\",\"Βιβή\"],\"date\":\"09\\/03\"},{\"names\":[\"Βίβος\",\"Βιβή\"],\"date\":\"06\\/09\"},{\"names\":[\"Βλάσιος\",\"Βλάσος\",\"Βλάσης\",\"Βλασία\",\"Βλασούλα\"],\"date\":\"11\\/02\"},{\"names\":[\"Βικέντιος\",\"Βικέντης\",\"Βικεντία\"],\"date\":\"11\\/11\"},{\"names\":[\"Βίκτωρ\",\"Βίκτορας\",\"Βικτωρία\",\"Βικτορία\"],\"date\":\"11\\/11\"},{\"names\":[\"Βιργινία\"],\"date\":\"21\\/11\"},{\"names\":[\"Γεδεών\"],\"date\":\"30\\/12\"},{\"names\":[\"Γαβριέλα\",\"Γαβρίλα\",\"Γαβριηλίτσα\",\"Γαβριλίτσα\",\"Αραβέλα\"],\"date\":\"08\\/11\"},{\"names\":[\"Γαβριήλ\",\"Γαβρίλος\",\"Γαβρίλης\"],\"date\":\"08\\/11\"},{\"names\":[\"Γαλακτίων\",\"Γαλακτίωνας\",\"Γαλάτιος\",\"Γαλάτης\",\"Γαλακτία\",\"Γαλατεία\",\"Γαλάτια\"],\"date\":\"05\\/11\"},{\"names\":[\"Γαλάτεια\",\"Γαλατία\"],\"date\":\"18\\/05\"},{\"names\":[\"Γαλήνη\"],\"date\":\"16\\/04\"},{\"names\":[\"Γαληνός\"],\"date\":\"16\\/04\"},{\"names\":[\"Γενέθλιος\"],\"date\":\"08\\/09\"},{\"names\":[\"Γεννάδιος\",\"Γενάδιος\"],\"date\":\"17\\/11\"},{\"names\":[\"Γενοβέφα\",\"Γενεβιέβη\"],\"date\":\"03\\/01\"},{\"names\":[],\"date\":\"24\\/06\"},{\"names\":[\"Γερβάσιος\",\"Γερβασία\"],\"date\":\"14\\/10\"},{\"names\":[\"Γεράκης\",\"Γερακίνα\"],\"date\":\"01\\/06\"},{\"names\":[\"Γεράσιμος\",\"Μάκης\",\"Μικές\",\"Μίκης\"],\"date\":\"16\\/08\"},{\"names\":[\"Γεράσιμος\",\"Μάκης\",\"Μικές\",\"Μίκης\"],\"date\":\"20\\/10\"},{\"names\":[\"Γεράσιμος\",\"Μάκης\",\"Μικές\",\"Μίκης\"],\"date\":\"04\\/03\"},{\"names\":[\"Γερμανός\"],\"date\":\"28\\/06\"},{\"names\":[\"Γερόντιος\",\"Γερoντιος\"],\"date\":\"13\\/04\"},{\"names\":[\"Γερτρούδη\"],\"date\":\"17\\/03\"},{\"names\":[\"Γαρυφαλλιά\",\"Γαριφαλιά\"],\"date\":\"19\\/07\"},{\"names\":[\"Γεσθημανή\",\"Ιεσθημανή\",\"Γεθσημανή\"],\"date\":\"15\\/08\"},{\"names\":[\"Γιάννα\",\"Γιαννούλα\",\"Γιανγκούλα\"],\"date\":\"07\\/01\"},{\"names\":[\"Γιάννης\",\"Τζαννής\",\"Τζανής\",\"Γιαννιός\",\"Γιάννος\",\"Γιάνναρος\",\"Γιανναράς\",\"Γιάνγκος\",\"Γιανγκούλας\",\"Γιαννάκης\",\"Γιάγκος\"],\"date\":\"07\\/01\"},{\"names\":[\"Γκασπάρ\",\"Γκάσπαρος\"],\"date\":\"25\\/12\"},{\"names\":[\"Γλαφύρα\",\"Γλαφυρή\",\"Γλαφυρούλα\",\"Γλαφυρός\"],\"date\":\"26\\/04\"},{\"names\":[\"Γλυκερία\",\"Γλυκερή\",\"Γλυκέρω\",\"Γλυκερίτσα\"],\"date\":\"13\\/05\"},{\"names\":[\"Γλυκέριος\",\"Γλυκερός\"],\"date\":\"03\\/12\"},{\"names\":[\"Γλύκων\",\"Γλυκός\"],\"date\":\"26\\/10\"},{\"names\":[\"Γρηγόρης\",\"Γρηγορία\",\"Γρηγόριος\",\"Γόλης\"],\"date\":\"25\\/01\"},{\"names\":[\"Γρηγόρης\",\"Γρηγορία\",\"Γρηγόριος\",\"Γόλης\"],\"date\":\"14\\/11\"},{\"names\":[],\"date\":\"08\\/03\"},{\"names\":[\"Δαβίδ\",\"Δαυίδ\"],\"date\":\"26\\/06\"},{\"names\":[],\"date\":\"01\\/11\"},{\"names\":[],\"date\":\"13\\/12\"},{\"names\":[],\"date\":\"18\\/04\"},{\"names\":[\"Δεναχίς\",\"Δεναχίδα\"],\"date\":\"20\\/11\"},{\"names\":[\"Δαμασκηνός\",\"Δαμασκηνή\"],\"date\":\"13\\/11\"},{\"names\":[\"Δαμιανός\",\"Δαμιανή\"],\"date\":\"01\\/07\"},{\"names\":[\"Δαμιανός\",\"Δαμιανή\"],\"date\":\"01\\/11\"},{\"names\":[\"Δανιήλ\",\"Δανιήλος\",\"Δανιέλος\",\"Δανιήλα\",\"Δανιέλα\",\"Δανιηλίτσα\"],\"date\":\"17\\/12\"},{\"names\":[\"Δάμων\",\"Δάμωνας\"],\"date\":\"28\\/08\"},{\"names\":[\"Δαρεία\",\"Δάρα\",\"Δάρω\"],\"date\":\"19\\/03\"},{\"names\":[\"Δεσποινούλα\",\"Δέσπω\",\"Δεσπούλα\",\"Δεσποίνου\",\"Δεσποίνω\",\"Δεσποινιώ\",\"Ντέπη\",\"Πέπη\",\"Ζέπω\",\"Πιπίνα\",\"Δεσποινα\"],\"date\":\"21\\/11\"},{\"names\":[\"Δέσπω\",\"Δεσποίνου\",\"Δεσποινιώ\",\"Ντέπη\",\"Πέπη\",\"Ζέπω\",\"Πιπίνα\",\"Δεσποινα\"],\"date\":\"15\\/08\"},{\"names\":[\"Δεσποινούλα\",\"Δέσπω\",\"Δεσπούλα\",\"Δεσποίνου\",\"Δεσποίνω\",\"Δεσποινιώ\",\"Ντέπη\",\"Πέπη\",\"Ζέπω\",\"Πιπίνα\",\"Δεσποινα\"],\"date\":\"08\\/09\"},{\"names\":[\"Δήμητρα\",\"Δημητρούλα\",\"Δημητρία\",\"Μιμή\",\"Μιμίκα\",\"Ντίμι\"],\"date\":\"26\\/10\"},{\"names\":[\"Δημήτριος\",\"Δημήτρης\",\"Δημητρός\",\"Δήμος\",\"Μίμης\",\"Δημητράκης\",\"Τζίμης\",\"Τζιμάκος\",\"Μήτσος\",\"Μητσάκος\",\"Μήτρος\"],\"date\":\"26\\/10\"},{\"names\":[\"Δημήτριος\",\"Δημήτρης\",\"Μήτρος\"],\"date\":\"28\\/05\"},{\"names\":[\"Δημοκλής\",\"Δήμος\",\"Δημόκλεια\"],\"date\":\"10\\/04\"},{\"names\":[\"Δημοσθένης\",\"Δήμος\"],\"date\":\"10\\/04\"},{\"names\":[\"Αδαμαντία\",\"Αντα\",\"Διαμάντω\"],\"date\":\"01\\/09\"},{\"names\":[\"Διογένης\"],\"date\":\"05\\/12\"},{\"names\":[\"Διομήδης\"],\"date\":\"16\\/08\"},{\"names\":[\"Διονύσιος\",\"Νύσης\",\"Διονύσης\",\"Νιόνιος\",\"Διονυσία\",\"Διονυσούλα\",\"Νύσα\",\"Ντένης\",\"Ντενίζ\",\"Σίσσυ\"],\"date\":\"03\\/10\"},{\"names\":[\"Διονύσιος\",\"Νύσης\",\"Διονύσης\",\"Νιόνιος\",\"Διονυσία\",\"Διονυσούλα\",\"Νύσα\",\"Ντένης\",\"Ντενίζ\",\"Σίσσυ\"],\"date\":\"17\\/12\"},{\"names\":[\"Διονύσιος\",\"Νύσης\",\"Διονύσης\",\"Νιόνιος\",\"Διονυσία\",\"Διονυσούλα\",\"Νύσα\",\"Ντένης\",\"Ντενίζ\",\"Σίσσυ\"],\"date\":\"10\\/04\"},{\"names\":[\"Διονύσιος\",\"Νύσης\",\"Διονύσης\",\"Νιόνιος\",\"Διονυσία\",\"Διονυσούλα\",\"Νύσα\",\"Ντένης\",\"Ντενίζ\",\"Σίσσυ\"],\"date\":\"23\\/01\"},{\"names\":[\"Διόνυσος\"],\"date\":\"01\\/11\"},{\"names\":[\"Διός\",\"Δίας\"],\"date\":\"19\\/07\"},{\"names\":[\"Διοσκουρίδης\",\"Διοσκορίδης\",\"Διόσκορος\"],\"date\":\"11\\/05\"},{\"names\":[\"Διοσκουρίδης\"],\"date\":\"28\\/05\"},{\"names\":[\"Διώνη\",\"Διόνη\"],\"date\":\"01\\/09\"},{\"names\":[\"Δονάτος\",\"Δονάτα\",\"Ντονάτα\",\"Ντονατέλα\"],\"date\":\"30\\/04\"},{\"names\":[\"Δομινίκη\",\"Δομνίκα\",\"Δομνίκη\"],\"date\":\"08\\/01\"},{\"names\":[\"Δόμνα\"],\"date\":\"28\\/12\"},{\"names\":[\"Δούκας\",\"Δούκισσα\",\"Δουκίτσα\"],\"date\":\"24\\/04\"},{\"names\":[\"Δράκων\",\"Δράκοντας\",\"Δράκος\",\"Δρακούλης\",\"Δρακούλα\"],\"date\":\"11\\/11\"},{\"names\":[\"Δρόσος\"],\"date\":\"22\\/03\"},{\"names\":[\"Δρόσος\"],\"date\":\"28\\/07\"},{\"names\":[\"Δροσίς\",\"Δροσίδα\",\"Δροσούλα\",\"Δροσία\",\"Δρόσω\",\"Δροσοσταλία\",\"Δροσοσταλίδα\"],\"date\":\"22\\/03\"},{\"names\":[\"Δροσίς\",\"Δροσίδα\",\"Δροσούλα\",\"Δροσία\",\"Δρόσω\",\"Δροσοσταλία\",\"Δροσοσταλίδα\"],\"date\":\"28\\/07\"},{\"names\":[\"Δωδώνη\"],\"date\":\"01\\/09\"},{\"names\":[\"Δωρόθεος\",\"Δωροθέα\",\"Δωροθέη\",\"Δωρούλα\",\"Δώρα\"],\"date\":\"05\\/06\"},{\"names\":[\"Εδουάρδος\",\"Εντυ\",\"Εντουαρντ\"],\"date\":\"18\\/03\"},{\"names\":[\"Επαμεινώνδας\"],\"date\":\"10\\/04\"},{\"names\":[],\"date\":\"28\\/10\"},{\"names\":[\"Επίχαρις\",\"Επιχάρια\"],\"date\":\"27\\/09\"},{\"names\":[\"Επιφάνειος\",\"Επιφάνιος\",\"Επιφανία\"],\"date\":\"12\\/05\"},{\"names\":[\"Επιστήμη\"],\"date\":\"05\\/11\"},{\"names\":[\"Ελένη\",\"Ελενα\",\"Ελεάννα\",\"Ελεάνα\",\"Λένα\",\"Ελενιώ\",\"Ελενίτσα\",\"Λενίτσα\",\"Λένγκω\",\"Λενιώ\",\"Ελεωνόρα\",\"Ελεονόρα\",\"Ελεονώρα\",\"Νόρα\",\"Μαριλένα\"],\"date\":\"21\\/05\"},{\"names\":[\"Ελενος\",\"Λένος\"],\"date\":\"23\\/11\"},{\"names\":[\"Ελέσα\",\"Ελέσσα\"],\"date\":\"01\\/08\"},{\"names\":[\"Ελευθέριος\",\"Λευθέρης\",\"Λευτέρης\",\"Λεφτέρης\",\"Ελευθερία\",\"Λευθερία\",\"Λευτερία\",\"Ρία\"],\"date\":\"15\\/12\"},{\"names\":[\"Ελπίδα\"],\"date\":\"17\\/09\"},{\"names\":[\"Ελπιδηφόρος\",\"Ελπιδηφόρα\",\"Ελπιδοφόρος\",\"Ελπιδοφόρα\"],\"date\":\"02\\/11\"},{\"names\":[\"Ελπινίκη\"],\"date\":\"01\\/09\"},{\"names\":[\"Ελλάδιος\",\"Ελλάδης\"],\"date\":\"09\\/11\"},{\"names\":[\"Ελισάβετ\",\"Ελίζα\",\"Λίζα\",\"Λιζέτα\",\"Ζέτα\",\"Ζέττα\",\"Ελλη\",\"Βέτα\"],\"date\":\"24\\/04\"},{\"names\":[\"Ελισσαίος\",\"Ελισσώ\",\"Ελισώ\"],\"date\":\"14\\/06\"},{\"names\":[\"Εθνεγερσία\"],\"date\":\"25\\/03\"},{\"names\":[\"Ειρηναίος\",\"Ειρηναία\"],\"date\":\"05\\/05\"},{\"names\":[\"Ειρήναρχος\"],\"date\":\"28\\/11\"},{\"names\":[\"Ειρήνη\",\"Ειρήνα\",\"Ρένα\",\"Ρήνα\",\"Ρηνιώ\",\"Ρηνούλα\",\"Ειρήνγκω\",\"Ρένια\"],\"date\":\"05\\/05\"},{\"names\":[],\"date\":\"14\\/04\"},{\"names\":[\"Ειρήνη\",\"Ειρήνα\",\"Ρένα\",\"Ρήνα\",\"Ρηνιώ\",\"Ρηνούλα\",\"Ειρήνγκω\"],\"date\":\"28\\/07\"},{\"names\":[\"Ελώνα\",\"Ελλώνα\",\"Ελόνα\"],\"date\":\"15\\/08\"},{\"names\":[\"Εξακουστοδιανός\",\"Εξακουστωδιανός\",\"Εξακουστός\",\"Ξακουστός\",\"Ξακουστή\"],\"date\":\"04\\/08\"},{\"names\":[\"Εμμέλεια\",\"Εμυ\"],\"date\":\"01\\/01\"},{\"names\":[\"Εμμέλεια\",\"Εμυ\",\"Αμυ\"],\"date\":\"30\\/05\"},{\"names\":[\"Εμμανουέλα\",\"Εμμανουέλλα\",\"Μανουέλα\",\"Μανωλία\",\"Μανώλα\",\"Εμμα\"],\"date\":\"25\\/12\"},{\"names\":[\"Εμμανουέλλα\",\"Εμμανουέλα\",\"Μανουέλα\",\"Μανωλία\",\"Μανώλα\",\"Εμμα\"],\"date\":\"26\\/12\"},{\"names\":[\"Εμμανουήλ\",\"Μανώλης\",\"Μανωλιός\",\"Μανώλας\",\"Μανόλης\",\"Μανουήλ\",\"Μάνος\",\"Μανούσος\",\"Μανουσάκης\",\"Μανουσάκι\"],\"date\":\"25\\/12\"},{\"names\":[\"Εμμανουήλ\",\"Μανώλης\",\"Μανωλιός\",\"Μανώλας\",\"Μανόλης\",\"Μανουήλ\",\"Μάνος\",\"Μανούσος\",\"Μανουσάκης\",\"Μανουσάκι\"],\"date\":\"26\\/12\"},{\"names\":[\"Ενόη\"],\"date\":\"20\\/10\"},{\"names\":[\"Ερασμία\"],\"date\":\"01\\/09\"},{\"names\":[\"Ερασμος\"],\"date\":\"18\\/06\"},{\"names\":[\"Εράστη\"],\"date\":\"10\\/09\"},{\"names\":[\"Εραστος\"],\"date\":\"10\\/09\"},{\"names\":[\"Ερατώ\",\"Τέτη\"],\"date\":\"01\\/09\"},{\"names\":[\"Ερμείας\",\"Ερμεία\"],\"date\":\"31\\/05\"},{\"names\":[\"Ερμαίος\",\"Ερμαίας\"],\"date\":\"04\\/11\"},{\"names\":[\"Ερνέστος\",\"Ερνεστίνη\",\"Ερνεστίνα\",\"Ερνέστα\"],\"date\":\"07\\/11\"},{\"names\":[\"Ερμής\"],\"date\":\"08\\/03\"},{\"names\":[\"Ερμιόνη\",\"Ερμίνα\"],\"date\":\"04\\/09\"},{\"names\":[\"Ερμόλαος\",\"Ερμολία\",\"Λία\"],\"date\":\"26\\/07\"},{\"names\":[\"Ερμύλλος\",\"Ερμίλλος\",\"Ερμύλλη\",\"Ερμίλλη\",\"Ερμύλα\"],\"date\":\"13\\/01\"},{\"names\":[\"Ερση\"],\"date\":\"26\\/07\"},{\"names\":[\"Ερως\",\"Ερωτας\"],\"date\":\"25\\/06\"},{\"names\":[\"Ερωτηΐς\",\"Ερωτηΐδα\"],\"date\":\"06\\/10\"},{\"names\":[\"Ευάγγελος\",\"Ευαγγελία\",\"Βαγγέλης\",\"Βαγγέλας\",\"Βάγγος\",\"Αγγελής\",\"Βαγγελιώ\",\"Βαγγελίτσα\",\"Βαγγελή\",\"Βαγγελίνα\",\"Βάγγια\",\"Λίτσα\",\"Εύα\",\"Κέλλυ\",\"Λιλή\",\"Λιλίκα\"],\"date\":\"25\\/03\"},{\"names\":[\"Ευγενία\",\"Ευγενούλα\",\"Ευγενίτσα\",\"Τζένη\",\"Τζενούλα\",\"Ευγενίκη\"],\"date\":\"24\\/12\"},{\"names\":[\"Ευγένιος\",\"Ευγένης\"],\"date\":\"21\\/01\"},{\"names\":[\"Ευγένιος\",\"Ευγένης\"],\"date\":\"07\\/03\"},{\"names\":[\"Ευέλπιστος\",\"Ευελπίστη\"],\"date\":\"01\\/06\"},{\"names\":[\"Ευάνθης\"],\"date\":\"11\\/09\"},{\"names\":[\"Ευανθία\",\"Εύα\"],\"date\":\"11\\/09\"},{\"names\":[\"Ευδοκία\",\"Ευδοκή\"],\"date\":\"01\\/03\"},{\"names\":[\"Ετεοκλής\"],\"date\":\"10\\/04\"},{\"names\":[\"Ευδόκιμος\",\"Ευδόκιμη\"],\"date\":\"31\\/07\"},{\"names\":[\"Ευδοξία\",\"Ευδοξούλα\",\"Δόξα\",\"Δοξούλα\"],\"date\":\"31\\/01\"},{\"names\":[\"Ευδόξιος\",\"Ευδόξης\",\"Δόξης\"],\"date\":\"06\\/09\"},{\"names\":[\"Εσπερος\",\"Εσπέρα\",\"Εσπερία\"],\"date\":\"02\\/05\"},{\"names\":[\"Εύπλους\",\"Εύπλος\",\"Εύπλοος\"],\"date\":\"11\\/08\"},{\"names\":[\"Ευπρέπιος\",\"Ευπρέπειος\",\"Ευπρεπής\",\"Ευπρεπία\"],\"date\":\"17\\/10\"},{\"names\":[\"Ευπραξία\",\"Ευπραξούλα\",\"Πραξούλα\",\"Ευπράξιος\",\"Εύπραξος\"],\"date\":\"25\\/07\"},{\"names\":[\"Ευθαλία\",\"Ευθαλίτσα\",\"Ευθαλιώ\",\"Θάλια\",\"Θάλεια\",\"Θαλίτσα\",\"Θαλιώ\"],\"date\":\"02\\/03\"},{\"names\":[\"Ευλάλιος\",\"Ευλαλία\"],\"date\":\"30\\/08\"},{\"names\":[\"Ευλαμπία\",\"Ευλαμπή\",\"Ευλάμπω\",\"Λαμπή\",\"Λαμπίνα\",\"Λαμπία\",\"Λάμπω\"],\"date\":\"10\\/10\"},{\"names\":[\"Ευλάμπιος\",\"Λάμπης\",\"Ευλάμπης\"],\"date\":\"10\\/10\"},{\"names\":[\"Εύκλεος\",\"Ευκλεή\",\"Ευκλέα\"],\"date\":\"01\\/08\"},{\"names\":[\"Ευλόγιος\",\"Ευλογής\",\"Ευλογία\",\"Ευλογούλα\",\"Ευλογίτσα\"],\"date\":\"05\\/03\"},{\"names\":[\"Ευκράτης\",\"Εύκρατος\",\"Ευκρατάς\",\"Ευκρατία\",\"Ευκρατούλα\",\"Ευκρασία\"],\"date\":\"21\\/10\"},{\"names\":[\"Ευθύμιος\",\"Ευθύμης\",\"Θύμιος\",\"Θέμης\",\"Ευθυμία\",\"Ευθυμούλα\"],\"date\":\"20\\/01\"},{\"names\":[\"Ευμένιος\",\"Ευμένης\",\"Ευμενία\"],\"date\":\"18\\/09\"},{\"names\":[\"Ευνίκη\",\"Ευνίκα\"],\"date\":\"28\\/10\"},{\"names\":[\"Ευνίκη\",\"Ευνίκα\"],\"date\":\"28\\/10\"},{\"names\":[\"Ευμορφία\",\"Εμμυ\"],\"date\":\"06\\/08\"},{\"names\":[\"Εφραίμ\"],\"date\":\"05\\/05\"},{\"names\":[\"Ευσέβιος\",\"Ευσεβής\",\"Ευσεβεία\",\"Σέβη\",\"Ευσεβούλα\",\"Σεβούλα\"],\"date\":\"22\\/06\"},{\"names\":[\"Ευσέβιος\",\"Ευσεβής\",\"Ευσεβεία\",\"Σέβη\",\"Ευσεβούλα\",\"Σεβούλα\"],\"date\":\"15\\/02\"},{\"names\":[\"Ευτέρπη\"],\"date\":\"01\\/09\"},{\"names\":[\"Ευφημία\",\"Εύφη\",\"Εύφημη\",\"Εύφημος\",\"Ευφημούλα\",\"Ευφούλα\",\"Φούλα\"],\"date\":\"11\\/07\"},{\"names\":[\"Ευφημία\",\"Εύφη\",\"Εύφημη\",\"Εύφημος\",\"Ευφημούλα\",\"Ευφούλα\",\"Φούλα\"],\"date\":\"16\\/09\"},{\"names\":[\"Ευφραίμ\",\"Ευφραίμιος\",\"Ευφραίμης\",\"Ευφραιμάκης\",\"Ευφραιμία\",\"Ευφραιμίτσα\"],\"date\":\"05\\/05\"},{\"names\":[\"Ευφρασία\",\"Ευφρασίτσα\"],\"date\":\"19\\/01\"},{\"names\":[\"Ευφράσιος\",\"Ευφράσης\",\"Ευφράσας\",\"Φράσας\",\"Φράσιος\",\"Φράσης\"],\"date\":\"14\\/03\"},{\"names\":[\"Ευφροσύνη\",\"Ευφροσύνα\",\"Φροσύνη\",\"Φρόσω\",\"Φροσούλα\",\"Φροσού\"],\"date\":\"25\\/09\"},{\"names\":[\"Ευφρόσυνος\",\"Φρόσυνος\"],\"date\":\"11\\/09\"},{\"names\":[\"Ευψύχιος\",\"Εύψυχος\",\"Ευψυχής\",\"Ευψυχία\",\"Ευψυχούλα\",\"Ευψυχίτσα\",\"Ψυχούλα\",\"Ψυχίτσα\"],\"date\":\"09\\/04\"},{\"names\":[\"Ευτύχιος\",\"Ευτύχης\",\"Ευτυχία\",\"Ευτυχούλα\",\"Ευτυχίτσα\",\"Εφη\"],\"date\":\"06\\/04\"},{\"names\":[\"Ευτύχιος\",\"Ευτύχης\",\"Ευτυχία\",\"Ευτυχούλα\",\"Εφη\"],\"date\":\"24\\/08\"},{\"names\":[\"Ευστάθιος\",\"Στάθης\",\"Σταθάς\",\"Σταθάκος\",\"Ευσταθία\",\"Σταθία\",\"Ευσταθούλα\",\"Σταθούλα\"],\"date\":\"20\\/09\"},{\"names\":[\"Ευστρατία\",\"Ευστράτιος\",\"Στράτος\"],\"date\":\"08\\/11\"},{\"names\":[\"Ευστράτιος\",\"Ευστράτης\",\"Ευστρατάς\",\"Στρατάς\",\"Στρατής\",\"Στράτος\",\"Ευστρατία\",\"Ευστρατούλα\",\"Στρατούλα\",\"Στράτα\"],\"date\":\"13\\/12\"},{\"names\":[\"Ζαχαρίας\",\"Ζάχαρης\",\"Ζάχαρος\",\"Ζαχάρω\",\"Ζαχαρούλα\",\"Ζαχαρίτσα\",\"Ζαχαρένια\",\"Ζάκι\",\"Ζάκης\"],\"date\":\"08\\/02\"},{\"names\":[\"Ζαχαρίας\",\"Ζάχαρης\",\"Ζάχαρος\",\"Ζαχάρω\",\"Ζαχαρούλα\",\"Ζαχαρίτσα\",\"Ζαχαρένια\",\"Ζάκι\",\"Ζάκης\"],\"date\":\"05\\/09\"},{\"names\":[\"Ζακχαίος\",\"Ζάκχος\",\"Ζάχος\"],\"date\":\"20\\/04\"},{\"names\":[\"Ζαννέτος\",\"Ζαννέτα\",\"Ζανέτ\",\"Ζαννέττος\",\"Ζαννέττα\"],\"date\":\"07\\/01\"},{\"names\":[\"Ζηνάς\",\"Ζένας\",\"Ζένος\",\"Ζήνα\",\"Ζένα\",\"Ζένια\"],\"date\":\"22\\/06\"},{\"names\":[\"Ζηναΐς\",\"Ζηναΐδα\"],\"date\":\"07\\/06\"},{\"names\":[\"Ζηνοβία\",\"Ζήνα\",\"Τζήνα\",\"Τζίνα\",\"Ζελίνα\"],\"date\":\"30\\/10\"},{\"names\":[\"Ζηνόβιος\",\"Ζηνοβής\",\"Ζήνος\",\"Τζήνος\",\"Τζίνα\",\"Τζήνα\"],\"date\":\"30\\/10\"},{\"names\":[\"Ζήνων\"],\"date\":\"10\\/04\"},{\"names\":[\"Ζήνων\"],\"date\":\"27\\/09\"},{\"names\":[\"Ζουμπουλιά\"],\"date\":\"03\\/07\"},{\"names\":[\"Ζωγραφιά\"],\"date\":\"22\\/09\"},{\"names\":[\"Ζωΐλα\",\"Ζωίλος\"],\"date\":\"22\\/12\"},{\"names\":[\"Ζωσιμάς\",\"Ζωσιμίνα\"],\"date\":\"24\\/01\"},{\"names\":[\"Ζώσιμος\",\"Ζωσής\",\"Ζώσα\",\"Ζήσιμος\",\"Ζήσης\",\"Ζωσιμαίος\",\"Ζωσιμαία\"],\"date\":\"19\\/06\"},{\"names\":[\"Ηλιανός\",\"Ηλιανή\",\"Ηλιάνα\",\"Λιάνα\"],\"date\":\"09\\/03\"},{\"names\":[\"Ηλίας\",\"Λιάς\",\"Ηλιάκος\",\"Λιάκος\",\"Λίτσος\",\"Λιάκουρας\",\"Ηλιάνα\",\"Λιάνα\"],\"date\":\"20\\/07\"},{\"names\":[\"Ηλιόδωρος\",\"Ηλιοδώρα\",\"Ελεοδώρα\",\"Ελντα\"],\"date\":\"20\\/08\"},{\"names\":[\"Ηλιοστάλακτη\"],\"date\":\"15\\/08\"},{\"names\":[\"Ηλιόφωτος\"],\"date\":\"13\\/07\"},{\"names\":[\"Ηρακλής\",\"Ηρακλεία\"],\"date\":\"10\\/04\"},{\"names\":[\"Ηρώ\"],\"date\":\"10\\/08\"},{\"names\":[\"Ηρωδίων\",\"Ροδίων\",\"Ηρωδιάς\",\"Ηρωδιάδα\"],\"date\":\"10\\/11\"},{\"names\":[\"Ηρων\"],\"date\":\"10\\/08\"},{\"names\":[\"Ησαΐας\",\"Ησαΐα\",\"Ησαΐτσα\",\"Σίτσα\"],\"date\":\"09\\/05\"},{\"names\":[\"Ηφαιστίων\"],\"date\":\"10\\/04\"},{\"names\":[\"Ησύχιος\",\"Ησύχης\",\"Ησυχία\"],\"date\":\"06\\/03\"},{\"names\":[\"Θεαγένης\",\"Θεαγένιος\",\"Θεαγενεία\",\"Θεαγενία\"],\"date\":\"07\\/11\"},{\"names\":[\"Θεανώ\"],\"date\":\"01\\/09\"},{\"names\":[\"Θάλεια\"],\"date\":\"01\\/09\"},{\"names\":[\"Θαλάσσιος\",\"Θαλάσσης\",\"Θαλασσία\",\"Θάλασσα\",\"Θαλασσινή\"],\"date\":\"22\\/02\"},{\"names\":[\"Θαλλός\",\"Θαλλής\",\"Θαλής\",\"Θάλλεια\",\"Θάλεια\",\"Θάλλω\"],\"date\":\"11\\/03\"},{\"names\":[\"Θέκλα\"],\"date\":\"24\\/09\"},{\"names\":[],\"date\":\"15\\/04\"},{\"names\":[\"Θεοχάρης\",\"Θεοχαρούλα\",\"Χαρούλα\"],\"date\":\"20\\/08\"},{\"names\":[\"Θεμέλιος\",\"Θεμέλη\",\"Θεμελίνα\"],\"date\":\"07\\/11\"},{\"names\":[\"Θεόδοτος\",\"Θεοδότης\",\"Θεοδότη\"],\"date\":\"29\\/07\"},{\"names\":[\"Θεοδοσία\",\"Θεοδόσω\"],\"date\":\"29\\/05\"},{\"names\":[\"Θεόδουλος\",\"Θεοδούλιος\",\"Θεοδούλης\",\"Θεόδουλη\",\"Θεοδουλία\",\"Θεοδούλα\"],\"date\":\"18\\/01\"},{\"names\":[\"Θεοδόσιος\",\"Θεοδόσης\",\"Δόσιος\",\"Δόσης\"],\"date\":\"11\\/01\"},{\"names\":[\"Θεοδόσιος\",\"Θεοδόσης\",\"Δόσιος\",\"Δόσης\"],\"date\":\"17\\/01\"},{\"names\":[\"Θεόγνωστος\",\"Θεογνώστης\",\"Θεογνωσία\",\"Θεογνώσιος\"],\"date\":\"19\\/05\"},{\"names\":[\"Θεοδώρα\",\"Δώρα\",\"Ντόρα\",\"Θοδώρα\",\"Δωρούλα\"],\"date\":\"11\\/02\"},{\"names\":[\"Θεοδώρα\",\"Δώρα\",\"Ντόρα\",\"Θοδώρα\",\"Δωρούλα\"],\"date\":\"11\\/03\"},{\"names\":[],\"date\":\"28\\/02\"},{\"names\":[\"Θεοδώρα\",\"Δώρα\",\"Ντόρα\",\"Θόδωρος\",\"Θοδώρα\",\"Θοδωρής\",\"Θοδωράκης\",\"Θώδης\",\"Θώδος\",\"Δώρης\"],\"date\":\"17\\/02\"},{\"names\":[\"Θεοδώρα\",\"Δώρα\",\"Ντόρα\",\"Θόδωρος\",\"Θοδώρα\",\"Θοδωρής\",\"Θοδωράκης\",\"Θώδης\",\"Θώδος\",\"Δώρης\"],\"date\":\"12\\/05\"},{\"names\":[\"Θεόπεμπτος\",\"Θεόπεμπτη\"],\"date\":\"05\\/01\"},{\"names\":[\"Θεοπίστη\"],\"date\":\"20\\/09\"},{\"names\":[\"Θεοπούλα\",\"Θεόπη\"],\"date\":\"06\\/01\"},{\"names\":[\"Θεοπρέπιος\",\"Θεοπρεπής\",\"Θεοπρεπία\",\"Θεοπρεπή\"],\"date\":\"22\\/08\"},{\"names\":[\"Θεοκλής\",\"Θεοκλέας\",\"Θεόκλεια\"],\"date\":\"14\\/09\"},{\"names\":[\"Θεόκλητος\"],\"date\":\"01\\/12\"},{\"names\":[\"Θεολόγος\",\"Θεολόγης\",\"Θολόγος\",\"Θολόγης\",\"Θολόης\",\"Θεολογία\",\"Θολογία\"],\"date\":\"08\\/05\"},{\"names\":[\"Θεοκτίστη\"],\"date\":\"09\\/11\"},{\"names\":[\"Θεόκτιστος\"],\"date\":\"19\\/05\"},{\"names\":[\"Θεμιστοκλής\",\"Θέμης\",\"Θεμιστοκλεία\",\"Θέμις\",\"Θέμιδα\"],\"date\":\"10\\/04\"},{\"names\":[\"Θεμιστοκλής\",\"Θέμης\",\"Θεμιστοκλεία\",\"Θέμις\",\"Θέμιδα\"],\"date\":\"21\\/12\"},{\"names\":[\"Θεονύμφη\"],\"date\":\"01\\/09\"},{\"names\":[\"Θεοφάνης\",\"Φάνης\",\"Θεοφανία\"],\"date\":\"06\\/01\"},{\"names\":[\"Θεοφάνης\",\"Φάνης\",\"Θεοφανία\"],\"date\":\"12\\/03\"},{\"names\":[\"Θεοφανώ\"],\"date\":\"16\\/12\"},{\"names\":[\"Θεοφίλη\",\"Θεοφιλίτσα\",\"Φιλιώ\"],\"date\":\"28\\/12\"},{\"names\":[\"Θεόφιλος\",\"Θεοφίλη\",\"Θεοφίλης\",\"Θεοφιλίτσα\",\"Φιλιώ\"],\"date\":\"08\\/07\"},{\"names\":[\"Θεοτόκης\",\"Θεοτοκία\"],\"date\":\"15\\/08\"},{\"names\":[\"Θεόφραστος\"],\"date\":\"10\\/04\"},{\"names\":[\"Θεοφύλακτος\",\"Φυλακτός\",\"Φυλαχτός\",\"Θεοφύλακτη\",\"Φυλακτή\",\"Φυλαχτή\",\"Φυλαχτούλα\"],\"date\":\"08\\/03\"},{\"names\":[\"Θεράπων\"],\"date\":\"14\\/05\"},{\"names\":[\"Θεσπέσιος\",\"Θεσπέσης\",\"Θεσπέσια\"],\"date\":\"01\\/06\"},{\"names\":[\"Θαυμαστός\",\"Θαυμαστή\"],\"date\":\"24\\/04\"},{\"names\":[\"Θεωνάς\",\"Θεώνη\",\"Θεωνίτσα\"],\"date\":\"05\\/01\"},{\"names\":[\"Θηρεσία\"],\"date\":\"01\\/10\"},{\"names\":[\"Θησέας\",\"Θησεύς\"],\"date\":\"10\\/04\"},{\"names\":[\"Θύρσος\",\"Θύρσης\",\"Θύρσα\",\"Θύρση\"],\"date\":\"20\\/01\"},{\"names\":[\"Θωμαΐς\",\"Θωμαΐδα\",\"Θωμαή\"],\"date\":\"14\\/04\"},{\"names\":[\"Θωμάς\",\"Θωμαή\",\"Τόμας\"],\"date\":\"06\\/10\"},{\"names\":[\"Ιακχος\",\"Ιακχη\"],\"date\":\"17\\/12\"},{\"names\":[\"Ιακώβ\"],\"date\":\"01\\/12\"},{\"names\":[\"Ιάκωβος\",\"Ιακωβίνα\",\"Ζακελίνα\"],\"date\":\"30\\/04\"},{\"names\":[\"Ιάκωβος\"],\"date\":\"23\\/10\"},{\"names\":[\"Ιγνάτιος\",\"Ιγνάτης\",\"Ιγνατία\"],\"date\":\"14\\/10\"},{\"names\":[\"Ιγνάτιος\",\"Ιγνάτης\",\"Ιγνατία\"],\"date\":\"20\\/12\"},{\"names\":[\"Ιανός\",\"Ιανή\"],\"date\":\"21\\/04\"},{\"names\":[\"Ιανουάριος\"],\"date\":\"21\\/04\"},{\"names\":[\"Ιέραξ\",\"Ιέρακας\",\"Γέρακας\"],\"date\":\"01\\/06\"},{\"names\":[\"Ιερεμίας\"],\"date\":\"01\\/05\"},{\"names\":[\"Ιερία\",\"Ιέρεια\"],\"date\":\"03\\/06\"},{\"names\":[\"Ιερόθεος\",\"Ιεροθέα\",\"Ιεροθέη\"],\"date\":\"04\\/10\"},{\"names\":[\"Ιερώνυμος\",\"Γερώνυμος\",\"Ιερονύμη\"],\"date\":\"15\\/06\"},{\"names\":[\"Ιάσιμος\",\"Ιασίμη\",\"Σίμος\",\"Σίμη\"],\"date\":\"04\\/02\"},{\"names\":[\"Ιάσων\",\"Ιάσονας\",\"Ιάσωνας\"],\"date\":\"29\\/04\"},{\"names\":[],\"date\":\"01\\/09\"},{\"names\":[\"Ιππόλυτος\",\"Ιππολύτη\",\"Ιππολύτα\"],\"date\":\"10\\/08\"},{\"names\":[\"Ιλαρίων\",\"Ιλαρίωνας\",\"Ιλαρία\",\"Ιλαριάδα\",\"Λαριάδα\"],\"date\":\"06\\/06\"},{\"names\":[\"Ιλιάνα\",\"Ιλιάς\"],\"date\":\"09\\/03\"},{\"names\":[\"Ιλλύριος\",\"Ιλλυρία\",\"Λύρος\",\"Λύρα\"],\"date\":\"03\\/04\"},{\"names\":[\"Ιορδάνης\",\"Γιορντανής\",\"Ντάνης\",\"Δάνης\",\"Ιορδανία\",\"Ιορδάνα\",\"Γιορντάνα\",\"Ντάνα\",\"Δάνα\"],\"date\":\"06\\/01\"},{\"names\":[\"Ιουβενάλιος\",\"Ιουβεναλία\",\"Ιουβενάλης\",\"Γιουβενάλης\"],\"date\":\"13\\/12\"},{\"names\":[\"Ιουλία\",\"Ιουλίτσα\",\"Γιουλία\",\"Γιούλα\",\"Γιουλίτσα\",\"Ιούλιος\",\"Τζούλια\"],\"date\":\"18\\/05\"},{\"names\":[\"Ιουλιανή\",\"Ιουλία\",\"Ιουλίτσα\",\"Γιουλία\",\"Γιούλα\",\"Γιουλίτσα\",\"Ιούλιος\",\"Τζούλια\"],\"date\":\"21\\/12\"},{\"names\":[\"Ιουλιανός\",\"Γιουλιανός\",\"Γιολανός\"],\"date\":\"16\\/03\"},{\"names\":[\"Ιουλίττα\",\"Ιουλίτα\",\"Ιουλίττη\",\"Ιουλίτη\",\"Γιουλίττα\",\"Γιουλίτα\",\"Γιουλίττη\",\"Γιουλίτη\"],\"date\":\"15\\/07\"},{\"names\":[\"Ιουνία\",\"Γιουνία\"],\"date\":\"17\\/05\"},{\"names\":[\"Ιούστα\",\"Γιούστα\"],\"date\":\"02\\/10\"},{\"names\":[\"Ιουστίνα\",\"Ιουστίνη\",\"Γιουστίνα\",\"Γιουστίνη\"],\"date\":\"02\\/10\"},{\"names\":[\"Ιουστινιανός\"],\"date\":\"02\\/08\"},{\"names\":[\"Ιουστίνος\"],\"date\":\"01\\/06\"},{\"names\":[\"Ιρις\",\"Ιριδα\"],\"date\":\"23\\/09\"},{\"names\":[\"Ιφιγένεια\"],\"date\":\"16\\/11\"},{\"names\":[\"Ισιδώρα\",\"Δώρα\"],\"date\":\"01\\/05\"},{\"names\":[\"Ισίδωρος\",\"Σιδέρης\"],\"date\":\"04\\/02\"},{\"names\":[\"Ισίδωρος\",\"Σιδέρης\"],\"date\":\"14\\/05\"},{\"names\":[\"Ισμαήλ\",\"Ισμαήλης\",\"Ισμαήλος\",\"Σμαήλης\",\"Σμαήλος\",\"Μαήλης\",\"Μαήλος\"],\"date\":\"17\\/06\"},{\"names\":[\"Ισμήνη\"],\"date\":\"01\\/09\"},{\"names\":[\"Ισοκράτης\"],\"date\":\"10\\/04\"},{\"names\":[\"Ιώβ\",\"Ιωβία\",\"Ιώβη\"],\"date\":\"06\\/05\"},{\"names\":[],\"date\":\"13\\/12\"},{\"names\":[\"Ιωακείμ\",\"Μάκης\"],\"date\":\"09\\/09\"},{\"names\":[\"Ιωάννης\",\"Ιωάννα\",\"Ιβάνα\",\"Βάνα\",\"Βάννα\"],\"date\":\"07\\/01\"},{\"names\":[],\"date\":\"27\\/05\"},{\"names\":[\"Ιωαννίκιος\",\"Ιωανίκιος\"],\"date\":\"04\\/11\"},{\"names\":[\"Ιωνάς\",\"Ιων\",\"Ιωνία\"],\"date\":\"21\\/09\"},{\"names\":[\"Ιωσήφ\",\"Σήφης\",\"Ιωσηφίνα\",\"Ζοζεφίνα\"],\"date\":\"09\\/04\"},{\"names\":[\"Ιωσήφ\",\"Σήφης\",\"Ιωσηφίνα\",\"Ζοζεφίνα\"],\"date\":\"31\\/07\"},{\"names\":[\"Ιωσήφ\",\"Σήφης\",\"Ιωσηφίνα\",\"Ζοζεφίνα\"],\"date\":\"30\\/12\"},{\"names\":[\"Κάλη\"],\"date\":\"15\\/05\"},{\"names\":[\"Καλλιόπη\",\"Καλλιοπία\",\"Πόπη\"],\"date\":\"08\\/06\"},{\"names\":[\"Καλλίνικος\",\"Καλλινίκης\"],\"date\":\"29\\/07\"},{\"names\":[\"Καλλιρόη\",\"Καλλιρρόη\"],\"date\":\"01\\/09\"},{\"names\":[\"Καλλίς\",\"Καλλίδα\",\"Καλλία\",\"Κάλλι\",\"Καλίς\",\"Καλίδα\",\"Καλία\",\"Κάλι\"],\"date\":\"16\\/04\"},{\"names\":[\"Καλλισθένη\",\"Καλλισθένης\"],\"date\":\"04\\/10\"},{\"names\":[\"Καλλίστη\"],\"date\":\"01\\/09\"},{\"names\":[\"Κάλλιστος\",\"Κάλιστος\"],\"date\":\"20\\/06\"},{\"names\":[\"Καλλίστρατος\",\"Καλλιστράτης\",\"Καλλιστράτη\"],\"date\":\"27\\/09\"},{\"names\":[\"Καλλιστώ\",\"Καλιστώ\"],\"date\":\"01\\/09\"},{\"names\":[\"Καθολική\"],\"date\":\"15\\/08\"},{\"names\":[\"Κέλσιος\",\"Κέλσια\",\"Κέλσα\",\"Κέλση\",\"Τσέλση\",\"Ελση\",\"Ελσα\"],\"date\":\"08\\/01\"},{\"names\":[\"Κερασιά\"],\"date\":\"20\\/10\"},{\"names\":[\"Καρπός\"],\"date\":\"13\\/10\"},{\"names\":[\"Καρπός\"],\"date\":\"26\\/05\"},{\"names\":[\"Κέρκυρα\"],\"date\":\"29\\/04\"},{\"names\":[\"Κασσιανή\",\"Κάσσυ\",\"Κασιανή\",\"Κασσιανός\",\"Κασιανός\",\"Κασσία\",\"Κασία\",\"Κάσσιος\",\"Κάσιος\",\"Κάσσος\",\"Κάσος\",\"Κάσσης\",\"Κάσης\"],\"date\":\"07\\/09\"},{\"names\":[\"Κασσιανός\",\"Κασιανός\",\"Κάσσιος\",\"Κάσιος\",\"Κάσσος\",\"Κάσος\",\"Κάσσης\",\"Κάσης\",\"Κασσια\",\"Κασια\"],\"date\":\"29\\/02\"},{\"names\":[\"Κάστωρ\",\"Κάστορας\",\"Κάστορης\"],\"date\":\"18\\/09\"},{\"names\":[\"Κήρυκος\"],\"date\":\"15\\/07\"},{\"names\":[\"Κλειώ\"],\"date\":\"01\\/09\"},{\"names\":[\"Κλεόπας\",\"Κλεόπιος\",\"Κλεοπία\",\"Κλεοπάκης\",\"Πάκης\"],\"date\":\"30\\/10\"},{\"names\":[\"Κλεοπάτρα\",\"Πάτρα\",\"Πατρούλα\",\"Κλειώ\",\"Πατριτσα\"],\"date\":\"01\\/09\"},{\"names\":[\"Κλεοπάτρα\",\"Πάτρα\",\"Πατρούλα\",\"Πατρίτσα\",\"Κλειώ\"],\"date\":\"19\\/10\"},{\"names\":[\"Κλεονίκη\"],\"date\":\"01\\/09\"},{\"names\":[\"Κλεόνικος\",\"Κλεονίκη\",\"Κλεονίκω\",\"Νίκη\"],\"date\":\"03\\/03\"},{\"names\":[\"Κιάρα\",\"Κιαράν\"],\"date\":\"09\\/09\"},{\"names\":[\"Κλημεντίνη\",\"Κλημεντίνα\",\"Κλεμεντίνη\",\"Κλεμεντίνα\"],\"date\":\"10\\/09\"},{\"names\":[\"Κλήμης\"],\"date\":\"10\\/09\"},{\"names\":[\"Κλώντια\",\"Κλόντια\",\"Κλό\",\"Κλαύδια\"],\"date\":\"20\\/03\"},{\"names\":[\"Κόδρος\",\"Κόδρα\"],\"date\":\"22\\/05\"},{\"names\":[\"Κόπρος\",\"Κόπρις\"],\"date\":\"24\\/09\"},{\"names\":[\"Κόνων\"],\"date\":\"05\\/03\"},{\"names\":[\"Κοραλία\",\"Κοραλλού\"],\"date\":\"01\\/09\"},{\"names\":[\"Κορνήλιος\",\"Κορνήλης\",\"Κορνήλος\",\"Κορνηλία\",\"Κορνήλα\"],\"date\":\"13\\/09\"},{\"names\":[\"Κοσμάς\"],\"date\":\"01\\/07\"},{\"names\":[\"Κοσμάς\"],\"date\":\"01\\/11\"},{\"names\":[\"Κρονίων\",\"Κρονίωνας\",\"Κρονίος\",\"Κρόνος\",\"Κρονία\"],\"date\":\"30\\/10\"},{\"names\":[\"Κρυστάλλω\",\"Κρουστάλλω\",\"Κρουστάλω\",\"Κρυσταλία\",\"Κρυσταλλία\",\"Κρουσταλένια\",\"Κρίστι\",\"Κρύστα\"],\"date\":\"15\\/08\"},{\"names\":[\"Κυπαρισσία\",\"Σίσσυ\",\"Παρέσια\",\"Παρεσίνα\",\"Παρεσσία\",\"Παρέσσα\"],\"date\":\"26\\/11\"},{\"names\":[\"Κυπριανός\",\"Κυπριανή\"],\"date\":\"02\\/10\"},{\"names\":[\"Κύρα\",\"Κυράτσα\",\"Κυράτσω\",\"Κυράτση\",\"Κυρατσούδα\",\"Κυρατσούλα\"],\"date\":\"28\\/02\"},{\"names\":[\"Κυριακή\",\"Κυριάκος\",\"Κική\",\"Κίκα\",\"Κικίτσα\",\"Κίτσα\",\"Κορίνα\",\"Σάντυ\",\"Κίτσος\",\"Ντομένικα\",\"Ρία\",\"Ύρια\",\"Ια\"],\"date\":\"07\\/07\"},{\"names\":[\"Κυριάκος\"],\"date\":\"29\\/09\"},{\"names\":[\"Κύριλλος\",\"Κυριλλία\",\"Κυρίλλα\",\"Κυρίλλη\"],\"date\":\"18\\/01\"},{\"names\":[\"Κύρος\",\"Κύρης\"],\"date\":\"31\\/01\"},{\"names\":[\"Κωνσταντίνα\",\"Κωσταντίνα\",\"Κωστούλα\",\"Ντίνα\",\"Τίνα\"],\"date\":\"21\\/05\"},{\"names\":[\"Κωνσταντίνος\",\"Κωσταντίνος\",\"Κώστας\",\"Κωστής\",\"Κώτσος\",\"Κώτσαρης\",\"Κωστάκης\",\"Κωτσάκης\",\"Κωστάρας\",\"Κωστάλας\"],\"date\":\"21\\/05\"},{\"names\":[\"Κωνστάντιος\",\"Κωστάντιος\",\"Κωνσταντία\",\"Κωσταντία\",\"Ντία\"],\"date\":\"26\\/12\"},{\"names\":[\"Λέανδρος\"],\"date\":\"13\\/03\"},{\"names\":[\"Λεπτίνα\",\"Λέπτινος\"],\"date\":\"26\\/10\"},{\"names\":[\"Λαμπαδός\",\"Λαμπαδία\",\"Λαμπαδίνα\",\"Λαμπαδή\"],\"date\":\"05\\/07\"},{\"names\":[\"Λεονάρδος\"],\"date\":\"06\\/11\"},{\"names\":[\"Λεμονιά\"],\"date\":\"21\\/11\"},{\"names\":[\"Λεόντιος\",\"Λεοντία\",\"Λεοντίνα\",\"Λεοντίτσα\"],\"date\":\"18\\/06\"},{\"names\":[\"Λεύκιος\",\"Λεύκης\",\"Λεύκος\",\"Λευκή\",\"Λευκούλα\",\"Λεύκας\",\"Λευκάδα\"],\"date\":\"14\\/12\"},{\"names\":[\"Λευκοθέα\",\"Λευκοθέη\"],\"date\":\"17\\/08\"},{\"names\":[\"Λαυρέντιος\",\"Λαυρέντης\"],\"date\":\"10\\/08\"},{\"names\":[\"Λαύρος\",\"Λαύρης\",\"Λάουρος\",\"Λαύρα\",\"Λάουρα\"],\"date\":\"18\\/08\"},{\"names\":[\"Λέων\",\"Λέοντας\",\"Λεοντάριος\",\"Λεοντάρης\",\"Λεοντόκαρδος\"],\"date\":\"18\\/02\"},{\"names\":[\"Λεωνίδης\",\"Λεωνίδας\",\"Λεωνιδία\"],\"date\":\"15\\/04\"},{\"names\":[\"Λήδα\",\"Λύδα\"],\"date\":\"27\\/03\"},{\"names\":[\"Λήδα\",\"Λύδα\"],\"date\":\"20\\/05\"},{\"names\":[\"Λιβύη\",\"Λίβιος\",\"Λίβας\"],\"date\":\"15\\/06\"},{\"names\":[\"Λίνος\",\"Λίνα\"],\"date\":\"05\\/11\"},{\"names\":[\"Λοίζος\"],\"date\":\"22\\/09\"},{\"names\":[\"Λώτ\",\"Λότ\"],\"date\":\"09\\/10\"},{\"names\":[\"Λούππος\",\"Λούππης\"],\"date\":\"27\\/10\"},{\"names\":[\"Λουίζα\"],\"date\":\"22\\/09\"},{\"names\":[\"Λουκάς\",\"Λουκία\",\"Λουκίτσα\"],\"date\":\"18\\/10\"},{\"names\":[\"Λουκάς\",\"Λουκία\",\"Λουκίτσα\"],\"date\":\"11\\/06\"},{\"names\":[\"Λουκάς\",\"Λουκία\",\"Λουκίτσα\"],\"date\":\"13\\/12\"},{\"names\":[\"Λουκιανός\",\"Λουκιανή\"],\"date\":\"15\\/10\"},{\"names\":[\"Λούλου\",\"Λούλης\",\"Λούλα\"],\"date\":\"23\\/06\"},{\"names\":[\"Λουντμίλλα\",\"Λουντμίλα\"],\"date\":\"16\\/09\"},{\"names\":[\"Λυδία\"],\"date\":\"27\\/03\"},{\"names\":[\"Λυδία\"],\"date\":\"20\\/05\"},{\"names\":[\"Λυκίας\",\"Λυκία\",\"Λύκιος\"],\"date\":\"06\\/07\"},{\"names\":[\"Λυμπέρης\",\"Λιμπέρης\",\"Λιμπέριος\",\"Λιβέριος\",\"Λιβέρης\"],\"date\":\"27\\/08\"},{\"names\":[\"Λυσίμαχος\",\"Λυσιμάχη\"],\"date\":\"09\\/03\"},{\"names\":[\"Λώρα\",\"Λωραίνη\",\"Λάουρα\",\"Λαυρεντία\",\"Λαυρεντίνα\"],\"date\":\"10\\/08\"},{\"names\":[\"Μαγδαληνή\",\"Μάγδα\",\"Μαγδούλα\",\"Μαγδαλένα\",\"Μαγδαλένια\",\"Μαγδαλή\",\"Μαγδάλω\"],\"date\":\"19\\/05\"},{\"names\":[\"Μαγδαληνή\",\"Μάγδα\",\"Μαγδούλα\",\"Μαγδαλένα\",\"Μαγδαλένια\",\"Μαγδαλή\",\"Μαγδάλω\"],\"date\":\"22\\/07\"},{\"names\":[\"Μάγνος\",\"Μάγνα\",\"Μαγνής\"],\"date\":\"28\\/04\"},{\"names\":[\"Μάγος\",\"Μάγια\"],\"date\":\"31\\/05\"},{\"names\":[\"Μελχιώρ\",\"Μελχιόρ\"],\"date\":\"25\\/12\"},{\"names\":[\"Μακεδόνιος\",\"Μακεδόνας\",\"Μακεδόνης\",\"Μακεδονία\",\"Μακεδονούλα\",\"Μακεδονίτσα\",\"Μακεδών\"],\"date\":\"27\\/03\"},{\"names\":[\"Μαλαματή\",\"Μάλα\",\"Μαλαματένια\",\"Ματίνα\"],\"date\":\"23\\/08\"},{\"names\":[\"Μαλαματή\",\"Μάλα\",\"Μαλαματένια\",\"Ματίνα\"],\"date\":\"30\\/04\"},{\"names\":[\"Μελανία\",\"Μέλανυ\",\"Μελανή\",\"Μαύρη\"],\"date\":\"31\\/12\"},{\"names\":[\"Μακάριος\",\"Μακάρης\",\"Μακαράς\",\"Μακαρία\",\"Μακάρω\",\"Μακαρίτσα\",\"Μακαρούλα\"],\"date\":\"19\\/01\"},{\"names\":[\"Μακάριος\"],\"date\":\"26\\/06\"},{\"names\":[\"Μελέτιος\",\"Μελέτης\",\"Μελετία\",\"Μελετούλα\",\"Μελετίνα\"],\"date\":\"12\\/02\"},{\"names\":[\"Μελέτιος\",\"Μελέτης\",\"Μελετία\",\"Μελετούλα\",\"Μελετίνα\"],\"date\":\"01\\/09\"},{\"names\":[\"Μελπομένη\"],\"date\":\"01\\/09\"},{\"names\":[\"Μελής\",\"Μέλος\",\"Μέλιος\",\"Μέλας\",\"Μέλια\",\"Μελίτσα\"],\"date\":\"04\\/05\"},{\"names\":[\"Μελιτίνη\",\"Μελιτίνος\",\"Μελιτίνα\",\"Μελίτη\",\"Μελίτα\",\"Μελίνα\"],\"date\":\"16\\/09\"},{\"names\":[\"Μελιτίνη\",\"Μελιτίνος\",\"Μελιτίνα\",\"Μελίτη\",\"Μελίτα\",\"Μελίνα\"],\"date\":\"29\\/10\"},{\"names\":[\"Μελίτων\",\"Μελίτωνας\",\"Μελίτος\",\"Μελίτης\"],\"date\":\"30\\/06\"},{\"names\":[\"Μεθόδιος\"],\"date\":\"11\\/05\"},{\"names\":[\"Μεθόδιος\"],\"date\":\"20\\/06\"},{\"names\":[\"Μακρίνα\"],\"date\":\"19\\/07\"},{\"names\":[\"Μενέλαος\"],\"date\":\"22\\/07\"},{\"names\":[\"Μένανδρος\"],\"date\":\"19\\/05\"},{\"names\":[\"Μάμας\",\"Μάμαντας\",\"Μάμα\"],\"date\":\"02\\/09\"},{\"names\":[\"Μαξιμιλιανός\"],\"date\":\"04\\/08\"},{\"names\":[\"Μάξιμος\",\"Μάξιμη\",\"Μάξιμα\"],\"date\":\"21\\/01\"},{\"names\":[\"Μάξιμος\",\"Μάξιμη\",\"Μάξιμα\"],\"date\":\"10\\/04\"},{\"names\":[\"Μαντώ\"],\"date\":\"01\\/09\"},{\"names\":[\"Μαργαρίτα\"],\"date\":\"01\\/09\"},{\"names\":[\"Μαργαρίτα\"],\"date\":\"25\\/01\"},{\"names\":[\"Μαργέτα\",\"Μαριέττα\",\"Μαργετίνα\"],\"date\":\"15\\/08\"},{\"names\":[\"Μάριος\",\"Μάρω\",\"Μαριώ\",\"Μαριωρή\",\"Μαρίκα\",\"Μαριγώ\",\"Μαριγούλα\",\"Μαρούλα\",\"Μαρίτσα\",\"Μανιώ\",\"Μαριέττα\",\"Μαρούσα\",\"Μάρσια\",\"Μαρια\"],\"date\":\"15\\/08\"},{\"names\":[\"Μάριος\",\"Μάρω\",\"Μαριώ\",\"Μαριωρή\",\"Μαρίκα\",\"Μαριγώ\",\"Μαριγούλα\",\"Μαρούλα\",\"Μαρίτσα\",\"Μαριέττα\",\"Μαρούσα\",\"Μάρσια\",\"Μαρια\"],\"date\":\"21\\/11\"},{\"names\":[\"Μάρθα\"],\"date\":\"04\\/06\"},{\"names\":[\"Μαρκέλλα\",\"Μαρκέλα\",\"Μαρκελλή\",\"Μαρκελή\"],\"date\":\"22\\/07\"},{\"names\":[\"Μάρκελος\"],\"date\":\"09\\/02\"},{\"names\":[\"Μάρκελος\"],\"date\":\"01\\/08\"},{\"names\":[\"Μαριάνθη\"],\"date\":\"01\\/09\"},{\"names\":[\"Μαριάννα\"],\"date\":\"28\\/02\"},{\"names\":[\"Μαριλένα\"],\"date\":\"19\\/05\"},{\"names\":[\"Μαριλένα\"],\"date\":\"22\\/07\"},{\"names\":[\"Μαρκιανή\",\"Μαρκιάνα\"],\"date\":\"24\\/05\"},{\"names\":[\"Μαρκιανός\",\"Μαρκίνος\"],\"date\":\"30\\/10\"},{\"names\":[\"Μαρίνα\",\"Μαρίνος\"],\"date\":\"17\\/07\"},{\"names\":[\"Μαρινίκη\"],\"date\":\"15\\/08\"},{\"names\":[\"Μαρίνος\"],\"date\":\"02\\/06\"},{\"names\":[\"Μαρίνος\"],\"date\":\"18\\/10\"},{\"names\":[\"Μάριος\"],\"date\":\"13\\/03\"},{\"names\":[\"Μερκούριος\",\"Μερκούρης\",\"Μέρκουρας\",\"Μάρκορας\",\"Μερκουρία\"],\"date\":\"25\\/11\"},{\"names\":[\"Μερόπη\",\"Μυρόπη\"],\"date\":\"02\\/12\"},{\"names\":[\"Μέρτιος\",\"Μέρτος\",\"Μέρτης\",\"Μύρτος\",\"Μερτία\",\"Μέρτα\",\"Μέρτη\",\"Μερτούλα\",\"Μυρτιά\",\"Μυρτούλα\"],\"date\":\"12\\/01\"},{\"names\":[\"Μεταξία\",\"Μεταξούλα\",\"Ταξούλα\",\"Μεταξένια\"],\"date\":\"08\\/11\"},{\"names\":[\"Ματθαίος\",\"Μαθαίος\",\"Μαθιός\",\"Ματθούλα\",\"Μαθούλα\"],\"date\":\"16\\/11\"},{\"names\":[],\"date\":\"14\\/03\"},{\"names\":[\"Ματίνα\"],\"date\":\"08\\/11\"},{\"names\":[\"Μαύρα\",\"Μαυρούλα\",\"Μαυρίτσα\",\"Μαύρος\"],\"date\":\"09\\/11\"},{\"names\":[\"Μαυρίκιος\",\"Μαυρίκης\",\"Μαυρικία\",\"Μαυρίκα\",\"Μωρίς\"],\"date\":\"27\\/12\"},{\"names\":[\"Μαυρίκιος\",\"Μαυρίκης\",\"Μαυρικία\",\"Μαυρίκα\",\"Μωρίς\"],\"date\":\"01\\/07\"},{\"names\":[\"Μαύρος\",\"Μαυρουδής\",\"Μαυροειδής\",\"Μαυρέτα\"],\"date\":\"30\\/01\"},{\"names\":[\"Ματρώνα\",\"Ματρόνα\"],\"date\":\"27\\/03\"},{\"names\":[\"Ματρώνα\",\"Ματρόνα\"],\"date\":\"20\\/10\"},{\"names\":[\"Ματρώνα\",\"Ματρόνα\"],\"date\":\"02\\/05\"},{\"names\":[\"Μήλιος\",\"Μήλης\",\"Μηλιώ\",\"Μηλιά\",\"Μηλίτσα\"],\"date\":\"08\\/05\"},{\"names\":[\"Μηνάς\",\"Μηναίς\",\"Μήνα\"],\"date\":\"11\\/11\"},{\"names\":[\"Μηνοδώρα\"],\"date\":\"10\\/09\"},{\"names\":[\"Μητροδώρα\"],\"date\":\"10\\/09\"},{\"names\":[\"Μπαλταζάρ\",\"Μπαλτασάρ\"],\"date\":\"25\\/12\"},{\"names\":[\"Μιχαηλ\"],\"date\":\"02\\/05\"},{\"names\":[\"Ρωμανος\"],\"date\":\"24\\/07\"},{\"names\":[\"Μπριζίτ\",\"Μπριγκίτα\",\"Μπριγκίττα\"],\"date\":\"01\\/02\"},{\"names\":[\"Μιχαέλα\",\"Μιχαέλλα\",\"Μιχαήλα\",\"Μιχαηλίτσα\",\"Μιχαλίτσα\",\"Μισέλ\",\"Μιχαλία\"],\"date\":\"08\\/11\"},{\"names\":[\"Μιχαήλ\",\"Μιχάλης\",\"Μιχαλός\",\"Μιχαλιός\",\"Μιχαλάκης\",\"Μίχος\",\"Μιχελής\",\"Μιχαηλός\"],\"date\":\"08\\/11\"},{\"names\":[\"Μιλτιάδης\",\"Μίλτος\"],\"date\":\"10\\/04\"},{\"names\":[\"Μίλος\",\"Μίλης\",\"Μίλων\"],\"date\":\"10\\/11\"},{\"names\":[\"Μίνος\",\"Μίνως\",\"Μίνα\"],\"date\":\"11\\/11\"},{\"names\":[\"Μιρέλλα\",\"Μυρέλλα\",\"Μιρέιγ\"],\"date\":\"15\\/08\"},{\"names\":[\"Μόδεστος\"],\"date\":\"16\\/12\"},{\"names\":[],\"date\":\"19\\/05\"},{\"names\":[\"Μόνικα\",\"Μόνα\"],\"date\":\"15\\/06\"},{\"names\":[\"Μορφούλα\"],\"date\":\"06\\/08\"},{\"names\":[\"Μόσχω\",\"Μοσχούλα\"],\"date\":\"01\\/09\"},{\"names\":[\"Μυγδόνιος\",\"Μυγδόνης\",\"Μυγδονία\",\"Μιγδονία\"],\"date\":\"28\\/12\"},{\"names\":[\"Μυρσίνη\",\"Μυρσώ\",\"Μέρσα\",\"Αμερισούδα\",\"Αμερσούδα\",\"Αμέρσσα\",\"Αμέρσα\"],\"date\":\"24\\/09\"},{\"names\":[\"Μυρτιδιώτισσα\",\"Μυρτώ\",\"Μύρτα\",\"Μυρτιά\"],\"date\":\"24\\/09\"},{\"names\":[\"Μύρων\",\"Μύρα\",\"Μίρκα\"],\"date\":\"17\\/08\"},{\"names\":[\"Μωϋσής\",\"Μωϋσία\",\"Μωσής\",\"Μωσία\"],\"date\":\"04\\/09\"},{\"names\":[\"Ναζάριος\"],\"date\":\"14\\/10\"},{\"names\":[\"Νέαρχος\",\"Νιάρχος\"],\"date\":\"22\\/04\"},{\"names\":[\"Ναθαναήλ\",\"Ναθάνης\",\"Ναθαναήλος\",\"Ναθαναήλης\",\"Ναθαναηλία\",\"Ναθανηλία\",\"Ναθανίτσα\"],\"date\":\"22\\/04\"},{\"names\":[\"Νεκτάριος\",\"Νεκτάρης\",\"Νεκταρία\",\"Νεκταρίνα\",\"Νεκταρούλα\"],\"date\":\"09\\/11\"},{\"names\":[\"Νάντια\"],\"date\":\"21\\/05\"},{\"names\":[\"Ναούμ\",\"Ναούμης\",\"Ναούμα\",\"Ναόμι\"],\"date\":\"01\\/12\"},{\"names\":[\"Νεόφυτος\",\"Νεοφυτία\",\"Νεοφύτη\"],\"date\":\"21\\/01\"},{\"names\":[\"Νερατζιά\"],\"date\":\"08\\/09\"},{\"names\":[\"Νάρκισος\",\"Νάρκισσος\"],\"date\":\"31\\/10\"},{\"names\":[\"Ναταλία\",\"Ναταλίνα\",\"Ναταλή\",\"Νάταλι\"],\"date\":\"26\\/08\"},{\"names\":[\"Νατάσα\",\"Νατάσσα\",\"Τασία\",\"Σία\",\"Τατία\",\"Τάσα\",\"Τέσα\",\"Τασούλα\",\"Τασσώ\"],\"date\":\"22\\/12\"},{\"names\":[\"Ναυκράτιος\",\"Ναυκράτης\"],\"date\":\"08\\/06\"},{\"names\":[\"Νέστωρ\",\"Νέστορας\",\"Νεστορία\"],\"date\":\"27\\/10\"},{\"names\":[\"Νήσιος\",\"Νήσης\",\"Νήσα\"],\"date\":\"27\\/02\"},{\"names\":[\"Νήφων\"],\"date\":\"14\\/06\"},{\"names\":[\"Νήφων\"],\"date\":\"23\\/12\"},{\"names\":[\"Νίκανδρος\",\"Νικανδρία\",\"Νίκη\"],\"date\":\"05\\/06\"},{\"names\":[\"Νικάνωρ\",\"Νικάνορας\"],\"date\":\"07\\/08\"},{\"names\":[\"Νίκη\"],\"date\":\"16\\/04\"},{\"names\":[\"Νίκη\"],\"date\":\"25\\/04\"},{\"names\":[\"Νικήτας\",\"Νικήτη\",\"Νικήτα\"],\"date\":\"15\\/09\"},{\"names\":[\"Νικηφόρος\",\"Νικηφορία\",\"Νικηφόρα\",\"Νίκη\"],\"date\":\"02\\/06\"},{\"names\":[\"Νικηφόρος\",\"Νικηφορία\",\"Νικηφόρα\",\"Νίκη\"],\"date\":\"09\\/02\"},{\"names\":[\"Νικόδημος\",\"Νικοδήμη\",\"Δήμος\",\"Δήμη\"],\"date\":\"14\\/07\"},{\"names\":[\"Νικόλαος\",\"Νικόλας\",\"Νίκος\",\"Νικολός\",\"Νικολής\",\"Νικολάκης\",\"Νικολούδα\",\"Νικολίτσα\"],\"date\":\"06\\/12\"},{\"names\":[],\"date\":\"14\\/04\"},{\"names\":[\"Νικολέττα\",\"Νικολετα\"],\"date\":\"06\\/12\"},{\"names\":[\"Νικολίνα\"],\"date\":\"06\\/12\"},{\"names\":[\"Νίκων\"],\"date\":\"26\\/11\"},{\"names\":[\"Νίνας\",\"Νίνα\"],\"date\":\"14\\/01\"},{\"names\":[\"Νόννα\",\"Νόνα\"],\"date\":\"05\\/08\"},{\"names\":[\"Ντιάνα\",\"Διάνα\"],\"date\":\"20\\/10\"},{\"names\":[\"Νυμφοδώρα\"],\"date\":\"10\\/09\"},{\"names\":[\"Ξένη\",\"Ξένια\",\"Ξένος\",\"Ξένιος\"],\"date\":\"24\\/01\"},{\"names\":[\"Ξανθίππη\",\"Ξανθή\",\"Ξανθούλα\"],\"date\":\"23\\/09\"},{\"names\":[\"Ξάνθιππος\"],\"date\":\"23\\/09\"},{\"names\":[\"Ξάνθος\",\"Ξάνθιος\",\"Ξανθιάς\",\"Ξανθούλιος\",\"Ξανθούλης\",\"Ξανθή\",\"Ξανθούλα\"],\"date\":\"09\\/03\"},{\"names\":[\"Ξενοφών\",\"Ξενοφώντας\",\"Φώντας\",\"Φόντας\",\"Φόνης\",\"Ξενοφωντία\",\"Ξενοφωντίνα\",\"Ξενοφούλα\",\"Ξενοφώντη\",\"Ξένια\"],\"date\":\"26\\/01\"},{\"names\":[\"Ξενοφών\",\"Ξενοφώντας\",\"Φώντας\",\"Φόντας\",\"Φόνης\",\"Ξενοφωντία\",\"Ξενοφωντίνα\",\"Ξενοφούλα\",\"Ξενοφώντη\",\"Ξένια\"],\"date\":\"10\\/04\"},{\"names\":[\"Ολγα\",\"Ολγίτσα\",\"Γίτσα\"],\"date\":\"11\\/07\"},{\"names\":[\"Ολιβιανός\",\"Ολβιανός\",\"Ολιβία\"],\"date\":\"29\\/05\"},{\"names\":[\"Ολιβιανός\",\"Ολβιανός\",\"Ολιβία\"],\"date\":\"17\\/09\"},{\"names\":[\"Ολυμπία\"],\"date\":\"11\\/05\"},{\"names\":[\"Ολυμπιάς\",\"Ολυμπιάδα\",\"Ολυμπία\",\"Ολύμπω\",\"Ολύμπη\",\"Ολια\",\"Ολυμπούλα\"],\"date\":\"25\\/07\"},{\"names\":[\"Ολύμπιος\"],\"date\":\"03\\/08\"},{\"names\":[\"Ομηρος\"],\"date\":\"10\\/04\"},{\"names\":[\"Ονούφριος\",\"Ονούφρης\",\"Ονουφρία\"],\"date\":\"12\\/06\"},{\"names\":[\"Ορέστης\",\"Ορεστία\",\"Ορεστιάς\",\"Ορεστιάδα\"],\"date\":\"10\\/11\"},{\"names\":[\"Ορσαλία\"],\"date\":\"21\\/10\"},{\"names\":[\"Ορτίσιος\",\"Ορτίσης\",\"Ορτίσια\",\"Ορτανσία\"],\"date\":\"15\\/06\"},{\"names\":[\"Οσιος\",\"Οσία\"],\"date\":\"27\\/08\"},{\"names\":[\"Ουρανία\",\"Ράνια\"],\"date\":\"01\\/09\"},{\"names\":[\"Ουρανία\",\"Ράνια\"],\"date\":\"06\\/01\"},{\"names\":[\"Ούρσουλα\"],\"date\":\"21\\/10\"},{\"names\":[\"Παχώμιος\",\"Παχούμιος\",\"Πάχος\"],\"date\":\"15\\/05\"},{\"names\":[\"Παγκράτιος\",\"Παγκρατία\"],\"date\":\"09\\/02\"},{\"names\":[\"Παγκράτιος\",\"Παγκρατία\"],\"date\":\"09\\/07\"},{\"names\":[\"Πελαγία\",\"Πελάγιος\",\"Πελαγής\",\"Πελαγούλα\",\"Πελαγίνα\",\"Πελαγίτσα\",\"Πελαγιώ\"],\"date\":\"08\\/10\"},{\"names\":[\"Παλλαδία\",\"Παλαδία\",\"Παλλάδα\",\"Παλάδα\"],\"date\":\"24\\/05\"},{\"names\":[\"Παλλάδιος\",\"Παλάδιος\",\"Παλλάδης\",\"Παλάδης\"],\"date\":\"28\\/01\"},{\"names\":[\"Πελοπίδας\"],\"date\":\"10\\/04\"},{\"names\":[\"Παναγής\",\"Πανάγος\"],\"date\":\"07\\/06\"},{\"names\":[\"Παναγιώτης\",\"Πάνος\",\"Πανούσος\",\"Παναγής\",\"Πανάγος\",\"Γιώτης\",\"Πανίκος\",\"Τάκης\",\"Παναγιώτα\",\"Γιώτα\",\"Παναγιούλα\",\"Παναγούλα\",\"Πάνη\",\"Τότα\",\"Τούλα\"],\"date\":\"15\\/08\"},{\"names\":[\"Παναγιώτης\",\"Πάνος\",\"Πανούσος\",\"Παναγής\",\"Πανάγος\",\"Γιώτης\",\"Πανίκος\",\"Τάκης\",\"Παναγιώτα\",\"Γιώτα\",\"Παναγιούλα\",\"Παναγούλα\",\"Πάνη\",\"Τότα\",\"Τούλα\"],\"date\":\"26\\/12\"},{\"names\":[\"Πανδώρα\"],\"date\":\"01\\/09\"},{\"names\":[\"Παντελεήμων\",\"Παντελεήμονας\",\"Παντελής\",\"Παντελάκης\",\"Παντέλος\",\"Παντελίτσα\",\"Παντελίνα\",\"Παντελεούσα\"],\"date\":\"27\\/07\"},{\"names\":[\"Πάμφιλος\"],\"date\":\"16\\/02\"},{\"names\":[\"Παντολέων\",\"Παντολέοντας\",\"Παντολεοντία\",\"Παντολεοντής\",\"Παντολεοντή\"],\"date\":\"17\\/09\"},{\"names\":[\"Παμφύλη\",\"Παμφίλη\"],\"date\":\"16\\/02\"},{\"names\":[\"Παράσχος\"],\"date\":\"01\\/03\"},{\"names\":[\"Παρασκευή\",\"Εύη\",\"Παρασκευούλα\",\"Βούλα\",\"Παρασκευάς\",\"Πάρης\",\"Πάρις\"],\"date\":\"01\\/03\"},{\"names\":[\"Παρασκευή\",\"Εύη\",\"Εβίτα\",\"Βιβή\",\"Βίβιαν\",\"Βέτη\",\"Βέττη\",\"Παρασκευούλα\",\"Βούλα\",\"Παρασκευάς\",\"Πάρης\",\"Πάρις\"],\"date\":\"26\\/07\"},{\"names\":[\"Παρθένα\",\"Παρθενία\",\"Παρθενούλα\"],\"date\":\"08\\/01\"},{\"names\":[\"Παρθένιος\",\"Παρθένης\",\"Παρθενία\",\"Παρθενόπη\"],\"date\":\"07\\/02\"},{\"names\":[\"Περικλής\"],\"date\":\"10\\/04\"},{\"names\":[\"Περιστέρα\"],\"date\":\"06\\/01\"},{\"names\":[\"Παρμενίων\"],\"date\":\"10\\/04\"},{\"names\":[\"Περσεφόνη\"],\"date\":\"24\\/09\"},{\"names\":[\"Πέρσης\",\"Πέρση\"],\"date\":\"24\\/09\"},{\"names\":[\"Πατάπιος\"],\"date\":\"08\\/12\"},{\"names\":[\"Παύλος\",\"Παυλίνα\",\"Πώλ\",\"Παυλίκος\",\"Πουλίκος\"],\"date\":\"29\\/06\"},{\"names\":[\"Πατρίκιος\",\"Πάτρικ\",\"Πατρίκος\",\"Πατρίκης\",\"Πατρίτσιος\",\"Πατρίτσης\",\"Πατρικία\",\"Πατρίκα\",\"Πατριτσία\",\"Πατρίτσα\"],\"date\":\"19\\/05\"},{\"names\":[\"Πάτροκλος\",\"Πατρόκλειος\",\"Πατροκλέας\",\"Πατροκλής\",\"Πατρόκλεια\",\"Πατροκλά\",\"Πάτρα\",\"Πατρούλα\"],\"date\":\"21\\/01\"},{\"names\":[\"Πέτρος\",\"Πετρής\",\"Πετράς\",\"Πετράκης\",\"Πετρουλάς\",\"Πετρίνος\",\"Πετρία\",\"Πετρίνα\",\"Πέτρα\",\"Πετρούλα\"],\"date\":\"29\\/06\"},{\"names\":[\"Παΐσιος\",\"Παΐσης\",\"Παϊσία\"],\"date\":\"19\\/06\"},{\"names\":[\"Πηγάσιος\",\"Πήγασος\",\"Πηγασία\"],\"date\":\"02\\/11\"},{\"names\":[\"Πηλεύς\",\"Πηλέας\"],\"date\":\"17\\/09\"},{\"names\":[\"Πηνελόπη\",\"Μπηλιώ\",\"Μπιλιώ\"],\"date\":\"01\\/09\"},{\"names\":[\"Πιερής\",\"Πιέρος\",\"Πιέριος\",\"Πιερία\",\"Πιέρα\",\"Πιερίων\"],\"date\":\"27\\/06\"},{\"names\":[\"Πλάτων\",\"Πλάτωνας\",\"Πλατωνία\",\"Πλατώνα\"],\"date\":\"18\\/11\"},{\"names\":[\"Πίνδαρος\"],\"date\":\"10\\/04\"},{\"names\":[\"Πλούταρχος\"],\"date\":\"05\\/06\"},{\"names\":[\"Πίστις\",\"Πίστη\"],\"date\":\"17\\/09\"},{\"names\":[\"Πλωτίνος\",\"Πλωτός\",\"Πλωτή\",\"Πλωτίνα\",\"Πλωτίνη\"],\"date\":\"12\\/02\"},{\"names\":[\"Πολυχρόνιος\",\"Πολυχρόνης\",\"Χρόνης\",\"Πολυχρονία\",\"Πολυχρονούλα\"],\"date\":\"07\\/10\"},{\"names\":[\"Πολυχρόνιος\",\"Πολυχρόνης\",\"Χρόνης\",\"Πολυχρονία\",\"Πολυχρονούλα\"],\"date\":\"23\\/02\"},{\"names\":[\"Πολύβιος\"],\"date\":\"10\\/04\"},{\"names\":[\"Πολύδωρος\",\"Πόλης\",\"Πόλα\",\"Πόλη\",\"Πολύδωρας\",\"Πολυδώρης\",\"Πολυδώρη\",\"Πολυδώρα\"],\"date\":\"03\\/09\"},{\"names\":[\"Πολύκαρπος\",\"Πολυκάρπης\",\"Πολυκαρπία\",\"Πολυκάρπη\",\"Πολυκαρπίτσα\",\"Πολυκαρπούλα\"],\"date\":\"23\\/02\"},{\"names\":[\"Πολυξένη\",\"Ξένη\",\"Ξένια\"],\"date\":\"23\\/09\"},{\"names\":[\"Πολυνίκη\",\"Πολύνα\",\"Πόλυ\"],\"date\":\"01\\/09\"},{\"names\":[\"Πολύμνια\"],\"date\":\"01\\/09\"},{\"names\":[\"Πολυτίμη\",\"Τίμη\"],\"date\":\"01\\/09\"},{\"names\":[\"Πορφύριος\",\"Πορφυρός\",\"Πορφύρης\",\"Πορφυρή\",\"Πορφυρία\",\"Πορφύρα\",\"Πορφυρώ\",\"Πορφυρούλα\"],\"date\":\"26\\/02\"},{\"names\":[\"Πουλχερία\",\"Πουλχερίνα\",\"Πουλχερίτσα\",\"Πουλχέρω\",\"Πουλχέρη\"],\"date\":\"10\\/09\"},{\"names\":[\"Πούλιος\"],\"date\":\"26\\/03\"},{\"names\":[\"Πρέσβεια\"],\"date\":\"15\\/08\"},{\"names\":[\"Πρίσκιλλα\",\"Πρισίλλα\"],\"date\":\"13\\/02\"},{\"names\":[\"Πρόδρομος\",\"Προδρομάκης\",\"Μάκης\",\"Προδρομία\"],\"date\":\"07\\/01\"},{\"names\":[\"Προκόπιος\",\"Προκόπης\",\"Προκοπία\",\"Προκοπή\"],\"date\":\"08\\/07\"},{\"names\":[\"Προμηθεύς\",\"Προμηθέας\"],\"date\":\"10\\/04\"},{\"names\":[\"Πύρρος\",\"Πύρος\",\"Πύρρα\",\"Πύρα\"],\"date\":\"01\\/06\"},{\"names\":[\"Ράλλης\"],\"date\":\"01\\/09\"},{\"names\":[\"Ραλλία\",\"Ραλία\",\"Ραλλού\",\"Ραλού\"],\"date\":\"01\\/09\"},{\"names\":[],\"date\":\"14\\/04\"},{\"names\":[\"Ραφαήλ\",\"Ραφαήλος\",\"Ραφαέλος\",\"Ραφαέλα\",\"Ραφαήλα\"],\"date\":\"08\\/11\"},{\"names\":[\"Ραΐς\",\"Ραΐδα\"],\"date\":\"23\\/09\"},{\"names\":[\"Ρηγίνος\",\"Ρηγίνη\",\"Ρηγίνα\",\"Ρεγίνα\",\"Ρεγγίνα\",\"Ρήγας\",\"Ρήγισσα\",\"Ρηγούλα\",\"Ρηγίλη\",\"Ρήγω\",\"Ρήγος\"],\"date\":\"25\\/02\"},{\"names\":[\"Ροδάνθη\",\"Ροζάνθη\"],\"date\":\"09\\/06\"},{\"names\":[\"Ροδή\",\"Ροδία\"],\"date\":\"20\\/03\"},{\"names\":[\"Ρόζυ\",\"Ρόζα\",\"Ροζαλια\"],\"date\":\"04\\/09\"},{\"names\":[\"Ροδιανός\",\"Ροδινός\",\"Ροδίνης\",\"Ρόδης\",\"Ροδιανή\",\"Ροδιάνα\"],\"date\":\"20\\/03\"},{\"names\":[\"Ροδίων\",\"Ρόδιος\",\"Ροδής\",\"Ρόδος\",\"Ροδιά\",\"Ροδούλα\",\"Ροδίτα\",\"Ρόζα\",\"Ροζαλία\",\"Ροζίτα\",\"Ροζίνα\",\"Ροζάνα\"],\"date\":\"10\\/11\"},{\"names\":[\"Ροδόπη\",\"Ροδώπη\"],\"date\":\"03\\/05\"},{\"names\":[\"Ρωμανός\",\"Ρωμάνα\",\"Ρωμανή\"],\"date\":\"01\\/10\"},{\"names\":[\"Ρωμύλος\",\"Ρωμύλιος\",\"Ρωμύλης\",\"Ρωμύλα\",\"Ρωμυλία\",\"Ρωμύλη\",\"Ρωμυλαία\"],\"date\":\"18\\/09\"},{\"names\":[\"Σάββας\",\"Σάβας\",\"Σαββούλης\",\"Σαβούλη\",\"Σαββούλα\",\"Σαβούλα\"],\"date\":\"05\\/12\"},{\"names\":[\"Σαββάτιος\",\"Σάββατος\",\"Σαββάτης\",\"Σαββατία\",\"Σαββατίνα\",\"Σαββάτα\",\"Σαββάτη\",\"Σαββάτω\"],\"date\":\"19\\/09\"},{\"names\":[\"Σεβαστιανή\",\"Σεβαστίνα\",\"Σεβαστιάνα\",\"Σεβαστή\",\"Σέβη\",\"Σεβούλα\",\"Σεβαστούλα\"],\"date\":\"07\\/06\"},{\"names\":[\"Σεβαστιανή\",\"Σεβαστίνα\",\"Σεβαστιάνα\",\"Σεβαστή\",\"Σέβη\",\"Σεβούλα\",\"Σεβαστούλα\"],\"date\":\"24\\/10\"},{\"names\":[\"Σεβαστιανός\",\"Σεβαστίνος\",\"Σεβαστός\",\"Σέβος\",\"Σέβης\"],\"date\":\"26\\/02\"},{\"names\":[\"Σεβαστιανός\",\"Σεβαστίνος\",\"Σεβαστός\",\"Σέβος\",\"Σέβης\"],\"date\":\"18\\/12\"},{\"names\":[\"Σεβηριανός\",\"Σεβηριανή\"],\"date\":\"09\\/03\"},{\"names\":[\"Σαβίνα\",\"Ζαμπίνα\",\"Ζαμπία\"],\"date\":\"11\\/03\"},{\"names\":[\"Σαπφώ\"],\"date\":\"01\\/09\"},{\"names\":[\"Σέλευκος\",\"Σελεύκα\",\"Σελεύκη\",\"Σελεύκεια\"],\"date\":\"16\\/02\"},{\"names\":[\"Σεληνιάς\",\"Σεληνιάδα\",\"Σεληνία\",\"Σελήνη\",\"Σελήνα\",\"Σελήνος\",\"Σελήνιος\"],\"date\":\"05\\/06\"},{\"names\":[\"Σαλώμη\",\"Σαλώμα\"],\"date\":\"03\\/08\"},{\"names\":[\"Σαμουήλ\",\"Σαμουήλος\",\"Σαμουήλης\",\"Σαμουέλος\",\"Σαμουηλία\",\"Σαμουήλα\",\"Σαμουέλα\"],\"date\":\"20\\/08\"},{\"names\":[\"Σέντ\"],\"date\":\"07\\/01\"},{\"names\":[\"Σάρα\",\"Σάρρα\"],\"date\":\"13\\/07\"},{\"names\":[],\"date\":\"13\\/12\"},{\"names\":[\"Σέργιος\",\"Σεργία\",\"Σεργιανή\",\"Σεργιούλα\"],\"date\":\"07\\/10\"},{\"names\":[\"Σαράντης\",\"Σαράντος\",\"Σαραντούλα\"],\"date\":\"16\\/08\"},{\"names\":[\"Σαράντης\",\"Σαράντος\",\"Σαραντούλα\"],\"date\":\"09\\/03\"},{\"names\":[\"Σεραφείμ\",\"Σεραφειμία\",\"Σεραφείμα\",\"Σεραφίνα\",\"Σεραφειμή\",\"Σεραφειμούλα\"],\"date\":\"06\\/05\"},{\"names\":[\"Σεραφείμ\",\"Σεραφειμία\",\"Σεραφείμα\",\"Σεραφειμή\",\"Σεραφειμούλα\"],\"date\":\"16\\/08\"},{\"names\":[\"Σεραφείμ\",\"Σεραφειμία\",\"Σεραφείμα\",\"Σεραφειμή\",\"Σεραφειμούλα\",\"Σεραφειμίτσα\"],\"date\":\"04\\/12\"},{\"names\":[\"Σεραφείμ\",\"Σεραφειμία\",\"Σεραφείμα\",\"Σεραφειμή\",\"Σεραφειμούλα\",\"Σεραφειμίτσα\"],\"date\":\"02\\/01\"},{\"names\":[\"Σεσίλια\",\"Κεκίλια\",\"Κικίλια\"],\"date\":\"22\\/11\"},{\"names\":[\"Σάτυρος\",\"Σάτος\"],\"date\":\"06\\/07\"},{\"names\":[\"Σπυρίδων\",\"Σπυρίδωνας\",\"Σπύρος\",\"Σπυρέτος\",\"Σπυράκης\",\"Σπυράκος\",\"Σπυρούλα\",\"Σπυρέτα\",\"Σπυρίνα\",\"Σπυριδούλα\",\"Σπυρίδινα\"],\"date\":\"12\\/12\"},{\"names\":[\"Σκιαδενή\"],\"date\":\"08\\/09\"},{\"names\":[\"Σιλβανός\",\"Σιλβάνα\",\"Σιλβανή\",\"Σίλβια\",\"Σίλβα\"],\"date\":\"05\\/11\"},{\"names\":[\"Σίλβεστρος\",\"Σιλβέστρης\",\"Σίλβης\",\"Σιλβέστρα\",\"Σίλβα\"],\"date\":\"02\\/01\"},{\"names\":[\"Σιλουανός\",\"Σιλουανή\",\"Σιλουάνα\",\"Σιλουάνια\"],\"date\":\"30\\/07\"},{\"names\":[\"Σίμωνας\",\"Σίμων\",\"Σίμος\",\"Σιμώνα\",\"Σιμόνα\",\"Σιμωνία\",\"Σιμώνη\",\"Σιμωνίτσα\"],\"date\":\"10\\/05\"},{\"names\":[\"Σμαραγδένια\",\"Σμαραγδία\",\"Σμαραγδή\",\"Σμαράγδα\",\"Σμαράγδω\",\"Σμαρούλα\",\"Σμαρώ\",\"Σμαραγδούλα\",\"Σμάρα\"],\"date\":\"09\\/03\"},{\"names\":[\"Σμάραγδος\",\"Σμαράγδης\",\"Σμαραγδένιος\",\"Σμάρης\"],\"date\":\"09\\/03\"},{\"names\":[\"Σολομονή\"],\"date\":\"01\\/08\"},{\"names\":[\"Σολομών\",\"Σολομώντας\",\"Σόλων\",\"Σόλωνας\",\"Σολομωντία\"],\"date\":\"02\\/12\"},{\"names\":[\"Σόλων\",\"Σόλωνας\",\"Σολόχων\"],\"date\":\"17\\/05\"},{\"names\":[\"Σόνια\"],\"date\":\"17\\/09\"},{\"names\":[\"Σοφία\",\"Σοφιανός\",\"Σοφιανή\",\"Σοφούλα\",\"Σοφούλης\",\"Σόφη\",\"Σοφίτσα\",\"Σοφίνα\",\"Φιφή\",\"Σοφούλη\",\"Φούλη\"],\"date\":\"17\\/09\"},{\"names\":[\"Σουλτάνα\",\"Σουλτάνης\",\"Σούζυ\",\"Σούζη\",\"Σουλτανίτσα\",\"Τάνια\"],\"date\":\"21\\/11\"},{\"names\":[\"Σοφοκλής\"],\"date\":\"10\\/04\"},{\"names\":[\"Συγκλητική\"],\"date\":\"05\\/01\"},{\"names\":[\"Σταμάτιος\",\"Σταμάτης\",\"Στάμος\",\"Σταμούλης\",\"Σταμέλος\",\"Σταμέλης\",\"Σταμελάς\"],\"date\":\"03\\/02\"},{\"names\":[\"Σταμάτιος\",\"Σταμάτης\",\"Στάμος\",\"Σταμούλης\",\"Σταμέλος\",\"Σταμέλης\",\"Σταμελάς\"],\"date\":\"16\\/08\"},{\"names\":[\"Σταμάτιος\",\"Σταμάτης\",\"Στάμος\",\"Σταμούλης\",\"Σταμέλος\",\"Σταμέλης\",\"Σταμελάς\"],\"date\":\"08\\/11\"},{\"names\":[\"Σταματία\",\"Σταματίνα\",\"Σταμάτα\",\"Μάτα\",\"Ματούλα\",\"Σταμέλα\",\"Σταμούλα\",\"Ματίνα\",\"Σταματή\",\"Μάτω\",\"Σταματέλλα\"],\"date\":\"03\\/02\"},{\"names\":[\"Σταματία\",\"Σταματίνα\",\"Σταμάτα\",\"Μάτα\",\"Ματούλα\",\"Σταμέλα\",\"Σταμούλα\",\"Ματίνα\",\"Σταματή\",\"Μάτω\",\"Σταματέλλα\"],\"date\":\"16\\/08\"},{\"names\":[\"Σταματία\",\"Σταματίνα\",\"Σταμάτα\",\"Μάτα\",\"Ματούλα\",\"Σταμέλα\",\"Σταμούλα\",\"Ματίνα\",\"Σταματή\",\"Μάτω\",\"Σταματέλλα\"],\"date\":\"08\\/11\"},{\"names\":[\"Στέργιος\",\"Στέργης\",\"Στέργος\",\"Στεργία\",\"Στεργιανή\",\"Στεργιούλα\",\"Στεργιούδα\"],\"date\":\"26\\/11\"},{\"names\":[\"Στέφανος\",\"Στέφος\",\"Στέφας\",\"Στεφανής\",\"Στεφανία\",\"Στεφάνα\",\"Στεφανιώ\",\"Στεφανίτσα\",\"Στεφανή\",\"Στέφα\",\"Στέφη\"],\"date\":\"27\\/12\"},{\"names\":[\"Σταύρος\",\"Σταύρακας\",\"Σταυράκιος\",\"Σταυρής\",\"Σταυριανός\",\"Σταυράκης\",\"Σταυρούλα\",\"Σταυριανή\",\"Σταυρίνα\",\"Σταυρία\"],\"date\":\"14\\/09\"},{\"names\":[\"Συλβέστρος\",\"Σιλβέστρος\"],\"date\":\"02\\/01\"},{\"names\":[\"Σύλβια\"],\"date\":\"15\\/12\"},{\"names\":[\"Συλάς\",\"Σύλος\",\"Σύλα\",\"Σύλια\",\"Σύλη\"],\"date\":\"26\\/03\"},{\"names\":[\"Συμέλα\",\"Σιμέλα\",\"Σουμελά\"],\"date\":\"15\\/08\"},{\"names\":[\"Συνέσιος\",\"Συνέσης\",\"Συνεσία\"],\"date\":\"26\\/05\"},{\"names\":[\"Συμεών\",\"Συμεώνης\",\"Συμεωνή\",\"Συμεωνία\",\"Συμεώνα\",\"Σύμος\",\"Σύμη\"],\"date\":\"03\\/02\"},{\"names\":[\"Συμεών\",\"Συμεώνης\",\"Συμεωνή\",\"Συμεωνία\",\"Συμεώνα\",\"Συμεωνίτσα\",\"Σύμος\",\"Σύμη\"],\"date\":\"01\\/09\"},{\"names\":[\"Στρατηγός\",\"Στρατηγούλα\"],\"date\":\"08\\/11\"},{\"names\":[\"Στρατονίκη\",\"Στρατή\",\"Νίκη\"],\"date\":\"31\\/10\"},{\"names\":[\"Στρατόνικος\",\"Στρατονίκης\",\"Στρατονίκιος\",\"Στράτος\",\"Στράτης\"],\"date\":\"30\\/09\"},{\"names\":[\"Στράτων\",\"Στράτος\",\"Στράτης\",\"Στράτα\",\"Στρατία\",\"Στρατίνα\",\"Στρατούλα\"],\"date\":\"17\\/08\"},{\"names\":[\"Στυλιανός\",\"Στυλιανή\",\"Στέλιος\",\"Στελής\",\"Τέλης\",\"Τέλιος\",\"Στελίτσα\",\"Στέλα\",\"Στέλλα\",\"Στέλια\",\"Τέλα\",\"Τελία\",\"Τελίτσα\"],\"date\":\"26\\/11\"},{\"names\":[\"Σώζων\",\"Σώζος\",\"Σωζούσα\",\"Σώζης\",\"Σώζα\",\"Σώζη\"],\"date\":\"07\\/09\"},{\"names\":[\"Σωκράτης\",\"Σωκρατίνα\",\"Σωκρατία\"],\"date\":\"10\\/04\"},{\"names\":[\"Σωκράτης\",\"Σωκρατίνα\",\"Σωκρατία\"],\"date\":\"21\\/10\"},{\"names\":[\"Σωτήριος\",\"Σωτήρης\",\"Σώτος\",\"Σωτηράκης\",\"Σωτηρία\",\"Σωτήρω\"],\"date\":\"06\\/08\"},{\"names\":[\"Σωσίπατρος\",\"Σωπάτρα\",\"Σώπατρος\",\"Σωπατρία\",\"Πάτρα\",\"Πατρούλα\",\"Πατρίτσα\"],\"date\":\"29\\/04\"},{\"names\":[\"Σωσίπατρος\",\"Σωπάτρα\",\"Σώπατρος\",\"Σωπατρία\",\"Πάτρα\",\"Πατρούλα\",\"Πατρίτσα\"],\"date\":\"10\\/11\"},{\"names\":[\"Σωφρόνιος\",\"Σωφρόνης\",\"Σωφρονία\",\"Σωφρόνη\"],\"date\":\"11\\/03\"},{\"names\":[\"Σωσσάνα\",\"Σωσάνα\",\"Σωσάννα\"],\"date\":\"15\\/12\"},{\"names\":[],\"date\":\"29\\/12\"},{\"names\":[\"Τάμαρα\"],\"date\":\"01\\/05\"},{\"names\":[\"Ταξιάρχης\"],\"date\":\"08\\/11\"},{\"names\":[\"Ταράσιος\",\"Ταράσης\"],\"date\":\"25\\/02\"},{\"names\":[\"Τερψιχόρη\"],\"date\":\"01\\/09\"},{\"names\":[\"Τέρτιος\",\"Τέρτος\",\"Τέρτης\",\"Τέρτια\",\"Τέρτα\",\"Τέρτη\",\"Τερτίνος\",\"Τερτίνα\"],\"date\":\"30\\/10\"},{\"names\":[\"Ταρσή\",\"Ταρσώ\",\"Ταρασία\",\"Ταρσίτσα\"],\"date\":\"25\\/02\"},{\"names\":[\"Τατιανή\",\"Τατιάνα\",\"Τάτια\",\"Τίτη\",\"Τάνια\"],\"date\":\"12\\/01\"},{\"names\":[\"Τηλέμαχος\"],\"date\":\"01\\/01\"},{\"names\":[\"Τίχων\",\"Τύχων\"],\"date\":\"16\\/06\"},{\"names\":[\"Τιμόθεος\",\"Τίμος\",\"Τιμάς\",\"Τίμης\",\"Τιμοθέα\",\"Τιμοθέη\",\"Τίμα\",\"Τίμη\",\"Θέος\",\"Θέα\",\"Θέη\"],\"date\":\"22\\/01\"},{\"names\":[\"Τιμόθεος\",\"Τίμος\",\"Τιμάς\",\"Τίμης\",\"Τιμοθέα\",\"Τιμοθέη\",\"Τίμα\",\"Τίμη\",\"Θέος\",\"Θέα\",\"Θέη\"],\"date\":\"10\\/04\"},{\"names\":[\"Τίμων\",\"Τιμόνα\",\"Τιμόνη\",\"Τίμος\",\"Τίμα\"],\"date\":\"28\\/07\"},{\"names\":[\"Τίτος\",\"Τίτης\",\"Τίτα\",\"Τίτη\"],\"date\":\"02\\/04\"},{\"names\":[\"Τίτος\",\"Τίτης\",\"Τίτα\",\"Τίτη\"],\"date\":\"25\\/08\"},{\"names\":[\"Τριανταφυλλιά\",\"Φύλλη\",\"Φύλλια\",\"Φυλλιώ\",\"Φυλλίτσα\",\"Τριανταφυλλένια\",\"Τριανταφυλλίνη\",\"Ρόζα\"],\"date\":\"08\\/08\"},{\"names\":[\"Τριαντάφυλλος\",\"Τριανταφύλλης\",\"Φύλλης\",\"Φύλλιος\",\"Τριανταφυλλένιος\",\"Τριανταφυλλίνος\"],\"date\":\"08\\/08\"},{\"names\":[\"Τριφύλλιος\",\"Τριφύλιος\"],\"date\":\"13\\/06\"},{\"names\":[],\"date\":\"30\\/01\"},{\"names\":[\"Τρύφωνας\",\"Τρύφων\",\"Τρυφωνία\"],\"date\":\"01\\/02\"},{\"names\":[\"Τρωάδιος\",\"Τρωάδης\",\"Τρωάδος\",\"Τρωάς\",\"Τρωάδα\",\"Τρωαδία\",\"Τρωάδη\",\"Τρωαδίτσα\"],\"date\":\"02\\/03\"},{\"names\":[\"Τσαμπίκα\",\"Μίκα\",\"Τσαμπίκος\"],\"date\":\"08\\/09\"},{\"names\":[\"Υάκινθος\",\"Υακίνθη\",\"Υάνθη\",\"Ιάνθη\"],\"date\":\"03\\/07\"},{\"names\":[\"Υπαπαντή\"],\"date\":\"02\\/02\"},{\"names\":[\"Υπάτιος\",\"Υπατος\",\"Υπάτης\"],\"date\":\"31\\/03\"},{\"names\":[\"Υπατία\",\"Υπατή\",\"Υπατούλα\",\"Πατούλα\"],\"date\":\"03\\/06\"},{\"names\":[\"Υπομονή\"],\"date\":\"29\\/05\"},{\"names\":[\"Φαβιανός\"],\"date\":\"20\\/01\"},{\"names\":[\"Φαεινή\",\"Φαεινός\"],\"date\":\"18\\/05\"},{\"names\":[\"Φεβρωνία\",\"Φευρωνία\",\"Φεύρω\",\"Φέβρω\",\"Φέβρα\",\"Φεύρα\",\"Φεβρούλα\",\"Φευρούλα\",\"Φευρωνίτσα\",\"Φεβρωνίτσα\"],\"date\":\"25\\/06\"},{\"names\":[\"Φαίδρα\",\"Φαιδρούλα\",\"Φαιδρίνα\"],\"date\":\"29\\/11\"},{\"names\":[\"Φαίδρος\",\"Φαιδρής\",\"Φαιδρινός\"],\"date\":\"29\\/11\"},{\"names\":[\"Φαίστος\",\"Φαιστή\",\"Φαιστίνα\"],\"date\":\"21\\/04\"},{\"names\":[\"Φανή\",\"Φένια\",\"Φάνια\",\"Φανούλα\"],\"date\":\"06\\/01\"},{\"names\":[\"Φανή\",\"Φένια\",\"Φάνια\",\"Φανούλα\"],\"date\":\"12\\/03\"},{\"names\":[\"Φανούριος\",\"Φανούρης\",\"Φάνης\",\"Φανή\",\"Φανουρία\",\"Νούρης\"],\"date\":\"27\\/08\"},{\"names\":[\"Φιλάρετος\",\"Φιλαρέτιος\",\"Φιλαρέτης\",\"Φιλαρέτη\"],\"date\":\"01\\/12\"},{\"names\":[\"Φιλέταιρος\",\"Φιλέταιριος\",\"Φιλεταίρης\",\"Φιλεταιρία\",\"Φιλεταίρα\",\"Φιλεταίρη\"],\"date\":\"30\\/12\"},{\"names\":[\"Φίληξ\",\"Φήλιξ\",\"Φίληκας\",\"Φίληξα\",\"Φιλήκη\"],\"date\":\"17\\/06\"},{\"names\":[\"Φίληξ\",\"Φήλιξ\",\"Φίληκας\",\"Φίληξα\",\"Φιλήκη\"],\"date\":\"19\\/10\"},{\"names\":[\"Φιλήμων\",\"Φιλήμονας\",\"Φιλημονή\",\"Φιλημόνα\",\"Φλημόνα\"],\"date\":\"22\\/11\"},{\"names\":[\"Φίλητος\",\"Φιλήτα\",\"Φιλήτη\"],\"date\":\"27\\/03\"},{\"names\":[\"Φιλίππα\",\"Φιλιππία\",\"Φιλιώ\"],\"date\":\"14\\/11\"},{\"names\":[\"Φίλιππος\",\"Φιλιππής\",\"Φίλιππας\",\"Φιλιππάκης\"],\"date\":\"14\\/11\"},{\"names\":[\"Φιλικητάτη\",\"Φιλικήτη\",\"Φιλικήτα\"],\"date\":\"01\\/02\"},{\"names\":[\"Φιλοποίμην\",\"Φίλης\"],\"date\":\"10\\/04\"},{\"names\":[\"Φιλοθέη\",\"Φιλοθέα\",\"Φιλοθεούλα\",\"Φιλόθεος\"],\"date\":\"19\\/02\"},{\"names\":[\"Φιλοκτήμων\",\"Φιλοκτήμονας\"],\"date\":\"09\\/03\"},{\"names\":[\"Φιλουμένη\",\"Φιλομένη\"],\"date\":\"29\\/11\"},{\"names\":[\"Φιλούμενος\",\"Φιλόμενος\",\"Φιλουμένη\",\"Φιλομένη\",\"Φίλος\",\"Φίλη\",\"Φιλομίνα\",\"Φιλομίλα\",\"Φιλομίλη\"],\"date\":\"29\\/11\"},{\"names\":[\"Φιλόσοφος\",\"Φιλοσοφία\",\"Φιλοσοφή\",\"Σοφός\",\"Σοφία\",\"Σόφη\"],\"date\":\"01\\/05\"},{\"names\":[\"Φίλωνας\",\"Φίλων\"],\"date\":\"24\\/01\"},{\"names\":[\"Φλωρεντία\",\"Φλωρέντα\",\"Φλωρένα\",\"Φλώρινα\",\"Φλωρένσα\",\"Φλωρέντζα\",\"Ντία\"],\"date\":\"13\\/10\"},{\"names\":[\"Φλωρέντιος\",\"Φλωρέντης\",\"Φλωρέντος\",\"Φλορέντσος\",\"Φλορέντζος\"],\"date\":\"13\\/10\"},{\"names\":[\"Φλώρος\",\"Φλώρης\",\"Φλώρα\",\"Φλωρή\"],\"date\":\"18\\/08\"},{\"names\":[\"Φλώρος\",\"Φλώρης\",\"Φλώρα\",\"Φλωρή\",\"Φλωρίτσα\"],\"date\":\"18\\/12\"},{\"names\":[\"Φοίβος\",\"Φοίβη\"],\"date\":\"03\\/09\"},{\"names\":[\"Φρειδερίκη\"],\"date\":\"31\\/07\"},{\"names\":[\"Φρειδερίκος\"],\"date\":\"31\\/07\"},{\"names\":[\"Φύλακας\"],\"date\":\"30\\/08\"},{\"names\":[\"Φωκάς\",\"Φώκιος\",\"Φώκης\",\"Φωκία\",\"Φωκίνα\"],\"date\":\"22\\/09\"},{\"names\":[\"Φωκίων\",\"Φώκος\"],\"date\":\"10\\/04\"},{\"names\":[\"Φωτεινή\",\"Φώτω\",\"Φώφη\",\"Φωτούλα\",\"Φαίη\",\"Φωφώ\"],\"date\":\"06\\/01\"},{\"names\":[\"Φωτεινή\",\"Φώτω\",\"Φώφη\",\"Φωτούλα\",\"Φαίη\",\"Φωφώ\"],\"date\":\"24\\/05\"},{\"names\":[\"Φωτεινή\",\"Φώτω\",\"Φώφη\",\"Φωτούλα\",\"Φαίη\",\"Φωφώ\"],\"date\":\"26\\/02\"},{\"names\":[\"Φώτιος\",\"Φώτης\",\"Φωτεινός\",\"Φώτις\"],\"date\":\"06\\/01\"},{\"names\":[\"Φώτιος\",\"Φώτης\",\"Φωτεινός\",\"Φώτις\"],\"date\":\"06\\/02\"},{\"names\":[\"Φώτιος\",\"Φώτης\",\"Φωτεινός\",\"Φώτις\"],\"date\":\"12\\/08\"},{\"names\":[\"Φωτίκα\",\"Φωτίκω\",\"Φώτα\",\"Φωτή\"],\"date\":\"06\\/01\"},{\"names\":[\"Χάιδω\",\"Χαιδευτός\"],\"date\":\"01\\/09\"},{\"names\":[\"Χαραλαμπία\",\"Χαρά\",\"Λαμπία\",\"Λαμπή\",\"Λάμπω\",\"Χαραλαμπή\",\"Μπαμπίνα\",\"Μπηλιώ\",\"Μπιλιώ\",\"Μπία\",\"Χάμπη\"],\"date\":\"10\\/02\"},{\"names\":[\"Χαράλαμπος\",\"Λάμπος\",\"Χαραλάμπης\",\"Χάρης\",\"Λάμπης\",\"Λαμπίας\",\"Μπάμπης\",\"Μπάμπος\",\"Χάμπος\"],\"date\":\"10\\/02\"},{\"names\":[\"Χαρίλαος\",\"Χάρης\"],\"date\":\"10\\/02\"},{\"names\":[\"Χαρίκλεια\",\"Χαρούλα\"],\"date\":\"01\\/09\"},{\"names\":[\"Χαρίκλεια\",\"Χαρούλα\"],\"date\":\"10\\/02\"},{\"names\":[\"Χάρις\"],\"date\":\"28\\/01\"},{\"names\":[\"Χαριτίνη\",\"Χαριτίνα\",\"Χαρίτη\",\"Τίνα\",\"Χαρά\"],\"date\":\"05\\/10\"},{\"names\":[\"Χαρίσιος\",\"Χάρισος\",\"Χαρίσης\",\"Χαρίσα\"],\"date\":\"01\\/03\"},{\"names\":[\"Χαρίτων\",\"Χαρίτωνας\",\"Χαρίτος\"],\"date\":\"28\\/09\"},{\"names\":[\"Χίλντα\"],\"date\":\"17\\/11\"},{\"names\":[\"Χιονία\",\"Χιονούλα\",\"Χιονίτσα\",\"Χιονάτη\"],\"date\":\"16\\/04\"},{\"names\":[\"Χρήστος\",\"Χρίστος\",\"Κρίστης\"],\"date\":\"25\\/12\"},{\"names\":[\"Χριστιανός\",\"Χριστιανή\"],\"date\":\"24\\/05\"},{\"names\":[\"Χριστίνα\",\"Χριστιάνα\",\"Κριστιάνα\",\"Χρίστα\",\"Κρίστα\",\"Χρίστη\",\"Κρίστη\"],\"date\":\"24\\/07\"},{\"names\":[\"Χριστίνα\",\"Χριστιάνα\",\"Κριστιάνα\",\"Χρίστα\",\"Κρίστα\",\"Χρίστη\",\"Κρίστη\",\"Χριστόλη\"],\"date\":\"25\\/12\"},{\"names\":[\"Χριστόδουλος\"],\"date\":\"16\\/03\"},{\"names\":[\"Χριστόδουλος\"],\"date\":\"21\\/10\"},{\"names\":[\"Χριστόφορος\",\"Χριστοφόρης\",\"Χριστοφόρα\",\"Φόρης\",\"Φόρα\",\"Χριστόφης\",\"Χριστοφία\",\"Χριστοφίνα\",\"Χριστοφίτσα\"],\"date\":\"09\\/05\"},{\"names\":[\"Χρυσή\",\"Χρύσα\",\"Χρυσαλία\"],\"date\":\"25\\/12\"},{\"names\":[\"Χρυσάνθη\",\"Χρυσανθίς\"],\"date\":\"19\\/03\"},{\"names\":[\"Χρυσάνθη\"],\"date\":\"25\\/10\"},{\"names\":[\"Χρύσανθος\"],\"date\":\"19\\/03\"},{\"names\":[\"Χρυσαυγή\"],\"date\":\"25\\/12\"},{\"names\":[\"Χρυσάφης\",\"Χρυσάφιος\",\"Χρυσαφένια\"],\"date\":\"25\\/10\"},{\"names\":[\"Χρυσή\"],\"date\":\"30\\/01\"},{\"names\":[\"Χρυσή\"],\"date\":\"13\\/10\"},{\"names\":[\"Χρυσοβαλάντου\",\"Χρυσοβαλαντία\",\"Βαλάντα\",\"Βαλάντης\",\"Χρυσοβαλάντης\",\"Χρυσοβαλάντος\",\"Βαλάντος\"],\"date\":\"28\\/07\"},{\"names\":[\"Χρυσούλα\",\"Σήλια\"],\"date\":\"25\\/12\"},{\"names\":[\"Χρυσόστομος\",\"Χρυσοστόμης\",\"Χρυσοστόμη\",\"Χρυσοστομία\",\"Χρυσοστομίτσα\"],\"date\":\"13\\/11\"},{\"names\":[\"Χρυστάλλα\",\"Χρυσταλλία\"],\"date\":\"25\\/12\"},{\"names\":[],\"date\":\"14\\/02\"},{\"names\":[],\"date\":\"30\\/05\"},{\"names\":[\"Ωκεανία\",\"Ωκεανή\",\"Ωκεανίς\"],\"date\":\"04\\/09\"},{\"names\":[\"Ωκεανός\",\"Ωκεάνιος\",\"Ωκεάνης\"],\"date\":\"04\\/09\"},{\"names\":[\"Ωραιοζήλη\",\"Ωραιοζηλία\",\"Ζήλια\",\"Ζήλη\",\"Ζέλια\"],\"date\":\"26\\/07\"},{\"names\":[\"Ωρίων\",\"Ωρίωνας\",\"Ωριώνης\",\"Ωριώνη\"],\"date\":\"10\\/11\"}],\"special\":[{\"toEaster\":-70,\"main\":\"Τελώνου και Φαρισαίου - Αρχή Τριωδίου\",\"variations\":[]},{\"toEaster\":-63,\"main\":\"Του Ασώτου\",\"variations\":[]},{\"toEaster\":-59,\"main\":\"Τσικνοπέμπτη\",\"variations\":[]},{\"toEaster\":-57,\"main\":\"Ψυχοσάββατο Α'\",\"variations\":[]},{\"toEaster\":-56,\"main\":\"Της Απόκρεω\",\"variations\":[]},{\"toEaster\":-49,\"main\":\"Τυροφάγου\",\"variations\":[]},{\"toEaster\":-48,\"main\":\"Καθαρά Δευτέρα\",\"variations\":[]},{\"toEaster\":-43,\"main\":\"Αγίου Θεοδώρου\",\"variations\":[\"Θεόδωρος\",\"Θεοδώρα\",\"Δώρα\",\"Ντόρα\",\"Θόδωρος\",\"Θοδώρα\",\"Θοδωρής\",\"Θοδωράκης\",\"Θώδης\",\"Θώδος\",\"Δώρη\"]},{\"toEaster\":-42,\"main\":\"Κυριακή της Ορθοδοξίας\",\"variations\":[\"Ορθοδοξία\",\"Λωξάνδρα\",\"Λωξάντρα\",\"Ρωξάνη\",\"Αξί\"]},{\"toEaster\":-35,\"main\":\"Γρηγορίου του Παλαμά\",\"variations\":[\"Γρηγόριος\",\"Γρηγόρης\",\"Γρηγορία\",\"Γόλη\"]},{\"toEaster\":-8,\"main\":\"Σάββατο του Λαζάρου\",\"variations\":[\"Λάζαρος\",\"Λάζο\"]},{\"toEaster\":-7,\"main\":\"Κυριακή των Βαίων\",\"variations\":[\"Βάϊος\",\"Βάϊα\",\"Βάγια\",\"Βαία\",\"Δάφν\"]},{\"toEaster\":-6,\"main\":\"Μεγάλη Δευτέρα\",\"variations\":[\"Πάγκαλο\"]},{\"toEaster\":-5,\"main\":\"Μεγάλη Τρίτη\",\"variations\":[]},{\"toEaster\":-4,\"main\":\"Μεγάλη Τετάρτη\",\"variations\":[]},{\"toEaster\":-3,\"main\":\"Μεγάλη Πέμπτη\",\"variations\":[\"Αλήθει\"]},{\"toEaster\":-2,\"main\":\"Μεγάλη Παρασκευή\",\"variations\":[]},{\"toEaster\":-1,\"main\":\"Μεγάλο Σάββατο\",\"variations\":[]},{\"toEaster\":0,\"main\":\"ΤΟ ΑΓΙΟ ΠΑΣΧΑ\",\"variations\":[\"Αναστάσιος\",\"Αναστασία\",\"Τάσος\",\"Αναστάσης\",\"Ανέστης\",\"Λάμπρος\",\"Λαμπρινή\",\"Λαμπρίνα\",\"Πασχάλης\",\"Πασχαλίνα\",\"Λίνα\",\"Στασινό\"]},{\"toEaster\":1,\"main\":\"2α Διακαινησίμου - Δευτέρα\",\"variations\":[]},{\"toEaster\":2,\"main\":\"3η Διακαινησίμου - Τρίτη\",\"variations\":[\"Λαμπροτρίτ\"]},{\"toEaster\":3,\"main\":\"4η Διακαινησίμου - Τετάρτη\",\"variations\":[\"Θεοχάρη\"]},{\"toEaster\":4,\"main\":\"5η Διακαινησίμου - Πέμπτη\",\"variations\":[]},{\"toEaster\":5,\"main\":\"6η Διακαινησίμου - Παρασκευή\",\"variations\":[]},{\"toEaster\":5,\"main\":\"Ζωοδόχου Πηγής\",\"variations\":[\"Πηγή\",\"Κρήνη\",\"Κρηνιώ\",\"Ζήσης\",\"Ζησούλα\",\"Ζήσιμος\",\"Ζωή\",\"Ζώης\",\"Ζωϊτσα\",\"Ζωζώ\",\"Παναγιώτης\",\"Πάνος\",\"Πανούσος\",\"Παναγής\",\"Πανάγος\",\"Γιώτης\",\"Πολυζώης\",\"Παναγιώτα\",\"Γιώτα\",\"Παναγιούλα\",\"Γιούλα\",\"Παναγούλα\"]},{\"toEaster\":6,\"main\":\"7η Διακαινησίμου - Σαββάτο\",\"variations\":[]},{\"toEaster\":7,\"main\":\"Του Θωμά\",\"variations\":[\"Θωμάς\",\"Θωμαή\",\"Τόμα\"]},{\"toEaster\":14,\"main\":\"Των Μυροφόρων\",\"variations\":[\"Μυροφόρ\"]},{\"toEaster\":21,\"main\":\"Του Παραλύτου\",\"variations\":[\"Βηθεσδ\"]},{\"toEaster\":39,\"main\":\"Ανάληψη του Χριστού\",\"variations\":[\"Νεφέλ\"]},{\"toEaster\":48,\"main\":\"Ψυχοσάββατο Β'\",\"variations\":[]},{\"toEaster\":49,\"main\":\"Πεντηκοστή\",\"variations\":[]},{\"toEaster\":50,\"main\":\"Αγ. Πνεύματος\",\"variations\":[\"Τριάδα\",\"Τριάς\",\"Κόρη\",\"Κορίνα\",\"Κορίνο\"]},{\"toEaster\":56,\"main\":\"Αγίων Πάντων\",\"variations\":[\"Αβδηρος\",\"Αγαπήνωρ\",\"Αγαμέμνων\",\"Αγαμέμνονας\",\"Αγαύη\",\"Αγεύς\",\"Αγήνωρ\",\"Αγησίλαος\",\"Αέθλιος\",\"Αελλώ\",\"Αγις\",\"Αδμητος\",\"Αγνοδίκη\",\"Αγοράκριτος\",\"Αγοραστή\",\"Αγορίτσα\",\"Αγορία\",\"Αγνω\",\"Αγνων\",\"Αδράστεια\",\"Αερόπη\",\"Αέροπος\",\"Αδωνις\",\"Απολλόδωρος\",\"Ακάδημος\",\"Αλβέρτος\",\"Αλμπερτ\",\"Αιγεύς\",\"Αίγλη\",\"Αίγινα\",\"Αιακός\",\"Αίγισθος\",\"Αλεμίνα\",\"Αλεμινιώ\",\"Αιδονή\",\"Αίας\",\"Αίγυπτος\",\"Αθηναίς\",\"Αθηνίων\",\"Αλθαία\",\"Αλκείδης\",\"Αλκαίος\",\"Αλκαμένης\",\"Αλκέτας\",\"Αιθήρ\",\"Αλκηστη\",\"Αιλιανός\",\"Αλκίνοος\",\"Αλκινόη\",\"Αλκμένης\",\"Αλκμήνη\",\"Αλκμηνιώ\",\"Αίθρα\",\"Αλκυόνη\",\"Αινείας\",\"Αινίας\",\"Αίολος\",\"Αίμων\",\"Αισχύλος\",\"Ακταίη\",\"Ακταίος\",\"Αίσωπος\",\"Ακτωρ\",\"Αιώρα\",\"Ανακρέων\",\"Αναξαγόρας\",\"Αναξίμανδρος\",\"Ανδροκλής\",\"Ανδρονίδης\",\"Αμαρυλλίς\",\"Ανθέμιος\",\"Αμυγδαλιά\",\"Αντεια\",\"Ανταίος\",\"Αντίπατρος\",\"Αμφιθόη\",\"Αμφικτύων\",\"Αντιμάχη\",\"Αντίμαχος\",\"Αντιόπη\",\"Αντίνοος\",\"Αμφιτρίτη\",\"Αμφιτρύων\",\"Αντιφών\",\"Αμύντας\",\"Αρχίλοχος\",\"Αργεντίνη\",\"Αργος\",\"Αρπίνα\",\"Αριέλ\",\"Αριέλλα\",\"Αρκάς\",\"Αρκτούρος\",\"Αρίστιππος\",\"Αριστογείτων\",\"Αριστόδικος\",\"Αριστόμαχος\",\"Αριστομένης\",\"Αριστόνικος\",\"Αριστονίκη\",\"Αριστοφάνης\",\"Αριστούλα\",\"Αρίων\",\"Αρμονία\",\"Αριέτα\",\"Αρριέτα\",\"Αρριέττα\",\"Αριέττα\",\"Αφεντία\",\"Αφέντρα\",\"Αφεντουλιώ\",\"Αφέντρω\",\"Αφεντρού\",\"Ασημώνη\",\"Ατθίς\",\"Αυξώ\",\"Ατρεύς\",\"Αυρήλιος\",\"Αυρηλία\",\"Ατταλος\",\"Αστυάναξ\",\"Ασωπός\",\"Βεατρίκη\",\"Βακχυλίδης\",\"Βελλερεφόντης\",\"Βάκις\",\"Βελισσάριος\",\"Βελισσαρία\",\"Βενετία\",\"Βενέτης\",\"Βενέτιος\",\"Βενιζέλος\",\"Βένος\",\"Βενιζέλα\",\"Βένη\",\"Βαρύτιμος\",\"Βαρυτίμη\",\"Βαύβω\",\"Βάφης\",\"Βαφυκλής\",\"Βίας\",\"Βιολέτα\",\"Βίων\",\"Βοιώ\",\"Βοιωτός\",\"Βορέας\",\"Βότρυς\",\"Βρασίδας\",\"Βρισηίς\",\"Βροντής\",\"Βροντίνος\",\"Βροτέας\",\"Βρυάς\",\"Βρύμη\",\"Βρύσων\",\"Βύζας\",\"Βύρων\",\"Βύρωνας\",\"Βώρος\",\"Γαία\",\"Γείτων\",\"Γέλως\",\"Γέμινος\",\"Γανυμήδης\",\"Γαυανής\",\"Γή\",\"Γηρυόνης\",\"Γιαλαμάς\",\"Γιασεμής\",\"Γλαύκη\",\"Γλαυκίδης\",\"Γλαυκιάς\",\"Γλαύκος\",\"Γκόλφω\",\"Γνήσιππος\",\"Γοργίας\",\"Γόργος\",\"Γόργω\",\"Γραικός\",\"Γραμμένος\",\"Γραμματική\",\"Γρύλος\",\"Γρύνειος\",\"Γύγης\",\"Γυής\",\"Γυπαιεύς\",\"Γύλιππος\",\"Δαείρα\",\"Δαίδαλος\",\"Δεινοκράτης\",\"Δεινόστρατος\",\"Δείνω\",\"Δείνων\",\"Δελφίων\",\"Δαναός\",\"Δάμας\",\"Δαμασιάς\",\"Δαμάσκιος\",\"Δαμαστής\",\"Δέξιππος\",\"Δάμις\",\"Δαμόκλης\",\"Δαμοφίλη\",\"Δαμόφων\",\"Δάρδανος\",\"Δευκαλίων\",\"Δήλιος\",\"Δημάρατος\",\"Δημοχάρης\",\"Δημόδοκος\",\"Δημοκίδης\",\"Δημοκράτης\",\"Δημόκριτος\",\"Δημοφίλη\",\"Δημόφων\",\"Διαγόρας\",\"Διαλεχτή\",\"Διαλεκτή\",\"Διαμαντής\",\"Διηδάμεια\",\"Διηάνειρα\",\"Δικαία\",\"Δικαίαρχος\",\"Δικτύς\",\"Διοχάντη\",\"Διόδωρος\",\"Διόκλης\",\"Διοφάνη\",\"Διοφάντη\",\"Διόφαντος\",\"Διοτίμα\",\"Δίνων\",\"Διφίλη\",\"Δίφιλος\",\"Δίων\",\"Διωξίππη\",\"Δούρις\",\"Δρύα\",\"Δρύκαλος\",\"Δρυόπη\",\"Δυναμένη\",\"Δύμας\",\"Δώρος\",\"Δωτώ\",\"Εχεκράτης\",\"Εχιδνα\",\"Εβελίνα\",\"Εβελύνα\",\"Εβελιν\",\"Εβελυν\",\"Επαφος\",\"Επιγένης\",\"Επίζηλος\",\"Επίδικος\",\"Επίκουρος\",\"Επίκτητος\",\"Επιμενίδης\",\"Εκάβη\",\"Εκάλη\",\"Ελβίρα\",\"Εκαταίος\",\"Εκάτη\",\"Ελατος\",\"Ελίδα\",\"Ελλάνικος\",\"Ελλη\",\"Ελλην\",\"Ελίκη\",\"Εικονία\",\"Εκτωρ\",\"Ενάρετη\",\"Εμπεδοκλής\",\"Ενιππεύς\",\"Ενυώ\",\"Ερεχθεύς\",\"Εργίνος\",\"Εργίνα\",\"Εργότιμος\",\"Ερατοσθένης\",\"Εριφύλη\",\"Ερμόδωρος\",\"Εριέτα\",\"Ερριέτα\",\"Ερριέττα\",\"Εριέττα\",\"Ερρίκος\",\"Ερύμανθος\",\"Ερυξιάς\",\"Ερυξίμαχος\",\"Ερωφίλη\",\"Ερωτόκριτος\",\"Εύχαρης\",\"Ευαγόρας\",\"Ευγέων\",\"Εύδημος\",\"Ευάλιος\",\"Εύδοξος\",\"Ευγνωσία\",\"Ευδώρα\",\"Εύηνος\",\"Ευπείθης\",\"Ευπάλινος\",\"Ευπόλεμος\",\"Ευπόλις\",\"Εφιππος\",\"Ευκλεάς\",\"Ευκλείδης\",\"Ευκρατίδης\",\"Ευθύδημος\",\"Ευθυκλής\",\"Ευθυμίδης\",\"Ευθύνους\",\"Εύμαχος\",\"Εύμαιος\",\"Εύμηλος\",\"Ετοιμοκλής\",\"Ευμόλπη\",\"Εύμολπος\",\"Εύνομος\",\"Ευριάδης\",\"Ευριδίκη\",\"Ευρυδίκη\",\"Ευριπίδης\",\"Εφρόνιος\",\"Ευρυδάμας\",\"Ευρυβιάδης\",\"Ευρυάλη\",\"Ευρύαλος\",\"Ευρύκλεια\",\"Ευρύλοχος\",\"Ευρυνόμη\",\"Ευρυσθεύς\",\"Ευρώπη\",\"Εστία\",\"Ευφοριών\",\"Ζαγρεύς\",\"Ζάλευκος\",\"Ζαμπέτας\",\"Ζαμπέτα\",\"Ζαφείριος\",\"Ζαφείρης\",\"Ζαφείρω\",\"Ζαφειρία\",\"Ζευξίδαμος\",\"Ζεύξιππος\",\"Ζεύς\",\"Ζέφυρος\",\"Ζήθος\",\"Ζήκος\",\"Ζήλος\",\"Ζήνις\",\"Ζηνόδοτος\",\"Ζηνόδωρος\",\"Ζήτης\",\"Ζωναίος\",\"Ζωογόνος\",\"Ζωτιάτης\",\"Ηχώ\",\"Ηγέλοχος\",\"Ηβη\",\"Ηγήμων\",\"Ηγήσανδρος\",\"Ηγησιάναξ\",\"Ηγησίας\",\"Ηγήσιππος\",\"Ηγήτωρ\",\"Ηγίας\",\"Ηδύλη\",\"Ηετίων\",\"Ηπιόνη\",\"Ηλέκτρα\",\"Ηλεκτρίων\",\"Ηλιος\",\"Ηνίοχος\",\"Ηρα\",\"Ηρέας\",\"Ηρακλείδης\",\"Ηράκλειτος\",\"Ηριγόνη\",\"Ηριλλος\",\"Ηρίννα\",\"Ηρόδοτος\",\"Ηρόδωρος\",\"Ηροφίλη\",\"Ηρόφιλος\",\"Ηφαιστος\",\"Ησίοδος\",\"Ησιόνη\",\"Ηώ\",\"Θάλητας\",\"Θέλμα\",\"Θέλημα\",\"Θελξιώπη\",\"Θεοδήγιος\",\"Θεοδώρα\",\"Δώρα\",\"Ντόρα\",\"Θοδώρα\",\"Δωρούλα\",\"Θεόκριτος\",\"Θέμις\",\"Θεοξένιος\",\"Θαμυρίς\",\"Θεοφρονία\",\"Θάρυπος\",\"Θέρσιππος\",\"Θερσίτης\",\"Θεύδιος\",\"Θέσπις\",\"Θέσιος\",\"Θέτις\",\"Θεσσαλονίκη\",\"Θέων\",\"Θηβαίς\",\"Θηριαμένης\",\"Θόη\",\"Θουκυδίδης\",\"Θουκιδίδης\",\"Θρασύβουλος\",\"Θρασύλλος\",\"Θρασύμαχος\",\"Θυέστης\",\"Θυία\",\"Θυμοχάρης\",\"Θυώνη\",\"Ιδαία\",\"Ιδαίος\",\"Ιάπετος\",\"Ιάμβλιχος\",\"Ιδομενεύς\",\"Ιαμος\",\"Ιεροκλής\",\"Ιβυκος\",\"Ιασίων\",\"Ιασώ\",\"Ιππαρχος\",\"Ιππη\",\"Ιππίας\",\"Ιπποδάμεια\",\"Ιπποκράτης\",\"Ιπποσθένης\",\"Ιππων\",\"Ικέλιδας\",\"Ιθακος\",\"Ικάριος\",\"Ικέτας\",\"Ιλιάς\",\"Ιλιάδα\",\"Ιλιόνη\",\"Ιλλος\",\"Ιθυκλής\",\"Ικτίνος\",\"Ιναχος\",\"Ιοβάτης\",\"Ιμβριος\",\"Ιοκάστη\",\"Ιόλη\",\"Ιόλλας\",\"Ιξιόνη\",\"Ιξίων\",\"Ιόνη\",\"Ινώ\",\"Ισαμπέλλα\",\"Ιζαμπέλλα\",\"Ισαβέλλα\",\"Ισαίος\",\"Ισανδρος\",\"Ιτη\",\"Ιφικράτεια\",\"Ιφικράτης\",\"Ισθμιονίκης\",\"Ιφιτος\",\"Ιστρος\",\"Ιτυς\",\"Ιώ\",\"Ιώλκιος\",\"Καδιανή\",\"Κάντιω\",\"Κάδμος\",\"Καλαμίς\",\"Κέλεος\",\"Κάλας\",\"Καλλιδίκη\",\"Καλλιάνθη\",\"Καλλίας\",\"Καλλιπάτειρα\",\"Καλλίππος\",\"Καλλικλής\",\"Καλλικράτης\",\"Καλλίμαχος\",\"Καλλιμέδων\",\"Καλλίνος\",\"Καλομοίρα\",\"Κέκρωψ\",\"Καλυψώ\",\"Κανέλλα\",\"Κανέλα\",\"Κανέλος\",\"Κανέλλης\",\"Νέλλη\",\"Νέλη\",\"Κένταυρος\",\"Καρανός\",\"Κάρπω\",\"Καρνεάδης\",\"Κάρολος\",\"Τσάρλς\",\"Τσάρλυ\",\"Κάρολ\",\"Καρολίνα\",\"Κασσάνδρα\",\"Κάσσανδρος\",\"Κηφεύς\",\"Κηφισόδωρος\",\"Κλεάνθης\",\"Κλέαρχος\",\"Κλεαρέτη\",\"Κλείνιος\",\"Κλεισθένης\",\"Κλείτος\",\"Κλεοδαίος\",\"Κλεόδαμος\",\"Κλεόβουλος\",\"Κλεομένης\",\"Κλεομήδης\",\"Κλέων\",\"Κλιτίας\",\"Κινησίας\",\"Κινύρα\",\"Κινυρίς\",\"Κίμων\",\"Κίρκη\",\"Κίσιος\",\"Κλυμένη\",\"Κλυταιμνήστρα\",\"Κλυτίδης\",\"Κλύτος\",\"Κλώθω\",\"Κνήμος\",\"Κοίνος\",\"Κονδυλένια\",\"Κονδυλία\",\"Κοντυλιά\",\"Κομνηνός\",\"Κορτέσσα\",\"Τέσσα\",\"Κορτέσα\",\"Τέσα\",\"Κορτέσσης\",\"Κορτέσης\",\"Κορυδών\",\"Κούρος\",\"Κραναός\",\"Κρατής\",\"Κρατίνος\",\"Κρατύλος\",\"Κρέων\",\"Κριτίας\",\"Κριτόδημος\",\"Κριτόλαος\",\"Κρίτων\",\"Κρίτωνας\",\"Κυβέλη\",\"Κυδιάς\",\"Κύδων\",\"Κτησίβιος\",\"Κτησίας\",\"Κύνθια\",\"Κυμοθόη\",\"Κύψελος\",\"Λαχαρής\",\"Λάχεσις\",\"Λάχης\",\"Λαέρτης\",\"Λακύδης\",\"Λάκων\",\"Λάμαχος\",\"Λαοδάμεια\",\"Λαοδάμας\",\"Λαοδίκη\",\"Λαμπέτια\",\"Λαμπροκλής\",\"Λάμπων\",\"Λαοθόη\",\"Λεοντεύς\",\"Λαόφιλος\",\"Λάσκαρης\",\"Λασκαρίνα\",\"Λευκάτη\",\"Λεύκιππος\",\"Λεύκων\",\"Λάσος\",\"Λεωχάρης\",\"Λεωδάμας\",\"Λεωκράτης\",\"Λάϊος\",\"Λεωσθένης\",\"Λητώ\",\"Λοίδα\",\"Λωίδα\",\"Λόις\",\"Λορέντζος\",\"Λουκρητία\",\"Λυγερή\",\"Λυγερός\",\"Λυκέας\",\"Λυκαίος\",\"Λυκάονας\",\"Λυκίς\",\"Λυκομήδης\",\"Λύκος\",\"Λυκούργος\",\"Λυκόφρων\",\"Λύκων\",\"Λύσανδρος\",\"Λυσίας\",\"Λύσιππος\",\"Λυσικράτη\",\"Λυσιμάχη\",\"Λυσίς\",\"Μεγακλής\",\"Μεγαλοστράτη\",\"Μεγάρη\",\"Μέγας\",\"Μεγασθένης\",\"Μεγιστίας\",\"Μελέαγρος\",\"Μέλαμπους\",\"Μελανιππίδης\",\"Μελάνθιος\",\"Μελανθώ\",\"Μάκαρ\",\"Μαίας\",\"Μελησίας\",\"Μελικέρτη\",\"Μέλισσος\",\"Μενέδημος\",\"Μενέκαλος\",\"Μένεκλης\",\"Μενεκράτης\",\"Μένιππος\",\"Μάνθος\",\"Μάνθα\",\"Μέμος\",\"Μέμα\",\"Μεχμέτ\",\"Μαντίας\",\"Μάντιος\",\"Μέντωρ\",\"Μένων\",\"Μαρίλια\",\"Μαρήλια\",\"Μαρούλα\",\"Μαρσύας\",\"Μεσινίδης\",\"Μέτων\",\"Μήδεια\",\"Μήδεος\",\"Μηριόνη\",\"Μήτις\",\"Μητρόδωρος\",\"Μητροκλής\",\"Μήτων\",\"Μιαούλης\",\"Μίκων\",\"Μίμνερμος\",\"Μιράντα\",\"Μνημοσύνη\",\"Μνησικλής\",\"Μορφέας\",\"Μοσχίνα\",\"Μουσαίος\",\"Μυκήνη\",\"Μυλλίας\",\"Μύνης\",\"Μυρίνη\",\"Μύρνα\",\"Μύρμηξ\",\"Μυρτίλος\",\"Μύρτις\",\"Μυρωνίδης\",\"Νέδων\",\"Ναπολέων\",\"Λέων\",\"Λεό\",\"Νέκλερη\",\"Νειοκλής\",\"Νέμεση\",\"Νεοπτόλεμος\",\"Νεοκλής\",\"Νεόκριτος\",\"Νέορος\",\"Ναύπλιος\",\"Ναυκλείδης\",\"Ναυμάχιος\",\"Ναυσικά\",\"Ναυσιθόη\",\"Ναυσικράτης\",\"Ναυσίμαχος\",\"Ναυσίνικος\",\"Νέσσος\",\"Νάϊρχος\",\"Νηίς\",\"Νηρεύς\",\"Νηρέας\",\"Νηρίτη\",\"Νήριτος\",\"Νησαίη\",\"Νηφαίη\",\"Νήσω\",\"Νικαγόρας\",\"Νικαρέτη\",\"Νικίας\",\"Νικόδωρος\",\"Νικοκλής\",\"Νικόμαχος\",\"Νικομήδης\",\"Νικοσθένης\",\"Νιόβη\",\"Νισαίος\",\"Νίσος\",\"Νοήμων\",\"Νομικός\",\"Νομική\",\"Νόμιος\",\"Ξέναρχος\",\"Ξενίδης\",\"Ξενόδαμος\",\"Ξενοδίκη\",\"Ξενόκλεια\",\"Ξενοκλής\",\"Ξενοκράτης\",\"Ξενόκριτος\",\"Ξενοφάνης\",\"Ξενόφιλος\",\"Ξένων\",\"Ξούθος\",\"Ξυνόφρων\",\"Οδιος\",\"Οδυσσεύς\",\"Οδυσσέας\",\"Οδύσσεια\",\"Οπίτης\",\"Οίαγρος\",\"Οιδίπους\",\"Οινεύς\",\"Οινοπίδης\",\"Οινοπίων\",\"Οινομάχος\",\"Ολυμπος\",\"Ολύνθιος\",\"Οίστρος\",\"Οθων\",\"Οθωνας\",\"Ονειρος\",\"Ονασιάς\",\"Ονήσιλος\",\"Ονήτωρ\",\"Ονομακλής\",\"Ορθαίος\",\"Ορμένος\",\"Οροίδος\",\"Ορφεύς\",\"Ορφέας\",\"Ορτίλοχος\",\"Οφελεστής\",\"Οφέλτης\",\"Οψιμος\",\"Παγώνα\",\"Παγόνα\",\"Παγούνω\",\"Πάππος\",\"Παλαιολόγος\",\"Παλαίμων\",\"Παλαμήδης\",\"Πελασγός\",\"Πειθέας\",\"Πάλλας\",\"Πελίας\",\"Πειθώ\",\"Πέλοψ\",\"Πέλοπας\",\"Πείσανδρος\",\"Πεισίστρατος\",\"Παιώνειος\",\"Πάν\",\"Πάννας\",\"Πάνας\",\"Πάνδαρος\",\"Πανδίων\",\"Πάνδροσος\",\"Πάνδωρος\",\"Πενθέας\",\"Πανταζής\",\"Πανσέληνος\",\"Πανωραία\",\"Περδίκας\",\"Περίανδρος\",\"Πάρις\",\"Πάρης\",\"Παρμενίδης\",\"Περσαίος\",\"Παρσενία\",\"Περσεύς\",\"Περσέας\",\"Πασιθέα\",\"Πασιφάη\",\"Πατροκλής\",\"Παυσανίας\",\"Πήρω\",\"Πλειστονίκης\",\"Πλειώνη\",\"Πλανητιάδης\",\"Πίγρης\",\"Πλήθων\",\"Πιτθεύς\",\"Πιτθέας\",\"Πιττακός\",\"Πλωτώ\",\"Πολέμαρχος\",\"Ποθητός\",\"Ποθητή\",\"Πολυδάμας\",\"Πολυδάμνεια\",\"Πολυδεύκης\",\"Πολυγνώτης\",\"Πολυδώρη\",\"Πολυκάστη\",\"Πολύκλειτος\",\"Πολυκράτης\",\"Πολύμερος\",\"Πολυμήδης\",\"Πολυνόη\",\"Ποσειδών\",\"Πραξιθέα\",\"Πραξιτέλης\",\"Πρίαμος\",\"Πρωταγόρας\",\"Πρωτεύς\",\"Πρωτέας\",\"Πρωτογένεια\",\"Πρωτογένης\",\"Πρώτω\",\"Πυθαγόρας\",\"Πυθεύς\",\"Πύθων\",\"Πτολεμαίος\",\"Πύρρα\",\"Πύρρανθος\",\"Πυρρίας\",\"Πυρρίμαχος\",\"Ρέα\",\"Ραδάμανθυς\",\"Ρείσης\",\"Ραμφίας\",\"Ρήγας\",\"Ρηγίλλα\",\"Ρήνη\",\"Ρητόριος\",\"Ρήσος\",\"Ριχάρδος\",\"Ρίζος\",\"Ριανός\",\"Ρίνων\",\"Ροδεία\",\"Ροδειάς\",\"Ροβέρτος\",\"Ροδόχρους\",\"Ροδόλφος\",\"Ρόδος\",\"Ρολάνδη\",\"Ρολάνδος\",\"Ροικός\",\"Σακελλάριος\",\"Σακελλάρης\",\"Σειληνός\",\"Σείριος\",\"Σεμέλη\",\"Σαραπίων\",\"Σαραφιανός\",\"Σαρπηδών\",\"Σάτνιος\",\"Σπειώ\",\"Σπάρτη\",\"Σπεύσιππος\",\"Σπήλιος\",\"Σπίνθαρος\",\"Σίδη\",\"Σθενέλαος\",\"Σθενίδας\",\"Σκάμων\",\"Σιβύλα\",\"Σκευοφύλακας\",\"Σικέλη\",\"Σκιπίων\",\"Σκιρωνίδης\",\"Σκοπελιανός\",\"Σκόπας\",\"Σιμμιάς\",\"Σιμωνίδης\",\"Σίσυφος\",\"Σίσσυφος\",\"Σμιχιάς\",\"Σόφιλος\",\"Σταμούλης\",\"Στάφυλος\",\"Στησαγόρας\",\"Στησίχορος\",\"Στίλπων\",\"Σφοδριάς\",\"Συνοδή\",\"Συνοδινός\",\"Στράβων\",\"Στρατοκλής\",\"Στράττις\",\"Συρμούλα\",\"Σύρμω\",\"Σύρος\",\"Σώφιλος\",\"Τελαμών\",\"Τελαυγής\",\"Τελέσιλλα\",\"Τελέστης\",\"Τελέστω\",\"Ταίναρος\",\"Τειρεσίας\",\"Τεκταίος\",\"Τεισίας\",\"Τέκτων\",\"Τέκτονας\",\"Τάλως\",\"Τάνταλος\",\"Τέρπανδρος\",\"Τερψιθέα\",\"Ταϋγέτη\",\"Τηλεβόης\",\"Τηλεκλείδης\",\"Τηλέφασση\",\"Τηλέφη\",\"Τηλεφίδης\",\"Τήλεφος\",\"Τήθυ\",\"Τήμενος\",\"Τηρέας\",\"Τήρω\",\"Τιμαγόρας\",\"Τιμαίος\",\"Τίμανδρος\",\"Τιμαρέτη\",\"Τιμάρατος\",\"Τιμοχάρης\",\"Τιμολέων\",\"Τιμος\",\"Τιμόκλεια\",\"Τιμοσθένης\",\"Τιμωνίδης\",\"Τολμαίος\",\"Τολμήδης\",\"Τριπτόλεμος\",\"Τρισεύγενη\",\"Τροφώνιος\",\"Τρυγώνα\",\"Τρυγόνα\",\"Τρύτων\",\"Τρίτων\",\"Τύχιος\",\"Τύνδαρης\",\"Τύριμμας\",\"Τυρταίος\",\"Τύφων\",\"Τυφώνη\",\"Υγεία\",\"Υαγνις\",\"Υβόννη\",\"Υδρέα\",\"Υδρεάς\",\"Υπείροχος\",\"Υπέρεια\",\"Υπέρβολος\",\"Υπερίδης\",\"Υπερίων\",\"Υπέροχη\",\"Υπέρτιμος\",\"Υλλος\",\"Υλότης\",\"Υψίπυλη\",\"Φαέθων\",\"Φαλέας\",\"Φειδίας\",\"Φαίδιμος\",\"Φάλαρις\",\"Φαίδων\",\"Φείδων\",\"Φαίστιος\",\"Φανιάς\",\"Φανόδικος\",\"Φανόκλης\",\"Φανοστράτη\",\"Φερεκύδης\",\"Φερεσύδη\",\"Φερούσα\",\"Φήμιος\",\"Φημονόη\",\"Φθία\",\"Φίλαινις\",\"Φιλεύς\",\"Φίλλις\",\"Φιλίνος\",\"Φιλίσκος\",\"Φίλιστος\",\"Φιλόδημος\",\"Φιλόπονος\",\"Φιλόλαος\",\"Φιλοκράτης\",\"Φιλοκτήτης\",\"Φιλόξενος\",\"Φιλομήλα\",\"Φιλόστρατος\",\"Φιλωτέρα\",\"Φιλώτας\",\"Φινεύς\",\"Φιντίας\",\"Φιντύς\",\"Φοίνιξ\",\"Φορμίων\",\"Φραγκίσκος\",\"Φραντζής\",\"Φραγκίσκη\",\"Φραντζέσκα\",\"Φρατζέσκα\",\"Φρασκώ\",\"Φρασκούλα\",\"Φρίξος\",\"Φροντίδας\",\"Φροντίς\",\"Φρύνη\",\"Φρύνιχος\",\"Φύλαρχος\",\"Φυλεύς\",\"Φυλλίς\",\"Φυλώ\",\"Φύρση\",\"Φωκυλίδης\",\"Φωτήλας\",\"Χαβρίας\",\"Χελιδόνα\",\"Χάλκων\",\"Χείλων\",\"Χαιρέδημος\",\"Χαιρέας\",\"Χαιρείας\",\"Χαιρέστρατος\",\"Χαιρήμων\",\"Χείρων\",\"Χαρίδημος\",\"Χαρικλής\",\"Χαρίνος\",\"Χαρμίδης\",\"Χάρμος\",\"Χερσιάς\",\"Χερσίφρων\",\"Χάρων\",\"Χίμαιρα\",\"Χιόνη\",\"Χίων\",\"Χλωρίς\",\"Χοίριλος\",\"Χρυσηίς\",\"Χρύσιππος\",\"Χρυσοθεμίς\",\"Χρυσοκόμης\",\"Ψαλμαχάρη\",\"Ψαλμαχάρης\",\"Ψαμάθη\",\"Ψαμμήτιχος\",\"Ωγυγής\",\"Ωγυγία\",\"Ωκάλεια\",\"Ωκέλος\",\"Ωληνός\",\"Ωκυπέτη\",\"Ωκυρρόη\",\"Ωκυτής\",\"Ωμαρής\",\"Ωραία\",\"Ωρειθυία\",\"Ωρος\",\"Ωφελίων\",\"Ωτος\"]},{\"toEaster\":-2,\"main\":\"Μεγάλη Παρασκευή\",\"variations\":[]},{\"toEaster\":1,\"main\":\"2α Διακαινησίμου - Δευτέρα\",\"variations\":[]}]}\n"
  },
  {
    "path": "android_mobile/src/main/res/raw/hu_namedays.json",
    "content": "{\"data\":[{\"names\":[\"Örs\",\" Stella\"],\"date\":\"14\\/07\"},{\"names\":[\"Ödön\"],\"date\":\"16\\/11\"},{\"names\":[\"Árpád\",\" Árpádina\"],\"date\":\"11\\/12\"},{\"names\":[\"Árpád\"],\"date\":\"31\\/03\"},{\"names\":[\"Áron\"],\"date\":\"02\\/04\"},{\"names\":[\"Ármin\",\" Pálma\"],\"date\":\"10\\/05\"},{\"names\":[\"Ákos\",\" Bátor\"],\"date\":\"28\\/02\"},{\"names\":[\"Ágota\",\" Ingrid\"],\"date\":\"05\\/02\"},{\"names\":[\"Ágota\"],\"date\":\"11\\/01\"},{\"names\":[\"Ágoston\"],\"date\":\"28\\/08\"},{\"names\":[\"Ágnes\"],\"date\":\"21\\/01\"},{\"names\":[\"Ádám\",\" Éva\"],\"date\":\"24\\/12\"},{\"names\":[\"Ádám\"],\"date\":\"09\\/09\"},{\"names\":[\"Ábrahám\"],\"date\":\"16\\/08\"},{\"names\":[\"Ábel\",\" Alpár\"],\"date\":\"02\\/01\"},{\"names\":[\"Zénó\"],\"date\":\"22\\/12\"},{\"names\":[\"Zsófia\",\" Szonja\"],\"date\":\"15\\/05\"},{\"names\":[\"Zsófia\"],\"date\":\"17\\/09\"},{\"names\":[\"Zsuzsanna\",\" Tiborc\"],\"date\":\"11\\/08\"},{\"names\":[\"Zsuzsanna\"],\"date\":\"19\\/02\"},{\"names\":[\"Zsombor\"],\"date\":\"08\\/11\"},{\"names\":[\"Zsolt\"],\"date\":\"10\\/04\"},{\"names\":[\"Zsigmond\"],\"date\":\"02\\/05\"},{\"names\":[\"Zoltán\"],\"date\":\"23\\/06\"},{\"names\":[\"Zoltán\"],\"date\":\"08\\/03\"},{\"names\":[\"Zita\"],\"date\":\"27\\/04\"},{\"names\":[\"Zelma\",\" Rajmund\",\" Emerencia\"],\"date\":\"23\\/01\"},{\"names\":[\"Zalán\"],\"date\":\"30\\/03\"},{\"names\":[\"Zakariás\"],\"date\":\"06\\/09\"},{\"names\":[\"Virág\"],\"date\":\"26\\/11\"},{\"names\":[\"Virgil\"],\"date\":\"27\\/11\"},{\"names\":[\"Viola\"],\"date\":\"19\\/12\"},{\"names\":[\"Vince\",\" Artúr\"],\"date\":\"22\\/01\"},{\"names\":[\"Vince\"],\"date\":\"05\\/04\"},{\"names\":[\"Vilmos\",\" Bíborka\"],\"date\":\"06\\/04\"},{\"names\":[\"Vilmos\"],\"date\":\"25\\/06\"},{\"names\":[\"Vilma\"],\"date\":\"05\\/12\"},{\"names\":[\"Villő\"],\"date\":\"12\\/06\"},{\"names\":[\"Vilhelmina\"],\"date\":\"19\\/09\"},{\"names\":[\"Viktória\"],\"date\":\"23\\/12\"},{\"names\":[\"Viktor\",\" Lőrinc\"],\"date\":\"05\\/09\"},{\"names\":[\"Veronika\"],\"date\":\"13\\/01\"},{\"names\":[\"Vendel\",\" Irén\"],\"date\":\"20\\/10\"},{\"names\":[\"Vencel\"],\"date\":\"28\\/09\"},{\"names\":[\"Vazul\"],\"date\":\"14\\/06\"},{\"names\":[\"Vanda\",\" Paula\"],\"date\":\"26\\/01\"},{\"names\":[\"Valéria\"],\"date\":\"28\\/04\"},{\"names\":[\"Valér\"],\"date\":\"15\\/12\"},{\"names\":[\"Valter\"],\"date\":\"16\\/07\"},{\"names\":[\"Ulrik\"],\"date\":\"04\\/07\"},{\"names\":[\"Tünde\"],\"date\":\"01\\/06\"},{\"names\":[\"Tódor\",\" Rómeó\"],\"date\":\"07\\/02\"},{\"names\":[\"Tímea\",\" Irma\"],\"date\":\"03\\/05\"},{\"names\":[\"Tivadar\"],\"date\":\"20\\/04\"},{\"names\":[\"Tivadar\"],\"date\":\"09\\/11\"},{\"names\":[\"Titusz\",\" Leona\"],\"date\":\"04\\/01\"},{\"names\":[\"Timót\"],\"date\":\"24\\/01\"},{\"names\":[\"Tihamér\",\" Annamária\"],\"date\":\"01\\/07\"},{\"names\":[\"Tibor\"],\"date\":\"14\\/04\"},{\"names\":[\"Teréz\"],\"date\":\"15\\/10\"},{\"names\":[\"Teofil\"],\"date\":\"20\\/12\"},{\"names\":[\"Teodóra\"],\"date\":\"11\\/09\"},{\"names\":[\"Tekla\",\" Líviusz\"],\"date\":\"23\\/09\"},{\"names\":[\"Tamás\",\" Tamara\"],\"date\":\"29\\/12\"},{\"names\":[\"Tamás\"],\"date\":\"21\\/12\"},{\"names\":[\"Tamás\"],\"date\":\"07\\/03\"},{\"names\":[\"Taksony\"],\"date\":\"29\\/11\"},{\"names\":[\"Sára\",\" Márió\"],\"date\":\"19\\/01\"},{\"names\":[\"Sándor\",\" Ede\"],\"date\":\"18\\/03\"},{\"names\":[\"Sámuel\",\" Hajna\"],\"date\":\"21\\/08\"},{\"names\":[\"Szilárda\"],\"date\":\"14\\/12\"},{\"names\":[\"Szilárd\"],\"date\":\"11\\/03\"},{\"names\":[\"Szilvia\"],\"date\":\"13\\/11\"},{\"names\":[\"Szilveszter\"],\"date\":\"31\\/12\"},{\"names\":[\"Szeréna\",\" Roxána\"],\"date\":\"14\\/09\"},{\"names\":[\"Szervác\",\" Imola\"],\"date\":\"13\\/05\"},{\"names\":[\"Szabolcs\",\" Alina\"],\"date\":\"28\\/07\"},{\"names\":[\"Szabina\"],\"date\":\"27\\/10\"},{\"names\":[\"Stefánia\"],\"date\":\"28\\/11\"},{\"names\":[\"Simon\",\" Szimonetta\"],\"date\":\"28\\/10\"},{\"names\":[\"Simon\"],\"date\":\"05\\/01\"},{\"names\":[\"Salamon\"],\"date\":\"24\\/10\"},{\"names\":[\"Rózsa\"],\"date\":\"30\\/08\"},{\"names\":[\"RóbertRobertina\",\" Arianna\"],\"date\":\"07\\/06\"},{\"names\":[\"Réka\"],\"date\":\"10\\/11\"},{\"names\":[\"Ráhel\",\" Csenge\"],\"date\":\"04\\/02\"},{\"names\":[\"Rudolf\"],\"date\":\"17\\/04\"},{\"names\":[\"Rozália\"],\"date\":\"04\\/09\"},{\"names\":[\"Rezső\"],\"date\":\"07\\/11\"},{\"names\":[\"Regina\"],\"date\":\"07\\/09\"},{\"names\":[\"Rebeka\",\" Dorina\"],\"date\":\"02\\/09\"},{\"names\":[\"Rafael\"],\"date\":\"20\\/06\"},{\"names\":[\"Péter\",\" Pál\"],\"date\":\"29\\/06\"},{\"names\":[\"Péter\"],\"date\":\"29\\/04\"},{\"names\":[\"Pál\"],\"date\":\"30\\/06\"},{\"names\":[\"Pál\"],\"date\":\"25\\/01\"},{\"names\":[\"Pongrác\"],\"date\":\"12\\/05\"},{\"names\":[\"Piroska\"],\"date\":\"18\\/01\"},{\"names\":[\"Petra\"],\"date\":\"02\\/10\"},{\"names\":[\"Paulina\"],\"date\":\"22\\/06\"},{\"names\":[\"Paszkál\"],\"date\":\"17\\/05\"},{\"names\":[\"Ottó\"],\"date\":\"02\\/07\"},{\"names\":[\"Oszkár\"],\"date\":\"31\\/07\"},{\"names\":[\"Orsolya\"],\"date\":\"21\\/10\"},{\"names\":[\"Orbán\"],\"date\":\"25\\/05\"},{\"names\":[\"Olivér\"],\"date\":\"21\\/11\"},{\"names\":[\"Olga\",\" Liliána\"],\"date\":\"27\\/07\"},{\"names\":[\"Nóra\",\" Lili\",\" Nelli\"],\"date\":\"11\\/07\"},{\"names\":[\"Nárcisz\"],\"date\":\"29\\/10\"},{\"names\":[\"Nándor\"],\"date\":\"19\\/10\"},{\"names\":[\"Norbert\",\" Cintia\"],\"date\":\"06\\/06\"},{\"names\":[\"Nikolett\",\" Hunor\"],\"date\":\"10\\/09\"},{\"names\":[\"Natália\"],\"date\":\"09\\/12\"},{\"names\":[\"Mózes\",\" Botond\"],\"date\":\"16\\/05\"},{\"names\":[\"Móric\"],\"date\":\"22\\/09\"},{\"names\":[\"Mónika\",\" Flórián\"],\"date\":\"04\\/05\"},{\"names\":[\"Máté\",\" Mirella\"],\"date\":\"21\\/09\"},{\"names\":[\"Mátyás\"],\"date\":\"25\\/02\"},{\"names\":[\"Márton\"],\"date\":\"11\\/11\"},{\"names\":[\"Márta\",\" Márti\",\" Flóra\"],\"date\":\"29\\/07\"},{\"names\":[\"Márk\"],\"date\":\"25\\/04\"},{\"names\":[\"Mária\",\" Adrienn\"],\"date\":\"08\\/09\"},{\"names\":[\"Mária\"],\"date\":\"15\\/08\"},{\"names\":[\"Mária\"],\"date\":\"12\\/09\"},{\"names\":[\"Mária\"],\"date\":\"08\\/12\"},{\"names\":[\"Miksa\"],\"date\":\"12\\/10\"},{\"names\":[\"Miklós\"],\"date\":\"06\\/12\"},{\"names\":[\"Mihály\"],\"date\":\"08\\/05\"},{\"names\":[\"Mihály\"],\"date\":\"29\\/09\"},{\"names\":[\"Menyhért\",\" Mirjam\"],\"date\":\"22\\/08\"},{\"names\":[\"Melánia\"],\"date\":\"10\\/01\"},{\"names\":[\"Melinda\",\" Vivien\"],\"date\":\"02\\/12\"},{\"names\":[\"Medárd\"],\"date\":\"08\\/06\"},{\"names\":[\"Matild\"],\"date\":\"14\\/03\"},{\"names\":[\"Martina\",\" Gerda\"],\"date\":\"30\\/01\"},{\"names\":[\"Marianna\"],\"date\":\"01\\/11\"},{\"names\":[\"Margit\",\" Gréta\"],\"date\":\"10\\/06\"},{\"names\":[\"Marcella\"],\"date\":\"31\\/01\"},{\"names\":[\"Marcell\"],\"date\":\"09\\/01\"},{\"names\":[\"Marcell\"],\"date\":\"14\\/08\"},{\"names\":[\"Malvin\"],\"date\":\"01\\/10\"},{\"names\":[\"Magdolna\"],\"date\":\"29\\/05\"},{\"names\":[\"Magdolna\"],\"date\":\"22\\/07\"},{\"names\":[\"Lőrinc\"],\"date\":\"10\\/08\"},{\"names\":[\"Lóránt\",\" Loránd\"],\"date\":\"15\\/01\"},{\"names\":[\"Lídia\",\" Lívia\"],\"date\":\"12\\/02\"},{\"names\":[\"Lénárd\"],\"date\":\"06\\/11\"},{\"names\":[\"Lázár\",\" Olimpia\"],\"date\":\"17\\/12\"},{\"names\":[\"László\"],\"date\":\"08\\/08\"},{\"names\":[\"László\"],\"date\":\"27\\/06\"},{\"names\":[\"Lukács\"],\"date\":\"18\\/10\"},{\"names\":[\"Lukrécia\"],\"date\":\"09\\/07\"},{\"names\":[\"Lujza\"],\"date\":\"02\\/03\"},{\"names\":[\"Luca\",\" Otília\"],\"date\":\"13\\/12\"},{\"names\":[\"Leó\",\" Szaniszló\"],\"date\":\"11\\/04\"},{\"names\":[\"Levente\",\" Irén\"],\"date\":\"28\\/06\"},{\"names\":[\"Leonóra\",\" Inez\"],\"date\":\"06\\/03\"},{\"names\":[\"Lenke\"],\"date\":\"23\\/07\"},{\"names\":[\"Lehel\"],\"date\":\"02\\/08\"},{\"names\":[\"Laura\",\" Alida\",\" Alina\"],\"date\":\"17\\/06\"},{\"names\":[\"Lajos\",\" Patrícia\"],\"date\":\"25\\/08\"},{\"names\":[\"Kázmér\"],\"date\":\"04\\/03\"},{\"names\":[\"Károly\",\" Karola\"],\"date\":\"28\\/01\"},{\"names\":[\"Károly\"],\"date\":\"04\\/11\"},{\"names\":[\"Kármen\",\" Anita\"],\"date\":\"02\\/06\"},{\"names\":[\"Kálmán\",\" Ede\"],\"date\":\"13\\/10\"},{\"names\":[\"Krisztián\",\" Ajtony\"],\"date\":\"13\\/03\"},{\"names\":[\"Krisztina\"],\"date\":\"05\\/08\"},{\"names\":[\"Kristóf\",\" Jakab\"],\"date\":\"25\\/07\"},{\"names\":[\"Kristóf\"],\"date\":\"15\\/03\"},{\"names\":[\"Kornélia\"],\"date\":\"03\\/03\"},{\"names\":[\"Kornél\",\" Soma\"],\"date\":\"03\\/07\"},{\"names\":[\"Kornél\"],\"date\":\"13\\/09\"},{\"names\":[\"Koppány\"],\"date\":\"08\\/10\"},{\"names\":[\"Konstantin\"],\"date\":\"21\\/05\"},{\"names\":[\"Konrád\",\" Zelmira\"],\"date\":\"21\\/04\"},{\"names\":[\"Kolos\",\" Georgina\"],\"date\":\"15\\/02\"},{\"names\":[\"Klára\"],\"date\":\"12\\/08\"},{\"names\":[\"Klotild\",\" Cecília\"],\"date\":\"03\\/06\"},{\"names\":[\"Klaudia\"],\"date\":\"20\\/03\"},{\"names\":[\"Kinga\",\" Kincső\"],\"date\":\"24\\/07\"},{\"names\":[\"Kelemen\",\" Klementina\"],\"date\":\"23\\/11\"},{\"names\":[\"Katalin\",\" Kitti\"],\"date\":\"30\\/04\"},{\"names\":[\"Katalin\"],\"date\":\"25\\/11\"},{\"names\":[\"Karolina\",\" Aida\"],\"date\":\"02\\/02\"},{\"names\":[\"Kamilla\"],\"date\":\"28\\/12\"},{\"names\":[\"Júlia\",\" Rita\"],\"date\":\"22\\/05\"},{\"names\":[\"József\",\" Bánk\"],\"date\":\"19\\/03\"},{\"names\":[\"Jónás\",\" Renátó\"],\"date\":\"12\\/11\"},{\"names\":[\"János\",\" Pál\"],\"date\":\"26\\/06\"},{\"names\":[\"János\"],\"date\":\"27\\/12\"},{\"names\":[\"Jácint\"],\"date\":\"17\\/08\"},{\"names\":[\"Jusztina\"],\"date\":\"26\\/09\"},{\"names\":[\"Jusztin\"],\"date\":\"16\\/06\"},{\"names\":[\"Julianna\",\" Lilla\"],\"date\":\"16\\/02\"},{\"names\":[\"Judit\",\" Xénia\"],\"date\":\"30\\/07\"},{\"names\":[\"Judit\"],\"date\":\"10\\/12\"},{\"names\":[\"Jolán\",\" Vid\"],\"date\":\"15\\/06\"},{\"names\":[\"Jolán\"],\"date\":\"20\\/11\"},{\"names\":[\"Jeromos\"],\"date\":\"30\\/09\"},{\"names\":[\"Jenő\"],\"date\":\"18\\/11\"},{\"names\":[\"Jenő\"],\"date\":\"13\\/07\"},{\"names\":[\"Janka\",\" Zsanett\"],\"date\":\"30\\/05\"},{\"names\":[\"Izsó\"],\"date\":\"26\\/08\"},{\"names\":[\"Izidor\"],\"date\":\"04\\/04\"},{\"names\":[\"Izabella\",\" Dalma\"],\"date\":\"12\\/07\"},{\"names\":[\"Ivó\",\" Milán\"],\"date\":\"19\\/05\"},{\"names\":[\"Iván\"],\"date\":\"24\\/06\"},{\"names\":[\"Ivett\",\" Frida\"],\"date\":\"06\\/05\"},{\"names\":[\"István\"],\"date\":\"26\\/12\"},{\"names\":[\"István\"],\"date\":\"20\\/08\"},{\"names\":[\"Irén\",\" Írisz\"],\"date\":\"25\\/03\"},{\"names\":[\"Ipoly\"],\"date\":\"13\\/08\"},{\"names\":[\"Imre\"],\"date\":\"05\\/11\"},{\"names\":[\"Ilona\"],\"date\":\"18\\/08\"},{\"names\":[\"Illés\"],\"date\":\"20\\/07\"},{\"names\":[\"Ildikó\"],\"date\":\"10\\/03\"},{\"names\":[\"Ignác\"],\"date\":\"01\\/02\"},{\"names\":[\"Ida\"],\"date\":\"13\\/04\"},{\"names\":[\"Ibolya\"],\"date\":\"07\\/08\"},{\"names\":[\"Hugó\"],\"date\":\"01\\/04\"},{\"names\":[\"Huba\"],\"date\":\"19\\/08\"},{\"names\":[\"Hortenzia\",\" Gergő\"],\"date\":\"17\\/11\"},{\"names\":[\"Hilda\"],\"date\":\"03\\/09\"},{\"names\":[\"Hermina\"],\"date\":\"03\\/08\"},{\"names\":[\"Herman\"],\"date\":\"07\\/04\"},{\"names\":[\"Henrik\",\" Roland\"],\"date\":\"15\\/07\"},{\"names\":[\"Henrietta\"],\"date\":\"16\\/03\"},{\"names\":[\"Helén\"],\"date\":\"14\\/10\"},{\"names\":[\"Hella\"],\"date\":\"27\\/05\"},{\"names\":[\"Helga\"],\"date\":\"03\\/10\"},{\"names\":[\"Hedvig\"],\"date\":\"17\\/10\"},{\"names\":[\"Hajnalka\"],\"date\":\"27\\/03\"},{\"names\":[\"Géza\"],\"date\":\"26\\/02\"},{\"names\":[\"Gáspár\"],\"date\":\"27\\/08\"},{\"names\":[\"Gál\"],\"date\":\"16\\/10\"},{\"names\":[\"Gábor\",\" Karina\"],\"date\":\"24\\/03\"},{\"names\":[\"Győző\"],\"date\":\"03\\/11\"},{\"names\":[\"Györgyi\"],\"date\":\"05\\/05\"},{\"names\":[\"György\"],\"date\":\"24\\/04\"},{\"names\":[\"Gyöngyvér\"],\"date\":\"23\\/10\"},{\"names\":[\"Gyöngyvér\"],\"date\":\"08\\/01\"},{\"names\":[\"Gyárfás\"],\"date\":\"19\\/06\"},{\"names\":[\"Gyula\"],\"date\":\"12\\/04\"},{\"names\":[\"Gusztáv\"],\"date\":\"16\\/01\"},{\"names\":[\"Gizella\"],\"date\":\"07\\/05\"},{\"names\":[\"Gerzson\"],\"date\":\"22\\/02\"},{\"names\":[\"Gertrúd\",\" Patrik\"],\"date\":\"17\\/03\"},{\"names\":[\"Gergely\",\" Katinka\"],\"date\":\"09\\/05\"},{\"names\":[\"Gergely\"],\"date\":\"12\\/03\"},{\"names\":[\"Genovéva\",\" Benjámin\",\" Dzsenifer\"],\"date\":\"03\\/01\"},{\"names\":[\"Gellért\",\" Mercédesz\"],\"date\":\"24\\/09\"},{\"names\":[\"Gedeon\",\" Johanna\"],\"date\":\"28\\/03\"},{\"names\":[\"Gedeon\"],\"date\":\"10\\/10\"},{\"names\":[\"Gabriella\"],\"date\":\"12\\/12\"},{\"names\":[\"Fülöp\",\" Jakab\",\" Zsaklin\"],\"date\":\"01\\/05\"},{\"names\":[\"Fülöp\",\" Evelin\"],\"date\":\"26\\/05\"},{\"names\":[\"Félix\"],\"date\":\"09\\/06\"},{\"names\":[\"Fábián\",\" Sebestyén\"],\"date\":\"20\\/01\"},{\"names\":[\"Fruzsina\",\" Bazil\"],\"date\":\"01\\/01\"},{\"names\":[\"Frigyes\"],\"date\":\"18\\/07\"},{\"names\":[\"Friderika\"],\"date\":\"20\\/09\"},{\"names\":[\"Franciska\",\" Fanni\"],\"date\":\"09\\/03\"},{\"names\":[\"Ferenc\"],\"date\":\"11\\/05\"},{\"names\":[\"Ferenc\"],\"date\":\"04\\/10\"},{\"names\":[\"Ferenc\"],\"date\":\"03\\/12\"},{\"names\":[\"Fatime\",\" Fatima\"],\"date\":\"05\\/06\"},{\"names\":[\"Farkas\"],\"date\":\"31\\/10\"},{\"names\":[\"Eugénia\"],\"date\":\"25\\/12\"},{\"names\":[\"Eufrozina\",\" Kende\"],\"date\":\"25\\/09\"},{\"names\":[\"Etelka\",\" Aletta\"],\"date\":\"16\\/12\"},{\"names\":[\"Eszter\",\" Eliza\",\" Vanessza\"],\"date\":\"24\\/05\"},{\"names\":[\"Erzsébet\"],\"date\":\"19\\/11\"},{\"names\":[\"Ervin\"],\"date\":\"26\\/04\"},{\"names\":[\"Ernő Tatjána\"],\"date\":\"12\\/01\"},{\"names\":[\"Erika\",\" Bella\"],\"date\":\"31\\/08\"},{\"names\":[\"Erik\",\" Alexandra\"],\"date\":\"18\\/05\"},{\"names\":[\"Erhard\"],\"date\":\"09\\/04\"},{\"names\":[\"Enikő\",\" Melitta\"],\"date\":\"15\\/09\"},{\"names\":[\"Endre\",\" Elek\"],\"date\":\"17\\/07\"},{\"names\":[\"Emőke\"],\"date\":\"23\\/03\"},{\"names\":[\"Emőd\"],\"date\":\"09\\/08\"},{\"names\":[\"Emília\"],\"date\":\"19\\/07\"},{\"names\":[\"Emánuel\"],\"date\":\"26\\/03\"},{\"names\":[\"Emma\"],\"date\":\"19\\/04\"},{\"names\":[\"Emma\"],\"date\":\"24\\/11\"},{\"names\":[\"Emil\",\" Csanád\"],\"date\":\"28\\/05\"},{\"names\":[\"Emese\",\" Sarolta\"],\"date\":\"05\\/07\"},{\"names\":[\"Előd\"],\"date\":\"22\\/10\"},{\"names\":[\"Elza\"],\"date\":\"01\\/12\"},{\"names\":[\"Elvira\"],\"date\":\"10\\/02\"},{\"names\":[\"Ellák\"],\"date\":\"08\\/07\"},{\"names\":[\"Ella\",\" Linda\",\" Levente\"],\"date\":\"13\\/02\"},{\"names\":[\"Eleonóra\",\"Zelmira\"],\"date\":\"21\\/02\"},{\"names\":[\"Elemér\"],\"date\":\"29\\/02\"},{\"names\":[\"Egyed\",\" Egon\"],\"date\":\"01\\/09\"},{\"names\":[\"Edit\"],\"date\":\"16\\/09\"},{\"names\":[\"Edina\"],\"date\":\"27\\/02\"},{\"names\":[\"Dömötör\"],\"date\":\"26\\/10\"},{\"names\":[\"Dénes\"],\"date\":\"08\\/04\"},{\"names\":[\"Dénes\"],\"date\":\"09\\/10\"},{\"names\":[\"Dávid\"],\"date\":\"30\\/12\"},{\"names\":[\"Dániel\",\" Daniella\"],\"date\":\"21\\/07\"},{\"names\":[\"Dorottya\",\" Dóra\"],\"date\":\"06\\/02\"},{\"names\":[\"Donát\"],\"date\":\"17\\/02\"},{\"names\":[\"Domonkos\",\" Dominika\"],\"date\":\"04\\/08\"},{\"names\":[\"Diána\"],\"date\":\"18\\/09\"},{\"names\":[\"Dezső\"],\"date\":\"23\\/05\"},{\"names\":[\"Csongor\"],\"date\":\"16\\/04\"},{\"names\":[\"Csilla\",\" Noémi\"],\"date\":\"22\\/04\"},{\"names\":[\"Csaba\"],\"date\":\"06\\/07\"},{\"names\":[\"Cecília\"],\"date\":\"22\\/11\"},{\"names\":[\"Bódog\"],\"date\":\"14\\/01\"},{\"names\":[\"Béla\"],\"date\":\"23\\/04\"},{\"names\":[\"Bálint\",\" Valentin\"],\"date\":\"14\\/02\"},{\"names\":[\"Bulcsú\"],\"date\":\"04\\/06\"},{\"names\":[\"Buda\",\" Richárd\"],\"date\":\"03\\/04\"},{\"names\":[\"Brúnó\",\" Renáta\"],\"date\":\"06\\/10\"},{\"names\":[\"Brigitta\"],\"date\":\"11\\/10\"},{\"names\":[\"Borbála\",\" Barbara\"],\"date\":\"04\\/12\"},{\"names\":[\"Bonifác\"],\"date\":\"14\\/05\"},{\"names\":[\"Boldizsár\"],\"date\":\"06\\/01\"},{\"names\":[\"Boglárka\",\"Nimród\"],\"date\":\"01\\/08\"},{\"names\":[\"Blanka\",\" Bianka\"],\"date\":\"25\\/10\"},{\"names\":[\"Beáta\",\" Izolda\",\" Lea\"],\"date\":\"22\\/03\"},{\"names\":[\"Bertold\",\" Marietta\"],\"date\":\"11\\/02\"},{\"names\":[\"Bertalan\"],\"date\":\"24\\/08\"},{\"names\":[\"Berta\",\" Bettina\"],\"date\":\"06\\/08\"},{\"names\":[\"Bernát\",\" Felícia\"],\"date\":\"20\\/05\"},{\"names\":[\"Bernadett\"],\"date\":\"18\\/02\"},{\"names\":[\"Benedek\"],\"date\":\"21\\/03\"},{\"names\":[\"Bence\"],\"date\":\"23\\/08\"},{\"names\":[\"Beatrix\",\" Erna\"],\"date\":\"29\\/08\"},{\"names\":[\"Barnabás\"],\"date\":\"11\\/06\"},{\"names\":[\"Balázs\"],\"date\":\"03\\/02\"},{\"names\":[\"Aurél\"],\"date\":\"05\\/10\"},{\"names\":[\"Auguszta\"],\"date\":\"29\\/03\"},{\"names\":[\"Auguszta\"],\"date\":\"18\\/12\"},{\"names\":[\"Attila\",\" Ramóna\"],\"date\":\"07\\/01\"},{\"names\":[\"Arnold\",\" Levente\"],\"date\":\"18\\/06\"},{\"names\":[\"Aranka\"],\"date\":\"08\\/02\"},{\"names\":[\"Apollónia\"],\"date\":\"07\\/07\"},{\"names\":[\"Antal\",\" Antónia\"],\"date\":\"17\\/01\"},{\"names\":[\"Antal\",\" Anett\"],\"date\":\"13\\/06\"},{\"names\":[\"Anna\",\" Anikó\"],\"date\":\"26\\/07\"},{\"names\":[\"Angéla\",\" Petronella\"],\"date\":\"31\\/05\"},{\"names\":[\"Angelika\"],\"date\":\"27\\/01\"},{\"names\":[\"András\",\" Andor\"],\"date\":\"30\\/11\"},{\"names\":[\"Andrea\",\" Ilma\"],\"date\":\"18\\/04\"},{\"names\":[\"Anasztázia\",\" Tas\"],\"date\":\"15\\/04\"},{\"names\":[\"Amália\",\" Bekény\"],\"date\":\"07\\/10\"},{\"names\":[\"Amália\"],\"date\":\"10\\/07\"},{\"names\":[\"Ambrus\"],\"date\":\"07\\/12\"},{\"names\":[\"Aliz\"],\"date\":\"14\\/11\"},{\"names\":[\"Alfréd\"],\"date\":\"23\\/02\"},{\"names\":[\"Alfonz\"],\"date\":\"30\\/10\"},{\"names\":[\"Albin\"],\"date\":\"01\\/03\"},{\"names\":[\"Albert\",\" Lipót\"],\"date\":\"15\\/11\"},{\"names\":[\"Alajos\",\" Leila\"],\"date\":\"21\\/06\"},{\"names\":[\"Aladár\",\" Álmos\"],\"date\":\"20\\/02\"},{\"names\":[\"Adél\"],\"date\":\"29\\/01\"},{\"names\":[\"Adorján\",\" Adrián\"],\"date\":\"05\\/03\"},{\"names\":[\"Adalbert\"],\"date\":\"27\\/09\"},{\"names\":[\"Achilles\"],\"date\":\"02\\/11\"},{\"names\":[\"Abigél\",\" Alex\"],\"date\":\"09\\/02\"}]}\n"
  },
  {
    "path": "android_mobile/src/main/res/raw/it_namedays.json",
    "content": "{\"data\":[{\"names\":[\"Concordio\",\"Telemaco\",\"Fulgenzio\",\"Fulgenzia\"],\"date\":\"01/01\"},{\"names\":[\"Basilio\",\"Adelardo\",\"Macario\",\"Odilone\",\"Adalardo\",\"Basileo\"],\"date\":\"02/01\"},{\"names\":[\"Genoveffa\",\"Genevieve\"],\"date\":\"03/01\"},{\"names\":[\"Elsa\",\"Benedicta\",\"Benedetta\"],\"date\":\"04/01\"},{\"names\":[\"Giocondo\",\"Amelio\",\"Amelia\",\"Astolfo\",\"Emiliana\"],\"date\":\"05/01\"},{\"names\":[\"Melchiorre\",\"Gaspare\",\"Raffaella\"],\"date\":\"06/01\"},{\"names\":[\"Luciano\",\"Mariateresa\",\"Crispino\"],\"date\":\"07/01\"},{\"names\":[\"Erardo\"],\"date\":\"08/01\"},{\"names\":[\"Giuliano\",\"Alexia\",\"Alessia\"],\"date\":\"9/01\"},{\"names\":[\"Domizia\",\"Domizio\",\"Aldo\",\"Consalvo\",\"Gonzalo\",\"Domiziana\",\"Domiziano\",\"Domitilla\"],\"date\":\"10/01\"},{\"names\":[\"Igino\",\"Teodosio\",\"Onorata\",\"Ortensio\"],\"date\":\"11/01\"},{\"names\":[\"Tatiana\",\"Modesto\",\"Modestino\",\"Arcadio\",\"Modestina\",\"Modesta\",\"Tania\",\"Cesarina\",\"Cesira\"],\"date\":\"12/01\"},{\"names\":[\"Ilario\",\"Liana\",\"Eliana\",\"Eliano\"],\"date\":\"13/01\"},{\"names\":[\"Dacio\",\"Felice\",\"Felicita\",\"Bianca\",\"Blanca\",\"Dacia\"],\"date\":\"14/01\"},{\"names\":[\"Abaco\",\"Efisio\",\"Mauro\",\"Ida\",\"Ido\"],\"date\":\"15/01\"},{\"names\":[\"Accursio\",\"Liberata\",\"Marcello\",\"Berardo\"],\"date\":\"16/01\"},{\"names\":[\"Jole\",\"Diodoro\",\"Nada\",\"Alba\",\"Tony\",\"Nadia\",\"Antero\",\"Iole\",\"Antonio\",\"Yole\",\"Marcantonio\",\"Antongiulio\",\"Antonello\",\"Nadine\",\"Ioli\"],\"date\":\"17/01\"},{\"names\":[\"Bice\",\"Carlotta\",\"Fazio\",\"Beatriz\",\"Beatrice\",\"Prisca\",\"Charlotte\",\"Priscilla\"],\"date\":\"18/01\"},{\"names\":[\"Mario\",\"Pia\",\"Mariapia\"],\"date\":\"19/01\"},{\"names\":[\"Fabiana\",\"Fabiano\",\"Sebastiano\",\"Esmeralda\",\"Sebastiana\",\"Sebastian\"],\"date\":\"20/01\"},{\"names\":[\"Aggie\",\"Agnese\",\"Pina\",\"Giuseppina\",\"Patroclo\",\"Giuseppa\",\"Ines\"],\"date\":\"21/01\"},{\"names\":[\"Gaudenzio\",\"Vincent\",\"Domenico\",\"Linda\",\"Teodolinda\",\"Vincenzo\",\"Dominique\"],\"date\":\"22/01\"},{\"names\":[\"Armando\",\"Durante\",\"Armanda\",\"Messalina\"],\"date\":\"23/01\"},{\"names\":[\"Artemio\",\"Vero\",\"Feliciana\",\"Metello\",\"Vera\",\"Feliciano\",\"Veriana\",\"Senia\",\"Xenia\",\"Babila\"],\"date\":\"24/01\"},{\"names\":[\"Artemia\",\"Agape\",\"Saul\"],\"date\":\"25/01\"},{\"names\":[\"Alberica\",\"Alberico\",\"Timoteo\",\"Timotea\",\"Tito\",\"Annapaola\",\"Mariapaola\",\"Paola\",\"Paula\"],\"date\":\"26/01\"},{\"names\":[\"Devota\",\"Elvira\",\"Mariangela\",\"Palladio\"],\"date\":\"27/01\"},{\"names\":[\"Thomas\",\"Amedea\",\"Manfredo\",\"Tommaso\",\"Amadeus\",\"Amedeo\",\"Manfredi\"],\"date\":\"28/01\"},{\"names\":[\"Sabrina\",\"Gildo\",\"Aquilino\",\"Gilda\",\"Costanzo\"],\"date\":\"29/01\"},{\"names\":[\"Giacinta\",\"Martina\",\"Pellegrino\",\"Batilda\"],\"date\":\"30/01\"},{\"names\":[\"Marcella\",\"Saverio\",\"Lodovica\",\"Ludovica\",\"Saveria\",\"Cira\",\"Ciro\"],\"date\":\"31/01\"},{\"names\":[\"Brigida\",\"Severo\",\"Severiano\",\"Severa\",\"Severina\",\"Verdiana\",\"Veridiana\",\"Severino\",\"Orso\",\"Brigitta\"],\"date\":\"01/02\"},{\"names\":[\"Sabatino\",\"Candela\",\"Sabatina\"],\"date\":\"02/02\"},{\"names\":[\"Adelino\",\"Ofelio\",\"Sempronio\",\"Ofelia\",\"Biagio\",\"Oscar\"],\"date\":\"03/02\"},{\"names\":[\"Magno\",\"Gilberta\",\"Gilberto\"],\"date\":\"04/02\"},{\"names\":[\"Agata\",\"Alison\",\"Alice\",\"Agato\",\"Heidi\",\"Agatha\",\"Alyssa\"],\"date\":\"05/02\"},{\"names\":[\"Giraldo\",\"Geraldo\",\"Gerald\",\"Geraldine\",\"Dorotea\",\"Amanda\",\"Fedora\",\"Gastone\",\"Guerrino\"],\"date\":\"06/02\"},{\"names\":[\"Giuliana\"],\"date\":\"07/02\"},{\"names\":[\"Giacoma\",\"Giacomina\",\"Gerolamo\",\"Ronan\",\"Rainaldo\",\"Ronald\",\"Rinaldo\",\"Apollonia\"],\"date\":\"08/02\"},{\"names\":[\"Bill\",\"William\",\"Guillaume\",\"Guglielmo\",\"Indro\"],\"date\":\"10/02\"},{\"names\":[\"Dante\",\"Samuel\",\"Lourdes\"],\"date\":\"11/02\"},{\"names\":[\"Eulalia\",\"Costante\"],\"date\":\"12/02\"},{\"names\":[\"Maura\",\"Fosca\"],\"date\":\"13/02\"},{\"names\":[\"Apollonio\",\"Valentino\",\"Fiorentino\",\"Cirillo\"],\"date\":\"14/02\"},{\"names\":[\"Giorgia\",\"Sigfrido\"],\"date\":\"15/02\"},{\"names\":[\"Samuele\",\"Sam\",\"Maruta\",\"Onesto\"],\"date\":\"16/02\"},{\"names\":[\"Flaviano\"],\"date\":\"17/02\"},{\"names\":[\"Claudio\",\"Cynthia\",\"Artemisia\",\"Artemisa\",\"Cinzia\",\"Cindy\",\"Cuzia\"],\"date\":\"18/02\"},{\"names\":[\"Corradina\",\"Kurt\",\"Alvaro\",\"Tullio\",\"Gabino\",\"Konrad\",\"Publio\",\"Corrado\"],\"date\":\"19/02\"},{\"names\":[\"Eleuterio\"],\"date\":\"20/02\"},{\"names\":[\"Eleonora\",\"Eleanor\"],\"date\":\"21/02\"},{\"names\":[\"Ariosto\",\"Greta\"],\"date\":\"22/02\"},{\"names\":[\"Liviana\",\"Livia\",\"Livio\",\"Milo\",\"Romina\",\"Romana\"],\"date\":\"23/02\"},{\"names\":[\"Fiorentina\",\"Edilberto\"],\"date\":\"24/02\"},{\"names\":[\"Romeo\"],\"date\":\"25/02\"},{\"names\":[\"Cornelio\",\"Connie\"],\"date\":\"26/02\"},{\"names\":[\"Leandro\",\"Antigono\",\"Antigone\",\"Onorina\",\"Aleandro\",\"Aleandra\"],\"date\":\"27/02\"},{\"names\":[\"Antonia\",\"Antonietta\",\"Antonella\",\"Mariantonia\",\"Antoinette\"],\"date\":\"28/02\"},{\"names\":[\"Silvo\",\"Lionel\",\"Silvio\",\"Albino\"],\"date\":\"01/03\"},{\"names\":[\"Delinda\",\"Ulrico\",\"Gennara\"],\"date\":\"02/03\"},{\"names\":[\"Tiziana\",\"Tiziano\",\"Camelia\",\"Innocenzo\",\"Cunegonda\"],\"date\":\"03/03\"},{\"names\":[\"Casimiro\",\"Nestore\",\"Casimira\"],\"date\":\"04/03\"},{\"names\":[\"Lucio\",\"Adriana\",\"Adrienne\",\"Adriano\"],\"date\":\"05/03\"},{\"names\":[\"Ezio\",\"Saturno\",\"Saturnino\"],\"date\":\"06/03\"},{\"names\":[\"Perpetua\"],\"date\":\"07/03\"},{\"names\":[\"Ponzio\",\"Beata\"],\"date\":\"08/03\"},{\"names\":[\"Francisca\",\"Francesca\",\"Paciano\"],\"date\":\"9/03\"},{\"names\":[\"Gaio\",\"Crescente\"],\"date\":\"10/03\"},{\"names\":[\"Costantino\",\"Ramiro\"],\"date\":\"11/03\"},{\"names\":[\"Aureliano\",\"Maxime\"],\"date\":\"12/03\"},{\"names\":[\"Letizia\",\"Eufrasia\",\"Fedele\",\"Salomone\",\"Rodrigo\"],\"date\":\"13/03\"},{\"names\":[\"Matilde\"],\"date\":\"14/03\"},{\"names\":[\"Lucrezio\",\"Allison\",\"Lucrezia\",\"Tranquillo\",\"Lulù\",\"Zaccaria\",\"Marialuisa\",\"Luisa\",\"Annaluisa\"],\"date\":\"15/03\"},{\"names\":[\"Natalino\",\"Abramio\",\"Tatiano\",\"Agapito\",\"Natale\",\"Eriberto\",\"Ariberto\"],\"date\":\"16/03\"},{\"names\":[\"Patrizio\",\"Patrick\"],\"date\":\"17/03\"},{\"names\":[\"Salvatore\",\"Turiddu\",\"Salvatrice\",\"Cristiano\",\"Christian\"],\"date\":\"18/03\"},{\"names\":[\"José\",\"Quinzio\",\"Quintino\",\"Sibilla\",\"Pino\",\"Giuseppe\",\"Quinto\",\"Quintiliano\"],\"date\":\"19/03\"},{\"names\":[\"Sandra\",\"Alessandra\",\"Sandy\",\"Alexandra\",\"Claudia\"],\"date\":\"20/03\"},{\"names\":[\"Giustiniano\"],\"date\":\"21/03\"},{\"names\":[\"Lea\",\"Nilde\",\"Benvenuto\",\"Pasqua\"],\"date\":\"22/03\"},{\"names\":[\"Attilia\"],\"date\":\"24/03\"},{\"names\":[\"Nunzia\",\"Annunziata\",\"Nunziata\",\"Ave\"],\"date\":\"25/03\"},{\"names\":[\"Emanuele\",\"Manolo\"],\"date\":\"26/03\"},{\"names\":[\"Augusta\",\"Mareta\",\"Arcibaldo\"],\"date\":\"27/03\"},{\"names\":[\"Doroteo\"],\"date\":\"28/03\"},{\"names\":[\"Secondo\",\"Seconda\"],\"date\":\"29/03\"},{\"names\":[\"Decimo\",\"Decio\",\"Regolo\"],\"date\":\"30/03\"},{\"names\":[\"Beniamino\",\"Amos\",\"Beniamina\",\"Benjamin\",\"Cornelia\"],\"date\":\"31/03\"},{\"names\":[\"Irina\",\"Dora\",\"Ugo\",\"Bartolomea\",\"Irene\"],\"date\":\"01/04\"},{\"names\":[\"Irmina\",\"Abbondio\",\"Isacco\",\"Isotta\",\"Selene\",\"Egizia\",\"Urbano\",\"Miriam\",\"Teodosia\",\"Ginevra\",\"Igina\"],\"date\":\"02/04\"},{\"names\":[\"Farah\",\"Fara\",\"Ricky\",\"Richard\",\"Rick\",\"Riccardo\"],\"date\":\"03/04\"},{\"names\":[\"Isidoro\",\"Isidro\",\"Platone\"],\"date\":\"04/04\"},{\"names\":[\"Diogene\"],\"date\":\"05/04\"},{\"names\":[\"Celestina\",\"Prudenzio\",\"Celine\",\"Celestino\"],\"date\":\"06/04\"},{\"names\":[\"Ermanno\",\"Ermanna\",\"Randolfo\",\"Hermann\"],\"date\":\"07/04\"},{\"names\":[\"Dionigi\",\"Macaria\"],\"date\":\"08/04\"},{\"names\":[\"Tancredi\",\"Cleo\",\"Cleofe\",\"Ilda\"],\"date\":\"9/04\"},{\"names\":[\"Ezechiele\"],\"date\":\"10/04\"},{\"names\":[\"Angelo\",\"Angel\",\"Stanislao\"],\"date\":\"11/04\"},{\"names\":[\"Alfiero\",\"Saba\",\"Zeno\",\"Zenone\",\"Jules\",\"Giulio\"],\"date\":\"12/04\"},{\"names\":[\"Marzio\"],\"date\":\"13/04\"},{\"names\":[\"Ermenegildo\"],\"date\":\"14/04\"},{\"names\":[\"Prisco\",\"Anastasia\",\"Annibale\"],\"date\":\"15/04\"},{\"names\":[\"Lamberto\",\"Gioacchino\",\"Mariagrazia\",\"Bernadette\",\"Giovacchino\",\"Annagrazia\",\"Bernadetta\",\"Grazia\",\"Graziella\"],\"date\":\"16/04\"},{\"names\":[\"Isidora\",\"Vanda\",\"Aniceto\",\"Arcangelo\",\"Wanda\"],\"date\":\"17/04\"},{\"names\":[\"Galdino\"],\"date\":\"18/04\"},{\"names\":[\"Emma\"],\"date\":\"19/04\"},{\"names\":[\"Sarah\",\"Adalgisa\",\"Sara\",\"Saro\",\"Odetta\",\"Ildegonda\",\"Sally\"],\"date\":\"20/04\"},{\"names\":[\"Anselmo\",\"Anselma\",\"Caio\"],\"date\":\"21/04\"},{\"names\":[\"Leonida\",\"Virginio\",\"Muzio\",\"Nora\"],\"date\":\"22/04\"},{\"names\":[\"Adalberta\",\"Adalberto\",\"Juri\",\"Yuri\",\"Norina\",\"Geordie\",\"Giorgio\"],\"date\":\"23/04\"},{\"names\":[\"Ivo\",\"Iva\",\"Ivetta\",\"Tiberio\",\"Melissa\",\"Vilfredo\"],\"date\":\"24/04\"},{\"names\":[\"Doda\",\"Erminio\",\"Marco\",\"Franca\",\"Gianmarco\",\"Baldassarre\",\"Giammarco\",\"Mark\"],\"date\":\"25/04\"},{\"names\":[\"Alida\",\"Anacleto\"],\"date\":\"26/04\"},{\"names\":[\"Antima\",\"Antimo\",\"Zita\"],\"date\":\"27/04\"},{\"names\":[\"Valeria\",\"Valeriana\",\"Pierluigi\"],\"date\":\"28/04\"},{\"names\":[\"Katia\",\"Katiuscia\",\"Catia\",\"Kate\",\"Catherine\",\"Caterina\",\"Katherine\",\"Rina\"],\"date\":\"29/04\"},{\"names\":[\"Rosamunda\",\"Lodovico\",\"Pio\"],\"date\":\"30/04\"},{\"names\":[\"Achille\",\"Amatrice\",\"Alfio\",\"Orenzio\",\"Amatore\",\"Nella\",\"Vivaldo\",\"Sigismondo\",\"Eufemio\"],\"date\":\"01/05\"},{\"names\":[\"Flaminio\",\"Zoe\",\"Flaminia\",\"Celeste\"],\"date\":\"02/05\"},{\"names\":[\"Viola\",\"Violet\",\"Violetta\"],\"date\":\"03/05\"},{\"names\":[\"Floriano\",\"Fulvio\",\"Fulvia\",\"Porfirio\"],\"date\":\"04/05\"},{\"names\":[\"Leo\",\"Tosca\",\"Nunzio\",\"Penelope\",\"Gottardo\"],\"date\":\"05/05\"},{\"names\":[\"Violante\",\"Annarosa\",\"Prudenzia\"],\"date\":\"06/05\"},{\"names\":[\"Virginia\",\"Augusto\",\"Flavia\"],\"date\":\"07/05\"},{\"names\":[\"Diletta\",\"Dionisio\",\"Désirée\",\"Vittore\",\"Norma\",\"Bonifacio\",\"Generoso\",\"Agazio\"],\"date\":\"08/05\"},{\"names\":[\"Beato\",\"Luminosa\",\"Carrie\",\"Carola\",\"Carla\",\"Carolina\"],\"date\":\"9/05\"},{\"names\":[\"Solange\",\"Giobbe\",\"Cataldo\"],\"date\":\"10/05\"},{\"names\":[\"Fabia\",\"Stella\",\"Velia\",\"Fabio\",\"Gandolfo\",\"Velio\"],\"date\":\"11/05\"},{\"names\":[\"Nereo\",\"Danio\",\"Brancaleone\",\"Dania\",\"Nerina\",\"Nerino\",\"Pancrazio\",\"Imelda\"],\"date\":\"12/05\"},{\"names\":[\"Fatima\",\"Gherardo\",\"Mael\",\"Maelle\",\"Maela\"],\"date\":\"13/05\"},{\"names\":[\"Corinna\",\"Mattia\",\"Ampelio\",\"Gemma\",\"Corinne\",\"Cora\"],\"date\":\"14/05\"},{\"names\":[\"Dionisia\",\"Denise\",\"Torquato\",\"Cassio\"],\"date\":\"15/05\"},{\"names\":[\"Adamo\",\"Onorato\",\"Teobaldo\",\"Margherita\",\"Massima\",\"Ubalda\",\"Margaret\",\"Adam\",\"Daisy\",\"Ubaldo\",\"Margot\"],\"date\":\"16/05\"},{\"names\":[\"Basilia\",\"Pasquale\",\"Basilea\"],\"date\":\"17/05\"},{\"names\":[\"Luciana\",\"Erika\",\"Eric\",\"Erica\",\"Venanzio\",\"Erico\"],\"date\":\"18/05\"},{\"names\":[\"Ivone\",\"Giselda\",\"Gisella\"],\"date\":\"19/05\"},{\"names\":[\"Anastasio\"],\"date\":\"20/05\"},{\"names\":[\"Vittorio\",\"Adalrico\",\"Giselle\"],\"date\":\"21/05\"},{\"names\":[\"Umile\",\"Giulia\",\"Annarita\",\"Rita\"],\"date\":\"22/05\"},{\"names\":[\"Desiderio\",\"Desiderato\",\"Desideria\",\"Desiderata\"],\"date\":\"23/05\"},{\"names\":[\"Albano\"],\"date\":\"24/05\"},{\"names\":[\"Adelma\",\"Adelmo\",\"Zenobio\",\"Orietta\"],\"date\":\"25/05\"},{\"names\":[\"Philippe\",\"Phil\",\"Filippo\",\"Felipe\",\"Pippo\"],\"date\":\"26/05\"},{\"names\":[\"Oliviera\",\"Oliviero\",\"Oliver\"],\"date\":\"27/05\"},{\"names\":[\"Emilio\",\"Priamo\"],\"date\":\"28/05\"},{\"names\":[\"Hernando\",\"Ferdinando\",\"Ferdinanda\",\"Pierferdinando\",\"Jenny\",\"Jane\",\"Giovanna\"],\"date\":\"30/05\"},{\"names\":[\"Battistina\",\"Petronia\",\"Leonbattista\",\"Battista\",\"Petronilla\"],\"date\":\"31/05\"},{\"names\":[\"Justin\",\"Lia\",\"Ermenegilda\",\"Graziano\",\"Panfilo\",\"Graziana\"],\"date\":\"01/06\"},{\"names\":[\"Fosco\",\"Foscolo\",\"Consuelo\",\"Alcibiade\",\"Emilia\",\"Amy\",\"Erasmo\",\"Emily\",\"Elmo\",\"Elma\"],\"date\":\"02/06\"},{\"names\":[\"Kevin\",\"Ovidio\",\"Clotilde\"],\"date\":\"03/06\"},{\"names\":[\"Isabella\",\"Rutilo\",\"Isabello\",\"Quirino\"],\"date\":\"04/06\"},{\"names\":[\"Walt\",\"Walter\",\"Fernando\",\"Fernanda\",\"Gualtiero\",\"Igor\",\"Valter\"],\"date\":\"05/06\"},{\"names\":[\"Norberto\"],\"date\":\"06/06\"},{\"names\":[\"Landolfo\"],\"date\":\"07/06\"},{\"names\":[\"Dolcelino\"],\"date\":\"08/06\"},{\"names\":[\"Efrem\",\"Primo\"],\"date\":\"9/06\"},{\"names\":[\"Diana\",\"Oliva\",\"Olivo\",\"Uliva\",\"Ulivo\",\"Ulivia\",\"Ulivio\",\"Olivio\",\"Olivia\",\"Onofrio\",\"Ghita\"],\"date\":\"10/06\"},{\"names\":[\"Fermo\",\"Barnaba\"],\"date\":\"11/06\"},{\"names\":[\"Anthony\"],\"date\":\"13/06\"},{\"names\":[\"Rosmunda\",\"Valery\",\"Valerio\",\"Valeriano\",\"Eliseo\",\"Elisea\"],\"date\":\"14/06\"},{\"names\":[\"Gautiero\",\"Enrichetta\",\"Tristano\",\"Enrica\",\"Vito\",\"Gianvito\",\"Germana\"],\"date\":\"15/06\"},{\"names\":[\"Quirico\",\"Ferruccio\",\"Giuditta\"],\"date\":\"16/06\"},{\"names\":[\"Jeremy\",\"Adolphe\",\"Adolfo\",\"Neri\",\"Ranieri\",\"Manuele\",\"Manuel\",\"Manuela\",\"Geremia\"],\"date\":\"17/06\"},{\"names\":[\"Marinella\",\"Marinetta\",\"Marina\",\"Medardo\",\"Osanna\",\"Calogero\",\"Calogera\"],\"date\":\"18/06\"},{\"names\":[\"Gervaso\",\"Romoaldo\",\"Gervasia\",\"Gervasa\",\"Gervasio\",\"Colmazio\",\"Protasio\",\"Romualdo\"],\"date\":\"19/06\"},{\"names\":[\"Ettore\",\"Benigna\",\"Consolata\"],\"date\":\"20/06\"},{\"names\":[\"Gino\",\"Lo\",\"Luigi\",\"Marzia\",\"Ralph\",\"Gigi\",\"Raoul\",\"Demetria\",\"Demetra\"],\"date\":\"21/06\"},{\"names\":[\"Eberardo\",\"Flavio\"],\"date\":\"22/06\"},{\"names\":[\"Lanfranco\",\"Agrippina\",\"Audrey\",\"Zena\"],\"date\":\"23/06\"},{\"names\":[\"Ivan\",\"Giampaolo\",\"Evan\",\"Giovanni\",\"Eros\",\"Gianpiero\",\"John\",\"Johnny\",\"Giovanbattista\",\"Hank\",\"Giampiero\",\"Gianbattista\",\"Hans\",\"Gianpaolo\",\"Giambattista\"],\"date\":\"24/06\"},{\"names\":[\"Massimo\",\"Eraldo\",\"Max\",\"Massimiliano\",\"Prospero\"],\"date\":\"25/06\"},{\"names\":[\"Deodato\",\"Adeodato\",\"Lisa\",\"Adalisa\"],\"date\":\"26/06\"},{\"names\":[\"Sansone\",\"Ladislao\",\"Tosco\",\"Lelio\"],\"date\":\"27/06\"},{\"names\":[\"Attilio\",\"Vincenza\",\"Ireneo\",\"Eraclide\",\"Plutarco\"],\"date\":\"28/06\"},{\"names\":[\"Paolo\",\"Pierangelo\",\"Piera\",\"Pierluca\",\"Pierpaolo\",\"Pierdavide\",\"Piersilvio\",\"Pierre\",\"Gianpietro\",\"Pietra\",\"Giampietro\",\"Pietro\",\"Piero\",\"Pablo\",\"Pedro\"],\"date\":\"29/06\"},{\"names\":[\"Ottone\"],\"date\":\"30/06\"},{\"names\":[\"Divo\",\"Esterina\",\"Ester\",\"Arsenio\",\"Aaron\",\"Aronne\",\"Preziosa\"],\"date\":\"01/07\"},{\"names\":[\"Santo\",\"Grace\",\"Sante\"],\"date\":\"02/07\"},{\"names\":[\"Bessie\",\"Elisabetta\",\"Ulderico\",\"Piergiorgio\",\"Betta\",\"Berta\"],\"date\":\"04/07\"},{\"names\":[\"Filomena\"],\"date\":\"05/07\"},{\"names\":[\"Isaia\",\"Domenica\",\"Romolo\"],\"date\":\"06/07\"},{\"names\":[\"Edgardo\",\"Palmiro\",\"Palmira\",\"Edgar\",\"Illuminato\"],\"date\":\"08/07\"},{\"names\":[\"Carmine\",\"Floriana\",\"Anatolia\",\"Veronica\",\"Veronico\",\"Abbondanza\"],\"date\":\"9/07\"},{\"names\":[\"Rufino\",\"Michelangelo\"],\"date\":\"10/07\"},{\"names\":[\"Benedetto\",\"Betto\",\"Savino\",\"Amabile\",\"Bennet\",\"Olga\"],\"date\":\"11/07\"},{\"names\":[\"Jason\",\"Giasone\"],\"date\":\"12/07\"},{\"names\":[\"Jacopo\",\"Enrico\",\"Hal\",\"Gioele\",\"Ezra\",\"Esdra\"],\"date\":\"13/07\"},{\"names\":[\"Camillo\"],\"date\":\"14/07\"},{\"names\":[\"Rossana\",\"Terenzio\",\"Amerigo\",\"Pierangela\",\"Angela\",\"Vladimiro\",\"Ventura\",\"Donald\",\"Atanasio\",\"Bonaventura\",\"Annamaria\",\"Michelangela\",\"Rosangela\",\"Giacobbe\",\"Angelina\",\"Terence\",\"Rolando\"],\"date\":\"15/07\"},{\"names\":[\"Carmelo\",\"Carmen\",\"Carmela\"],\"date\":\"16/07\"},{\"names\":[\"Acillino\",\"Alessio\",\"Teodata\",\"Generosa\"],\"date\":\"17/07\"},{\"names\":[\"Federico\",\"Federica\"],\"date\":\"18/07\"},{\"names\":[\"Mila\",\"Giusta\",\"Giustina\"],\"date\":\"19/07\"},{\"names\":[\"Elia\",\"Geronimo\",\"Elijah\"],\"date\":\"20/07\"},{\"names\":[\"Daniele\",\"Danilo\",\"Daniel\"],\"date\":\"21/07\"},{\"names\":[\"Magda\",\"Maddalena\",\"Amore\",\"Mariamaddalena\",\"Menelao\"],\"date\":\"22/07\"},{\"names\":[\"Romola\",\"Vanna\",\"Apollinare\"],\"date\":\"23/07\"},{\"names\":[\"Mariacristina\",\"Christel\",\"Cristel\",\"Cecilio\",\"Christine\",\"Cristina\"],\"date\":\"24/07\"},{\"names\":[\"Lapo\",\"Tea\",\"James\",\"Valentina\",\"Jim\",\"Jamie\",\"Jago\",\"Jacob\",\"Teo\",\"Santiago\",\"Thiago\",\"Tiago\",\"Giacomo\",\"Iacopo\",\"Cristoforo\"],\"date\":\"25/07\"},{\"names\":[\"Anika\",\"Valente\",\"Anna\",\"Camille\",\"Annalisa\",\"Annachiara\",\"Luisanna\",\"Camilla\",\"Nancy\"],\"date\":\"26/07\"},{\"names\":[\"Natascia\",\"Natasha\",\"Venere\",\"Asia\",\"Natalia\",\"Arnold\",\"Arnaldo\",\"Venera\",\"Pantaleone\",\"Natalie\"],\"date\":\"27/07\"},{\"names\":[\"Nazario\"],\"date\":\"28/07\"},{\"names\":[\"Marta\",\"Olaf\",\"Lupo\"],\"date\":\"29/07\"},{\"names\":[\"Abdone\",\"Abdon\"],\"date\":\"30/07\"},{\"names\":[\"Daniela\",\"Calimero\",\"Danila\",\"Germano\",\"Alfonsa\",\"Ignazio\",\"Danielle\",\"Democrito\",\"Ignazia\"],\"date\":\"31/07\"},{\"names\":[\"Ruben\",\"Alphonse\",\"Speranza\",\"Esperanza\",\"Alfonso\",\"Fede\",\"Mariastella\",\"Maristella\"],\"date\":\"01/08\"},{\"names\":[\"Alfreda\"],\"date\":\"02/08\"},{\"names\":[\"Dalmazio\",\"Lidia\",\"Lida\",\"Lido\",\"Mara\",\"Nicodemo\",\"Lidio\"],\"date\":\"03/08\"},{\"names\":[\"Gianmaria\",\"Agabio\",\"Cherubino\"],\"date\":\"04/08\"},{\"names\":[\"Abele\",\"Abel\",\"Cecco\",\"Checco\",\"Nives\",\"Osvaldo\",\"Paride\",\"Emidio\",\"Emidia\"],\"date\":\"05/08\"},{\"names\":[\"Donato\",\"Mafalda\",\"Gaetana\",\"Gaetano\",\"Afra\",\"Afro\",\"Donatello\"],\"date\":\"07/08\"},{\"names\":[\"Ciriaco\"],\"date\":\"08/08\"},{\"names\":[\"Romano\",\"Sergia\"],\"date\":\"9/08\"},{\"names\":[\"Loris\",\"Lorenzo\",\"Renzo\",\"Lawrence\",\"Larry\"],\"date\":\"10/08\"},{\"names\":[\"Rufina\",\"Degna\",\"Lelia\",\"Clara\",\"Clarissa\",\"Albachiara\",\"Susanna\",\"Claire\",\"Clarabella\",\"Mariachiara\",\"Chiara\",\"Susan\"],\"date\":\"11/08\"},{\"names\":[\"Ercolina\",\"Ercole\",\"Colombo\"],\"date\":\"12/08\"},{\"names\":[\"Concordia\",\"Ippolito\"],\"date\":\"13/08\"},{\"names\":[\"Alfred\",\"Atanasia\",\"Alfredo\"],\"date\":\"14/08\"},{\"names\":[\"Achiropita\",\"Napoleone\",\"Arduino\",\"Assunta\",\"Assunto\",\"Catena\",\"Paloma\"],\"date\":\"15/08\"},{\"names\":[\"Ruth\",\"Serena\",\"Rocky\",\"Petra\",\"Rocco\"],\"date\":\"16/08\"},{\"names\":[\"Liberato\",\"Settimo\",\"Carole\",\"Giacinto\"],\"date\":\"17/08\"},{\"names\":[\"Aimone\",\"Elena\",\"Helena\",\"Ellen\",\"Helen\"],\"date\":\"18/08\"},{\"names\":[\"Mariano\",\"Italia\",\"Italo\",\"Bertolfo\"],\"date\":\"19/08\"},{\"names\":[\"Filiberto\",\"Filiberta\",\"Bernardo\",\"Bernardino\"],\"date\":\"20/08\"},{\"names\":[\"Malvina\",\"Baldwin\",\"Baldovino\"],\"date\":\"21/08\"},{\"names\":[\"Aldobrando\",\"Fabrizio\",\"Fabrizia\",\"Ildebrando\",\"Incoronata\"],\"date\":\"22/08\"},{\"names\":[\"Minerva\",\"Roso\",\"Novella\",\"Rosella\",\"Rosalba\",\"Benito\",\"Albarosa\",\"Rosanna\",\"Rose\",\"Mariarosa\",\"Rosita\",\"Rosa\"],\"date\":\"23/08\"},{\"names\":[\"Tolomeo\",\"Anita\",\"Barthelemy\",\"Michelle\",\"Oria\",\"Michela\",\"Bartolomeo\",\"Bartolo\",\"Orio\"],\"date\":\"24/08\"},{\"names\":[\"Ludovico\",\"Ebe\",\"Erminia\",\"Genesio\",\"Patrizia\",\"Patricia\",\"Clodoveo\"],\"date\":\"25/08\"},{\"names\":[\"Sasha\",\"Alex\",\"Sandro\",\"Alejandro\",\"Alexander\",\"Alessandro\",\"Oronzo\"],\"date\":\"26/08\"},{\"names\":[\"Monica\"],\"date\":\"27/08\"},{\"names\":[\"Agostino\",\"Ermete\",\"Ermes\",\"Viviano\",\"Adelina\",\"Gioacchina\",\"Alina\"],\"date\":\"28/08\"},{\"names\":[\"Adelfo\",\"Sabino\",\"Sabina\"],\"date\":\"29/08\"},{\"names\":[\"Gaudenzia\",\"Pammacchio\"],\"date\":\"30/08\"},{\"names\":[\"Aida\",\"Aidano\",\"Raimundo\",\"Ramona\",\"Raimonda\",\"Vala\",\"Aristide\",\"Bonagiunta\",\"Raimondo\",\"Remondo\"],\"date\":\"31/08\"},{\"names\":[\"Abigail\",\"Egidio\",\"Giosué\"],\"date\":\"01/09\"},{\"names\":[\"Gianfranco\",\"Ottaviano\",\"Ingrid\"],\"date\":\"02/09\"},{\"names\":[\"Febe\",\"Phoebe\",\"Marino\",\"Gregory\",\"Clelia\",\"Gregorio\"],\"date\":\"03/09\"},{\"names\":[\"Dina\",\"Mosé\",\"Scipione\",\"Prospera\",\"Rosalia\"],\"date\":\"04/09\"},{\"names\":[\"Giordana\",\"Gentile\",\"Jordan\",\"Berto\",\"Giordano\"],\"date\":\"05/09\"},{\"names\":[\"Leto\",\"Lieto\",\"Lieta\",\"Umberto\",\"Eva\"],\"date\":\"06/09\"},{\"names\":[\"Cara\",\"Guido\",\"Regina\"],\"date\":\"07/09\"},{\"names\":[\"Addolorata\",\"Sergio\",\"Alain\",\"Serafina\",\"Bellina\"],\"date\":\"08/09\"},{\"names\":[\"Omero\",\"Homer\",\"Beltramo\"],\"date\":\"9/09\"},{\"names\":[\"Salvo\",\"Candice\",\"Jader\",\"Candida\"],\"date\":\"10/09\"},{\"names\":[\"Almiro\"],\"date\":\"11/09\"},{\"names\":[\"Maria\",\"Mariana\",\"Marusca\",\"Maruska\",\"Marilena\",\"Mariella\",\"Pierfranco\",\"Mariantonietta\",\"Franco\",\"Mariasole\"],\"date\":\"12/09\"},{\"names\":[\"Amato\",\"Maurilio\"],\"date\":\"13/09\"},{\"names\":[\"Santina\",\"Santa\",\"Croce\",\"Crescenzio\"],\"date\":\"14/09\"},{\"names\":[\"Dolores\",\"Luce\",\"Melita\",\"Melitina\",\"Orlando\",\"Annaluce\",\"Baldo\",\"Dolly\"],\"date\":\"15/09\"},{\"names\":[\"Abbondanzio\",\"Dolce\",\"Editta\",\"Eufemia\",\"Innocenza\",\"Ludmilla\",\"Cipriano\"],\"date\":\"16/09\"},{\"names\":[\"Rupert\",\"Ruperto\",\"Roberta\",\"Robert\",\"Colomba\",\"Roberto\"],\"date\":\"17/09\"},{\"names\":[\"Eustorgio\",\"Arianna\",\"Riccarda\",\"Arianne\"],\"date\":\"18/09\"},{\"names\":[\"Elio\",\"Guglielmina\",\"Wilma\",\"Vilma\",\"Guglielma\",\"Costanza\",\"Gennaro\"],\"date\":\"19/09\"},{\"names\":[\"Felipa\",\"Eustachio\",\"Eustachia\",\"Filippa\",\"Fausta\",\"Giancarlo\"],\"date\":\"20/09\"},{\"names\":[\"Iona\",\"Maffeo\",\"Matteo\",\"Giona\",\"Bernarda\",\"Matthew\"],\"date\":\"21/09\"},{\"names\":[\"Silvana\",\"Silvano\",\"Mauricio\",\"Tazio\",\"Maurizio\",\"Maurizia\",\"Maurice\"],\"date\":\"22/09\"},{\"names\":[\"Libero\",\"Lina\",\"Lino\",\"Tecla\",\"Rebecca\"],\"date\":\"23/09\"},{\"names\":[\"Amata\",\"Mercede\",\"Mercedes\",\"Pacifico\"],\"date\":\"24/09\"},{\"names\":[\"Aurelia\"],\"date\":\"25/09\"},{\"names\":[\"Damiana\",\"Cosimo\",\"Cosima\",\"Damiano\",\"Eusebio\",\"Cosmo\"],\"date\":\"26/09\"},{\"names\":[\"Fidenzio\"],\"date\":\"27/09\"},{\"names\":[\"Amalio\",\"Amalia\",\"Venceslao\"],\"date\":\"28/09\"},{\"names\":[\"Alarico\",\"Mike\",\"Michele\",\"Gabriella\",\"Raffaello\",\"Gabriel\",\"Gabriele\",\"Michael\"],\"date\":\"29/09\"},{\"names\":[\"Sonia\",\"Sofia\",\"Dino\",\"Diodata\",\"Onorino\",\"Rino\",\"Girolamo\",\"Onorio\",\"Sophie\",\"Rachele\"],\"date\":\"30/09\"},{\"names\":[\"Remigia\",\"Remigio\"],\"date\":\"01/10\"},{\"names\":[\"Berengario\"],\"date\":\"02/10\"},{\"names\":[\"Candido\"],\"date\":\"03/10\"},{\"names\":[\"Fanny\",\"Francis\",\"Edwin\",\"Francesco\",\"Berenice\",\"Gianfrancesco\",\"Pierfrancesco\",\"Petronio\"],\"date\":\"04/10\"},{\"names\":[\"Attila\",\"Felicia\",\"Tullia\",\"Flaviana\"],\"date\":\"05/10\"},{\"names\":[\"Bruno\",\"Alberta\"],\"date\":\"06/10\"},{\"names\":[\"Rosarmosario\",\"Adelca\",\"Adelchi\",\"Mariarosaria\",\"Adalgiso\",\"Bacco\",\"Rosaria\",\"Rosario\"],\"date\":\"07/10\"},{\"names\":[\"Ivano\",\"Bridget\",\"Taide\",\"Lorella\",\"Onesta\",\"Ivana\",\"Lorenza\",\"Porzia\"],\"date\":\"08/10\"},{\"names\":[\"Abramo\",\"Abraham\",\"Denis\"],\"date\":\"9/10\"},{\"names\":[\"Dana\",\"Alderico\"],\"date\":\"10/10\"},{\"names\":[\"Soledad\",\"Emanuela\",\"Placida\",\"Folco\",\"Placido\",\"Manola\"],\"date\":\"11/10\"},{\"names\":[\"Amica\",\"Serafino\",\"Amico\",\"Amone\",\"Valfredo\",\"Pilar\"],\"date\":\"12/10\"},{\"names\":[\"Edoardo\",\"Eduardo\",\"Edoarda\",\"Ugolino\",\"Edward\"],\"date\":\"13/10\"},{\"names\":[\"Wendy\",\"Fortunata\",\"Callisto\",\"Guendalina\",\"Guenda\"],\"date\":\"14/10\"},{\"names\":[\"Therese\",\"Ruggero\",\"Edda\",\"Teresa\",\"Tessa\",\"Gordon\"],\"date\":\"15/10\"},{\"names\":[\"Edvige\"],\"date\":\"16/10\"},{\"names\":[\"Gina\",\"Eloisa\",\"Marisa\",\"Rudy\",\"Marissa\",\"Luigia\",\"Rudolph\",\"Rodolfo\"],\"date\":\"17/10\"},{\"names\":[\"Luke\",\"Luca\"],\"date\":\"18/10\"},{\"names\":[\"Laura\",\"Loretta\",\"Annalaura\",\"Marialaura\",\"Cleopatra\"],\"date\":\"19/10\"},{\"names\":[\"Aurora\"],\"date\":\"20/10\"},{\"names\":[\"Dasio\",\"Ursula\",\"Celina\",\"Clementina\",\"Zaira\",\"Bertoldo\",\"Orsola\",\"Artemisio\",\"Clemenzia\"],\"date\":\"21/10\"},{\"names\":[\"Salomè\",\"Apollo\"],\"date\":\"22/10\"},{\"names\":[\"Manlio\"],\"date\":\"23/10\"},{\"names\":[\"Raffaele\"],\"date\":\"24/10\"},{\"names\":[\"Tabita\",\"Gavino\",\"Daria\"],\"date\":\"25/10\"},{\"names\":[\"Evaristo\"],\"date\":\"26/10\"},{\"names\":[\"Fiorenzo\"],\"date\":\"27/10\"},{\"names\":[\"Giuda\",\"Simone\",\"Taddeo\",\"Simeona\",\"Simeone\",\"Simona\",\"Simonetta\",\"Simon\",\"Cirilla\"],\"date\":\"28/10\"},{\"names\":[\"Ermelinda\",\"Narciso\",\"Eusebia\",\"Cordelia\"],\"date\":\"29/10\"},{\"names\":[\"Benvenuta\",\"Gerardo\"],\"date\":\"30/10\"},{\"names\":[\"Lucilla\",\"Wolfango\",\"Volfango\"],\"date\":\"31/10\"},{\"names\":[\"Iride\",\"Acilia\",\"Elvino\",\"Fiordalisa\",\"Fiordaliso\",\"Rossella\",\"Furia\",\"Abelardo\",\"Erode\",\"Adeodata\",\"Frido\",\"Deanna\",\"Adorata\",\"Debora\",\"Bruto\",\"Brunilde\",\"Acilio\",\"Jessica\",\"Acrisio\",\"Delio\",\"Guelfo\",\"Gianluigi\",\"Griselda\",\"Brandon\",\"Deodata\",\"Lara\",\"Solidea\",\"Soave\",\"Lavinia\",\"Diamante\",\"Ansalda\",\"Marika\",\"Diletto\",\"Addis\",\"Learco\",\"Elvia\",\"Adelgardo\",\"Leda\",\"Adelgarda\",\"Douglas\",\"Glenda\",\"Doug\",\"Ademaro\",\"Maddox\",\"Semiramide\",\"Gianmario\",\"Adorato\",\"Bambino\",\"Elba\",\"Ilva\",\"Maila\",\"Branda\",\"Ilvo\",\"Larissa\",\"Lilia\",\"Loreno\",\"Imera\",\"Agrippa\",\"Doriana\",\"Imerio\",\"Doris\",\"April\",\"Duccio\",\"Samantha\",\"Avril\",\"Duilio\",\"Mirco\",\"Lorena\",\"Gwyneth\",\"Luana\",\"Alceo\",\"Tamara\",\"Leonilda\",\"Alceste\",\"Tarquinia\",\"Alcide\",\"Curzia\",\"Egisto\",\"Aleardo\",\"Egle\",\"Luna\",\"Aleramo\",\"Elda\",\"Olmo\",\"Eletta\",\"Maia\",\"Elettra\",\"Delia\",\"Dalia\",\"Karim\",\"Doriano\",\"Ariel\",\"Alighiero\",\"Tina\",\"Allegra\",\"Ella\",\"Tino\",\"Alma\",\"Altea\",\"Elvia\",\"Marianna\",\"Tizio\",\"Alwin\",\"Marica\",\"Mirta\",\"Alvise\",\"Mirtilla\",\"Elvio\",\"Zilla\",\"Amadeo\",\"Liam\",\"Ennio\",\"Chloe\",\"Nemo\",\"Enza\",\"Turi\",\"Enzo\",\"Debra\",\"Dexter\",\"Ambra\",\"Ulisse\",\"Plinio\",\"Marlon\",\"Pandora\",\"Amilcare\",\"Medoro\",\"Muriel\",\"Amina\",\"Uriele\",\"Nausicaa\",\"Amintore\",\"Tacito\",\"Teseo\",\"Ersilia\",\"Tisbe\",\"Mia\",\"Vanessa\",\"Iris\",\"Vasco\",\"Euclide\",\"Milena\",\"Ancilla\",\"Mimma\",\"Mimmo\",\"Mina\",\"Mimi\",\"Andromaca\",\"Miranda\",\"Robin\",\"Andromeda\",\"Mirella\",\"Samanta\",\"Euridice\",\"Sacha\",\"Rocio\",\"Mirko\",\"Peleo\",\"Sem\",\"Moira\",\"Wally\",\"Annabella\",\"Evandro\",\"Vinicio\",\"Werther\",\"Polifemo\",\"Morena\",\"Ansaldo\",\"Perseo\",\"Cody\",\"Antenore\",\"Licia\",\"Saffo\",\"Brooke\",\"Gionata\",\"Jess\",\"Sveva\",\"Sapiente\",\"Neera\",\"Astrid\",\"Marilyn\",\"Arabella\",\"Nelsa\",\"Lavinio\",\"Mary\",\"Liliana\",\"Archimede\",\"Zelia\",\"Vespasiano\",\"Oriella\",\"Zebedeo\",\"Chora\",\"Viliberto\",\"Zelinda\",\"Nelson\",\"Aristodemo\",\"Mohammed\",\"Joy\",\"Aristotele\",\"Barak\",\"Fiammetta\",\"Bino\",\"Barack\",\"Armida\",\"Hilary\",\"Aroldo\",\"Hillary\",\"Nuccia\",\"Fiamma\",\"Ascanio\",\"Ruby\",\"Zara\",\"Brenno\",\"Olindo\",\"Ryana\",\"Zarina\",\"Olinto\",\"Yara\",\"Nike\",\"Naike\",\"Omar\",\"Ombretta\",\"Amber\",\"Azzurra\",\"Ondina\",\"Furio\",\"Skyler\",\"Gaia\",\"Orazio\",\"Galatea\",\"Orchidea\",\"Tarquinio\",\"Zelda\",\"Lori\",\"Galileo\",\"Orfeo\",\"Oriana\",\"Uranio\",\"Ornella\",\"Leila\",\"Medea\",\"Gelsomina\",\"Ortensia\",\"Micol\",\"Otello\",\"Aladino\",\"Belinda\",\"Selvaggia\",\"Scarlett\",\"Ryan\",\"Pamela\",\"Neide\",\"Moreno\",\"Meredith\",\"Bambina\",\"Lincoln\",\"Giada\",\"Araldo\",\"Jasmine\",\"Rubina\",\"Gianluca\",\"Agamennone\",\"Gianni\",\"Gigliola\",\"Ali\",\"Amaltea\",\"Suri\",\"Dorian\",\"Ardito\",\"Pericle\",\"Perla\",\"Asdrubale\",\"Frida\",\"Athos\",\"Edith\",\"Adina\",\"Maya\",\"Gioia\",\"Selina\",\"Azeglio\",\"Sole\",\"Cassandra\",\"Jennifer\",\"Brando\",\"Azelio\",\"Alviero\",\"Ariele\",\"Kimberley\",\"Bonaldo\",\"Chantal\",\"Cino\",\"Glauco\",\"Caino\",\"Arlene\",\"Gloria\",\"Proserpina\",\"Godiva\",\"Ahmad\",\"Caronte\",\"Delizia\",\"Golia\",\"Elide\",\"Catullo\",\"Fleano\",\"Vania\",\"Fleana\",\"Giove\",\"Cristaldo\",\"Cristalda\",\"Giliola\",\"Icaro\",\"Bella\",\"Ivanoe\",\"Cloe\",\"Clorinda\",\"Nathan\",\"Idea\",\"Estella\",\"Abelarda\",\"Diocleziano\",\"Tara\",\"Jesse\",\"Damocle\",\"Jessie\",\"Coriolano\",\"Argo\",\"Clio\",\"Ileana\",\"Dalida\",\"Dakota\",\"Cosetta\",\"Ilenia\",\"Desdemona\",\"Olinda\",\"Sharon\",\"Olinta\",\"Guia\",\"Yari\",\"Clizia\",\"Romilda\",\"Jonathan\",\"Egeo\",\"Clint\",\"Egea\",\"Cupido\",\"Sean\",\"Esaù\",\"Curzio\",\"Ippocrate\",\"Bradley\",\"Malika\",\"Shirley\",\"Malik\",\"Dafne\"],\"date\":\"01/11\"},{\"names\":[\"Tobias\",\"Tobia\"],\"date\":\"02/11\"},{\"names\":[\"Dalila\",\"Silvia\",\"Uberto\",\"Giusto\",\"Giustino\"],\"date\":\"03/11\"},{\"names\":[\"Amauri\",\"Vitale\",\"Arrigo\",\"Carlos\",\"Charles\",\"Charlie\",\"Carlo\",\"Carletto\",\"Chiaro\",\"Charlize\"],\"date\":\"04/11\"},{\"names\":[\"Elisa\",\"Galeazzo\"],\"date\":\"05/11\"},{\"names\":[\"Leonardo\",\"Melanio\"],\"date\":\"06/11\"},{\"names\":[\"Amaranto\",\"Amaranta\",\"Urania\",\"Ernesto\",\"Carina\",\"Ercolano\"],\"date\":\"07/11\"},{\"names\":[\"Diodato\",\"Goffredo\",\"Quarto\"],\"date\":\"08/11\"},{\"names\":[\"Teodoro\"],\"date\":\"9/11\"},{\"names\":[\"Leone\",\"Ninfa\",\"Fiorenza\",\"Leon\",\"Florence\"],\"date\":\"10/11\"},{\"names\":[\"Martino\"],\"date\":\"11/11\"},{\"names\":[\"Diego\",\"Renee\",\"Renato\",\"Aurelio\",\"Renata\"],\"date\":\"12/11\"},{\"names\":[\"Agostina\"],\"date\":\"13/11\"},{\"names\":[\"Veneranda\",\"Venerando\",\"Filomeno\"],\"date\":\"14/11\"},{\"names\":[\"Leopoldo\",\"Albert\",\"Alberto\",\"Enea\",\"Arthur\",\"Ulberto\",\"Arturo\"],\"date\":\"15/11\"},{\"names\":[\"Elpidia\",\"Gertrude\",\"Geltrude\",\"Elpidio\"],\"date\":\"16/11\"},{\"names\":[\"Eugenio\",\"Gene\"],\"date\":\"17/11\"},{\"names\":[\"Noah\",\"Oddo\",\"Odilia\",\"Ottilia\",\"Otto\",\"Frediano\",\"Noè\",\"Frediana\",\"Alda\"],\"date\":\"18/11\"},{\"names\":[\"Fausto\"],\"date\":\"19/11\"},{\"names\":[\"Edmonda\",\"Edmondo\",\"Ottavio\",\"Benigno\",\"Ottavia\"],\"date\":\"20/11\"},{\"names\":[\"Celso\"],\"date\":\"21/11\"},{\"names\":[\"Sissy\",\"Sheila\",\"Ernestina\",\"Cecilia\",\"Cecily\",\"Ernesta\"],\"date\":\"22/11\"},{\"names\":[\"Adelasio\",\"Adelasia\",\"Adelinda\",\"Clemente\"],\"date\":\"23/11\"},{\"names\":[\"Loriana\",\"Flora\"],\"date\":\"24/11\"},{\"names\":[\"Gioconda\",\"Mercurio\",\"Alan\"],\"date\":\"25/11\"},{\"names\":[\"Delfino\",\"Bellino\",\"Bello\"],\"date\":\"26/11\"},{\"names\":[\"Virgilia\",\"Gustavina\",\"Zefiro\",\"Virgilio\",\"Gustavo\"],\"date\":\"27/11\"},{\"names\":[\"Teodora\",\"Socrate\"],\"date\":\"28/11\"},{\"names\":[\"Fedro\",\"Fedra\"],\"date\":\"29/11\"},{\"names\":[\"Andreina\",\"André\",\"Andrea\"],\"date\":\"30/11\"},{\"names\":[\"Bruna\",\"Eligio\"],\"date\":\"01/12\"},{\"names\":[\"Vivienne\",\"Viviana\",\"Evelina\",\"Bibiana\",\"Evelyn\"],\"date\":\"02/12\"},{\"names\":[\"Addo\",\"Isa\",\"Ada\",\"Babel\",\"Barbara\",\"Cirano\"],\"date\":\"04/12\"},{\"names\":[\"Crispina\"],\"date\":\"05/12\"},{\"names\":[\"Terzo\",\"Niccolò\",\"Nico\",\"Nikita\",\"Nicholas\",\"Angelica\",\"Nicola\",\"Niccolò\",\"Nicole\",\"Nicoletta\",\"Fortunato\",\"Klaus\",\"Emiliano\"],\"date\":\"06/12\"},{\"names\":[\"Ambrogia\",\"Ambrogio\",\"Giotto\"],\"date\":\"07/12\"},{\"names\":[\"Conchita\",\"Concetto\",\"Concetta\",\"Immacolata\"],\"date\":\"08/12\"},{\"names\":[\"Siro\",\"Amleto\",\"Sirio\",\"Sira\",\"Siria\",\"Cesare\",\"Cesar\"],\"date\":\"9/12\"},{\"names\":[\"Loredana\",\"Nazzaro\",\"Amanzio\",\"Polidoro\",\"Sidney\",\"Polidora\",\"Nazzareno\",\"Loredano\",\"Boris\"],\"date\":\"10/12\"},{\"names\":[\"Lena\",\"Rosalinda\"],\"date\":\"12/12\"},{\"names\":[\"Lucia\",\"Odile\",\"Antioco\",\"Oreste\",\"Lucy\"],\"date\":\"13/12\"},{\"names\":[\"Pompeo\"],\"date\":\"14/12\"},{\"names\":[\"Nina\",\"Nino\",\"Noemi\",\"Naomi\",\"Crocefissa\",\"Crocifissa\",\"Crocifisso\",\"Crocefisso\",\"Cristiana\"],\"date\":\"15/12\"},{\"names\":[\"Adelaide\",\"Adone\",\"Albina\"],\"date\":\"16/12\"},{\"names\":[\"Lazzaro\",\"Olimpio\",\"Lazzarina\",\"Olimpia\"],\"date\":\"17/12\"},{\"names\":[\"Dario\"],\"date\":\"19/12\"},{\"names\":[\"Temistocle\"],\"date\":\"21/12\"},{\"names\":[\"Demetrio\",\"Spartaco\",\"Dimitri\",\"Remo\"],\"date\":\"22/12\"},{\"names\":[\"Dagoberto\",\"Vittoria\"],\"date\":\"23/12\"},{\"names\":[\"Irma\",\"Adelia\",\"Adelio\",\"Adele\",\"Adeline\"],\"date\":\"24/12\"},{\"names\":[\"Nerea\",\"Belen\",\"Eugenia\"],\"date\":\"25/12\"},{\"names\":[\"Stefania\",\"Stefano\",\"Steven\",\"Steve\",\"Stephen\",\"Stefan\"],\"date\":\"26/12\"},{\"names\":[\"Tiffany\",\"Delfina\",\"Fabiola\"],\"date\":\"27/12\"},{\"names\":[\"Jolanda\",\"Donna\",\"Morgan\",\"Morgana\",\"Innocente\",\"Iolanda\"],\"date\":\"28/12\"},{\"names\":[\"Davide\",\"David\",\"Davino\"],\"date\":\"29/12\"},{\"names\":[\"Raniero\"],\"date\":\"30/12\"},{\"names\":[\"Sylvester\",\"Sesto\",\"Melania\",\"Fiorello\",\"Fiorella\",\"Fioretta\",\"Sisto\",\"Ilary\",\"Fiore\",\"Fioralba\",\"Ilaria\",\"Silvestro\",\"Donata\",\"Donatella\"],\"date\":\"31/12\"}]}\n"
  },
  {
    "path": "android_mobile/src/main/res/raw/lv_ext_namedays.json",
    "content": "{\"data\":[{\"names\":[\"Laimnesis\",\"Solvita\",\"Solvija\",\"Afra\",\"Afrodīte\",\"Agunda\",\"Agurs\",\"Januārija\",\"Laimstars\",\"Soleda\",\"Solita\",\"Solveta\"],\"date\":\"01\\/01\"},{\"names\":[\"Indulis\",\"Ivo\",\"Iva\",\"Ivis\",\"Induls\",\"Īva\",\"Ivaise\",\"Ivija\",\"Īvija\",\"Ivika\",\"Īvis\",\"Ivisa\",\"Ivs\"],\"date\":\"02\\/01\"},{\"names\":[\"Miervaldis\",\"Miervalda\",\"Ringolds\",\"Ambrozijs\",\"Ammonārija\",\"Ammunārija\",\"Mežvaldis\",\"Mieriņš\",\"Miermīlis\",\"Miernesis\",\"Miervalds\",\"Ringla\",\"Ringo\",\"Rinolds\"],\"date\":\"03\\/01\"},{\"names\":[\"Spodra\",\"Ilva\",\"Ilvita\",\"Amina\",\"Amīna\",\"Amirans\",\"Amirs\",\"Blāzma\",\"Ilveta\",\"Ilvis\",\"Spodrīte\"],\"date\":\"04\\/01\"},{\"names\":[\"Sīmanis\",\"Zintis\",\"Amrita\",\"Amunds\",\"Anarita\",\"Saimona\",\"Saimons\",\"Seimanis\",\"Semions\",\"Semjons\",\"Simeons\",\"Simions\",\"Zintauts\",\"Zinturs\"],\"date\":\"05\\/01\"},{\"names\":[\"Spulga\",\"Arnita\",\"Arams\",\"Aranta\",\"Arfa\",\"Arnīda\",\"Arnija\",\"Arnika\"],\"date\":\"06\\/01\"},{\"names\":[\"Rota\",\"Zigmārs\",\"Juliāns\",\"Digmārs\",\"Julians\",\"Jūlians\",\"Jūliāns\",\"Sigmars\",\"Sigmārs\",\"Zigmāra\",\"Zigmāris\",\"Zigmars\"],\"date\":\"07\\/01\"},{\"names\":[\"Gatis\",\"Ivanda\",\"Ants\",\"Aristarhs\",\"Aristida\",\"Aristīda\",\"Aristids\",\"Aristīds\",\"Aristons\",\"Aristrīds\",\"Arjana\",\"Arlands\",\"Arleta\",\"Arlēna\",\"Arlijs\",\"Arlita\",\"Gatiņš\",\"Īvande\",\"Ivanna\",\"Ivase\",\"Ivena\"],\"date\":\"08\\/01\"},{\"names\":[\"Kaspars\",\"Aksels\",\"Alta\",\"Aksela\",\"Akselis\",\"Veiko\",\"Vello\",\"Velonija\"],\"date\":\"09\\/01\"},{\"names\":[\"Tatjana\",\"Dorisa\",\"Doreta\",\"Dorina\",\"Dorita\",\"Tanisa\",\"Tanita\",\"Taņa\"],\"date\":\"10\\/01\"},{\"names\":[\"Smaida\",\"Franciska\",\"Aruns\",\"Arūns\",\"Francisks\",\"Francišeks\",\"Franciška\",\"Frančeska\",\"Frančiska\",\"Františeks\",\"Smaidiņa\",\"Smaidīte\",\"Smaidonis\",\"Smaidra\",\"Smailis\"],\"date\":\"11\\/01\"},{\"names\":[\"Reinis\",\"Reina\",\"Reinholds\",\"Renāts\",\"Anisija\",\"Aņisija\",\"Aņisja\",\"Redženalds\",\"Redžinalds\",\"Reginalds\",\"Regnalds\",\"Regnolds\",\"Reinhards\",\"Reino\",\"Reinolds\",\"Reinvalds\",\"Renalda\",\"Renalds\",\"Renato\",\"Renats\",\"Renolds\",\"Rinats\"],\"date\":\"12\\/01\"},{\"names\":[\"Harijs\",\"Ārijs\",\"Āris\",\"Aira\",\"Airika\",\"Airiks\",\"Airis\",\"Āra\",\"Arends\",\"Ārends\",\"Ārens\",\"Aress\",\"Ariela\",\"Ariels\",\"Arigo\",\"Arijs\",\"Ariko\",\"Ariks\",\"Āriks\",\"Aris\",\"Ariss\",\"Harija\",\"Harina\",\"Haris\",\"Harita\",\"Haritina\"],\"date\":\"13\\/01\"},{\"names\":[\"Roberts\",\"Roberta\",\"Raitis\",\"Raits\",\"Robērs\",\"Robertīne\",\"Roberto\",\"Robija\",\"Robijs\",\"Robina\",\"Robins\"],\"date\":\"14\\/01\"},{\"names\":[\"Fēlikss\",\"Felicita\",\"Asola\",\"Aspazija\",\"Aspāzija\",\"Asunta\",\"Atēna\",\"Feliciana\",\"Feliciāna\",\"Felicianna\",\"Felicians\",\"Felicija\",\"Felīcija\",\"Felicijana\",\"Felicijans\",\"Felicjana\",\"Felikarmena\",\"Felikss\",\"Felīsija\",\"Filicija\"],\"date\":\"15\\/01\"},{\"names\":[\"Lidija\",\"Lida\",\"Avija\",\"Avita\",\"Aviva\",\"Āvo\",\"Gordejs\",\"Līda\",\"Lidita\"],\"date\":\"16\\/01\"},{\"names\":[\"Tenis\",\"Dravis\",\"Denisa\",\"Denise\",\"Deniss\",\"Denīza\",\"Denīze\",\"Deņiss\",\"Dionisijs\",\"Dioniss\",\"Dionizijs\",\"Radions\",\"Rodions\",\"Trofims\"],\"date\":\"17\\/01\"},{\"names\":[\"Antons\",\"Antis\",\"Antonijs\",\"Acons\",\"Antans\",\"Antars\",\"Antonio\",\"Antuans\",\"Antuāns\",\"Ontons\",\"Tonijs\"],\"date\":\"18\\/01\"},{\"names\":[\"Andulis\",\"Alnis\",\"Alna\",\"Alnars\",\"Alnors\",\"Džeida\",\"Džellija\",\"Džozelīna\"],\"date\":\"19\\/01\"},{\"names\":[\"Oļģerts\",\"Orests\",\"Aļģirds\",\"Aļģis\",\"Algarts\",\"Algers\",\"Algirds\",\"Alģirds\",\"Alģirts\",\"Aļģerts\",\"Aļģimants\",\"Aļģirts\",\"Odisejs\",\"Olgerts\",\"Oļģerds\",\"Orfejs\",\"Orīda\"],\"date\":\"20\\/01\"},{\"names\":[\"Agnese\",\"Agnija\",\"Agne\",\"Agna\",\"Agnars\",\"Agnārs\",\"Agnesa\",\"Agnesija\",\"Agneška\",\"Agņeška\",\"Urdze\",\"Urdziņa\"],\"date\":\"21\\/01\"},{\"names\":[\"Austris\",\"Bendžamins\",\"Beneventa\",\"Benija\",\"Benijs\",\"Benjamina\",\"Benjamins\",\"Benjamiņš\",\"Benjāmiņš\",\"Benno\",\"Beno\",\"Benoventa\",\"Bens\"],\"date\":\"22\\/01\"},{\"names\":[\"Grieta\",\"Strauta\",\"Rebeka\",\"Bazils\",\"Bažena\",\"Bekija\",\"Božena\",\"Greisa\",\"Greisija\",\"Greta\",\"Grēta\",\"Grietiņa\",\"Reveka\",\"Straumīte\",\"Vasilijs\",\"Vasīlijs\",\"Vasilika\",\"Vasilisa\",\"Vasils\",\"Virta\"],\"date\":\"23\\/01\"},{\"names\":[\"Krišs\",\"Ksenija\",\"Eglons\",\"Egle\",\"Aksenija\",\"Eglis\",\"Krišus\",\"Ksendija\",\"Ksēnija\"],\"date\":\"24\\/01\"},{\"names\":[\"Zigurds\",\"Sigurds\",\"Sigvards\",\"Berenika\",\"Berils\",\"Berita\",\"Beruta\",\"Boneta\",\"Bonija\",\"Bonijs\",\"Sigorts\",\"Sigurts\",\"Sigvars\",\"Sigvarts\",\"Zigo\",\"Zigonis\",\"Zigurts\",\"Zigvards\"],\"date\":\"25\\/01\"},{\"names\":[\"Ansis\",\"Agnis\",\"Agneta\",\"Agnete\",\"Agneze\",\"Agnēze\",\"Agnita\",\"Hanss\",\"Hanzija\",\"Karps\",\"Polikarps\"],\"date\":\"26\\/01\"},{\"names\":[\"Ilze\",\"Ildze\",\"Izolde\",\"Ilza\",\"Ilzīte\",\"Izolda\",\"Ilāra\",\"Ilards\",\"Ilarija\",\"Ilārija\",\"Ilarijs\",\"Ilārijs\",\"Ilars\",\"Ilārs\",\"Illa\",\"Illarija\",\"Tristans\"],\"date\":\"27\\/01\"},{\"names\":[\"Kārlis\",\"Spodris\",\"Bianka\",\"Čarita\",\"Čārlijs\",\"Čārlzs\",\"Karels\",\"Karolis\",\"Karols\"],\"date\":\"28\\/01\"},{\"names\":[\"Aivars\",\"Valērijs\",\"Aivalds\",\"Aivārs\",\"Bille\",\"Billijs\",\"Bils\",\"Valerians\",\"Valeriāns\",\"Valerijans\",\"Valerijāns\",\"Valerijs\",\"Valerjans\",\"Valerjāns\",\"Velerjans\"],\"date\":\"29\\/01\"},{\"names\":[\"Tīna\",\"Valentīna\",\"Pārsla\",\"Biminita\",\"Binija\",\"Binnija\",\"Bivšaka\",\"Pārsliņa\",\"Stīna\",\"Stīne\",\"Tiāre\",\"Tina\",\"Tīne\",\"Valentija\",\"Valentina\",\"Valentine\",\"Valentīne\",\"Vaļa\"],\"date\":\"30\\/01\"},{\"names\":[\"Tekla\",\"Violeta\",\"Bonaventura\",\"Bonaventūra\",\"Bonaventūrs\",\"Bonoventura\",\"Tikla\",\"Tīksma\",\"Viorika\"],\"date\":\"31\\/01\"},{\"names\":[\"Brigita\",\"Indra\",\"Indars\",\"Indris\",\"Inda\",\"Birgita\",\"Briāna\",\"Bridžeta\",\"Bridžita\",\"Brikena\",\"Brita\",\"Britānija\"],\"date\":\"01\\/02\"},{\"names\":[\"Spīdola\",\"Sonora\",\"Braiens\",\"Braijens\",\"Brains\",\"Randa\",\"Randija\",\"Randolfs\"],\"date\":\"02\\/02\"},{\"names\":[\"Aīda\",\"Ida\",\"Vida\",\"Aida\",\"Aidars\",\"Aidis\",\"Alaida\",\"Cezarija\",\"Cezars\",\"Cēzars\",\"Īda\",\"Ideja\",\"Idilija\",\"Idra\"],\"date\":\"03\\/02\"},{\"names\":[\"Daila\",\"Veronika\",\"Dominiks\",\"Daile\",\"Dome\",\"Domenika\",\"Domeniks\",\"Domija\",\"Dominika\",\"Domuse\",\"Varenika\",\"Varonika\",\"Veranika\",\"Veronija\"],\"date\":\"04\\/02\"},{\"names\":[\"Agate\",\"Selga\",\"Silga\",\"Sinilga\",\"Agafija\",\"Agata\",\"Agāte\",\"Agatons\",\"Seldzis\",\"Seleste\",\"Silja\"],\"date\":\"05\\/02\"},{\"names\":[\"Dace\",\"Dārta\",\"Dora\",\"Dacija\",\"Dacis\",\"Dacīte\",\"Dadzis\",\"Darels\",\"Darens\",\"Darija\",\"Dārija\",\"Dārijs\",\"Darina\",\"Daris\",\"Darja\",\"Dārte\",\"Dorateja\",\"Dore\",\"Dorota\",\"Doroteja\",\"Dorotija\",\"Dorta\",\"Dorte\"],\"date\":\"06\\/02\"},{\"names\":[\"Nelda\",\"Rihards\",\"Ričards\",\"Rišards\",\"Dikijs\",\"Diks\",\"Nilda\",\"Ričijs\",\"Ričs\",\"Riho\",\"Rikarda\",\"Rikardo\",\"Rikijs\",\"Riks\",\"Rišārs\"],\"date\":\"07\\/02\"},{\"names\":[\"Aldona\",\"Česlavs\",\"Aldone\",\"Aldonija\",\"Čelsija\",\"Čereta\",\"Česlava\",\"Čezeta\",\"Dabris\",\"Dafnis\",\"Danko\"],\"date\":\"08\\/02\"},{\"names\":[\"Simona\",\"Apolonija\",\"Apolinarija\",\"Apolinārija\",\"Apolinarijs\",\"Apolinārijs\",\"Apolinars\",\"Apolinārs\",\"Apolons\",\"Debora\",\"Dedze\",\"Deizija\",\"Denora\",\"Deriāna\",\"Destane\",\"Dezija\",\"Dēzija\",\"Raisa\",\"Raisma\",\"Raja\",\"Simone\",\"Simoneta\"],\"date\":\"09\\/02\"},{\"names\":[\"Paulīne\",\"Paula\",\"Jasmīna\",\"Diāra\",\"Dida\",\"Dijs\",\"Dūda\",\"Džasmina\",\"Džasmīna\",\"Džasmīne\",\"Jasmina\",\"Jasmīne\",\"Paļina\",\"Paulamarija\",\"Pauleta\",\"Paulina\",\"Paulīna\",\"Pauline\",\"Pavlina\",\"Pavlīna\",\"Pavlīne\",\"Polianna\",\"Polina\",\"Polīna\",\"Poļina\",\"Sholastika\",\"Sholostika\",\"Skolastika\",\"Skolestika\",\"Skolostika\",\"Žasmīne\"],\"date\":\"10\\/02\"},{\"names\":[\"Laima\",\"Laimdota\",\"Fortunata\",\"Gerasims\",\"Laimiņa\",\"Laimīte\",\"Laimute\"],\"date\":\"11\\/02\"},{\"names\":[\"Karlīna\",\"Līna\",\"Džigunda\",\"Džilda\",\"Džoija\",\"Džoisa\",\"Džoja\",\"Karalina\",\"Karalīna\",\"Karla\",\"Karlina\",\"Karlīne\",\"Karlita\",\"Karola\",\"Karolina\",\"Karolīna\",\"Karolīne\",\"Karulina\",\"Kerija\",\"Kerijs\",\"Kerola\",\"Kerolaina\",\"Kerolaine\",\"Lina\",\"Līne\",\"Lineta\",\"Linija\",\"Linita\",\"Lins\",\"Linus\",\"Linuss\"],\"date\":\"12\\/02\"},{\"names\":[\"Malda\",\"Melita\",\"Džordans\",\"Džordijs\",\"Jordans\",\"Maldiņa\",\"Maldis\",\"Maldonis\",\"Melitina\"],\"date\":\"13\\/02\"},{\"names\":[\"Valentīns\",\"Eberhards\",\"Edla\",\"Edmans\",\"Edmārs\",\"Edna\",\"Eginhards\",\"Egmārs\",\"Egnārs\",\"Valeks\",\"Valentijs\",\"Valentins\",\"Valents\",\"Valtīns\"],\"date\":\"14\\/02\"},{\"names\":[\"Alvils\",\"Olafs\",\"Aloizs\",\"Olavs\",\"Alodija\",\"Aloida\",\"Aloīda\",\"Aloiza\",\"Aloizija\",\"Aloizijs\",\"Aloīzijs\",\"Aloizis\",\"Aloīzs\",\"Alvids\",\"Olands\",\"Olārs\",\"Olavi\",\"Olevs\"],\"date\":\"15\\/02\"},{\"names\":[\"Jūlija\",\"Džuljeta\",\"Džuliana\",\"Džulianna\",\"Džulija\",\"Džūlija\",\"Jūla\",\"Jule\",\"Jūle\",\"Juliana\",\"Juliāna\",\"Jūliana\",\"Jūliāna\",\"Julianija\",\"Julianna\",\"Jūlianna\",\"Julija\",\"Julijana\",\"Jūlijana\",\"Julijanna\",\"Julita\",\"Juļjana\"],\"date\":\"16\\/02\"},{\"names\":[\"Donats\",\"Konstance\",\"Danats\",\"Donalds\",\"Donata\",\"Donāta\",\"Donāte\",\"Donāts\",\"Donna\",\"Donvina\",\"Konstancija\",\"Konstantija\",\"Konstantina\",\"Konstantīna\",\"Konstantīne\",\"Vaino\",\"Veino\"],\"date\":\"17\\/02\"},{\"names\":[\"Kora\",\"Kintija\",\"Cina\",\"Cintija\",\"Ciprians\",\"Ciprijans\",\"Konkordija\",\"Korina\",\"Kuprijans\"],\"date\":\"18\\/02\"},{\"names\":[\"Zane\",\"Zuzanna\",\"Efeja\",\"Eifrozīne\",\"Jefrosinija\",\"Jefrosīnija\",\"Sjuzanna\",\"Sjuzena\",\"Susanna\",\"Suzana\",\"Suzanna\",\"Zana\",\"Zanita\",\"Zanna\",\"Zuzana\",\"Zuze\"],\"date\":\"19\\/02\"},{\"names\":[\"Vitauts\",\"Smuidra\",\"Smuidris\",\"Egberts\",\"Egdijs\",\"Egerts\",\"Egida\",\"Egidijs\",\"Hulda\",\"Smuidrīte\",\"Vijtauts\",\"Vītauts\"],\"date\":\"20\\/02\"},{\"names\":[\"Eleonora\",\"Ariadne\",\"Ariadna\",\"Arialds\",\"Arilds\",\"Eleanora\",\"Elenora\",\"Elionora\",\"Elona\",\"Illi\",\"Illo\",\"Ilo\"],\"date\":\"21\\/02\"},{\"names\":[\"Ārija\",\"Rigonda\",\"Adrians\",\"Adriāna\",\"Adrija\",\"Adriana\",\"Adrianna\",\"Adriāns\",\"Adris\",\"Areta\",\"Aretijs\",\"Arets\",\"Ariana\",\"Ariāna\",\"Arianda\",\"Ariandra\",\"Arianna\",\"Arians\",\"Arida\",\"Arīda\",\"Arija\",\"Arika\",\"Ārika\",\"Arimanda\",\"Arimands\",\"Ārīte\",\"Rigonds\"],\"date\":\"22\\/02\"},{\"names\":[\"Haralds\",\"Almants\",\"Almands\",\"Almonds\",\"Aralda\",\"Aralds\",\"Haralda\",\"Harolds\",\"Herolds\",\"Heronija\"],\"date\":\"23\\/02\"},{\"names\":[\"Diāna\",\"Dina\",\"Dins\",\"Deina\",\"Deinis\",\"Deins\",\"Dēna\",\"Dens\",\"Diana\",\"Diandra\",\"Dianna\",\"Dīna\",\"Dinis\",\"Dino\",\"Dīns\",\"Diona\",\"Dīva\",\"Divja\",\"Dīvs\"],\"date\":\"24\\/02\"},{\"names\":[\"Alma\",\"Annemarija\",\"Almāra\",\"Almars\",\"Almārs\",\"Almīra\",\"Andārta\",\"Annemarija\",\"Ankatrīna\",\"Anlīza\",\"Anlīze\",\"Anlizeta\",\"Anmāra\",\"Anmarija\",\"Annaklāra\",\"Annamarija\",\"Annmarija\",\"Gunmāra\"],\"date\":\"25\\/02\"},{\"names\":[\"Evelīna\",\"Aurēlija\",\"Mētra\",\"Aurelija\",\"Aurelijs\",\"Aurēlijs\",\"Aurels\",\"Elvina\",\"Elvīna\",\"Elvīne\",\"Elvings\",\"Elvins\",\"Elvīns\",\"Evalīna\",\"Evandželīna\",\"Evelina\",\"Eveline\",\"Evelīne\",\"Zoja\"],\"date\":\"26\\/02\"},{\"names\":[\"Līvija\",\"Līva\",\"Andra\",\"Andre\",\"Andrelita\",\"Andreta\",\"Andriana\",\"Andriāna\",\"Andrija\",\"Andrijana\",\"Andrika\",\"Andrita\",\"Andromeda\",\"Liva\",\"Livars\",\"Liveta\",\"Livija\",\"Līvis\",\"Livita\",\"Līvs\"],\"date\":\"27\\/02\"},{\"names\":[\"Skaidrīte\",\"Justs\",\"Skaidra\",\"Eigits\",\"Elārs\",\"Elčins\",\"Justins\",\"Justīns\",\"Skaidre\",\"Skaila\"],\"date\":\"28\\/02\"},{\"names\":[\"–\"],\"date\":\"29\\/02\"},{\"names\":[\"Ivars\",\"Ilgvars\",\"Elda\",\"Eldars\",\"Eldijs\",\"Elektra\",\"Elerts\",\"Igvars\",\"Ilgvalds\",\"Ilgvards\",\"Ilgvaris\",\"Ilgvārs\",\"Ivāra\",\"Ivārs\"],\"date\":\"01\\/03\"},{\"names\":[\"Lavīze\",\"Luīze\",\"Laila\",\"Emeralds\",\"Emerihs\",\"Emeriks\",\"Imre\",\"Laija\",\"Lailita\",\"Lovisa\",\"Luisa\",\"Luise\",\"Luiza\",\"Luīza\",\"Luize\"],\"date\":\"02\\/03\"},{\"names\":[\"Tālis\",\"Tālavs\",\"Marts\",\"Mārts\",\"Riglinda\",\"Rigmora\",\"Rigo\"],\"date\":\"03\\/03\"},{\"names\":[\"Alise\",\"Auce\",\"Enija\",\"Alicija\",\"Alīcija\",\"Alisa\",\"Alīsa\",\"Alīse\",\"Alisija\",\"Alīsija\",\"Alisters\",\"Alsis\",\"Einija\",\"Ena\",\"Enārs\",\"Enda\",\"Endija\",\"Endijs\",\"Endo\",\"Ene\",\"Enia\",\"Enīda\",\"Enijs\",\"Enika\",\"Enina\",\"Enita\",\"Ennata\",\"Ennija\",\"Enno\",\"Ensija\",\"Enta\",\"Envija\",\"Enzo\"],\"date\":\"04\\/03\"},{\"names\":[\"Austra\",\"Aurora\",\"Aura\",\"Aurika\",\"Austrīte\",\"Aušra\",\"Enoks\"],\"date\":\"05\\/03\"},{\"names\":[\"Vents\",\"Centis\",\"Gotfrīds\",\"Censonis\",\"Censons\",\"Centa\",\"Centolla\",\"Centonis\",\"Godfrīds\",\"Godvars\",\"Gotards\",\"Gothards\",\"Gotlība\",\"Ventis\"],\"date\":\"06\\/03\"},{\"names\":[\"Ella\",\"Elmīra\",\"Ellija\",\"Elmira\",\"Eļa\",\"Eļmira\",\"Eridana\",\"Eridāna\",\"Erīda\",\"Erims\",\"Erina\",\"Erīna\",\"Erita\",\"Helmīra\"],\"date\":\"07\\/03\"},{\"names\":[\"Dagmāra\",\"Marga\",\"Margita\",\"Dagita\",\"Dagmara\",\"Dagmars\",\"Dagmārs\",\"Dagrita\",\"Magrita\",\"Margo\"],\"date\":\"08\\/03\"},{\"names\":[\"Ēvalds\",\"Evalds\",\"Ievalds\",\"Ivalds\",\"Filemona\",\"Filgita\",\"Filimona\",\"Filimonija\",\"Filiomena\",\"Filomeja\",\"Filomena\",\"Filumena\",\"Fiļimona\",\"Pilimona\",\"Vilemons\"],\"date\":\"09\\/03\"},{\"names\":[\"Silvija\",\"Laimrota\",\"Liliāna\",\"Laimrita\",\"Lilana\",\"Lili\",\"Liliana\",\"Lilianna\",\"Lilians\",\"Liliāns\",\"Lilijana\",\"Lilinda\",\"Lilioza\",\"Liljana\",\"Lilli\",\"Lilu\",\"Tarass\",\"Zilvija\"],\"date\":\"10\\/03\"},{\"names\":[\"Konstantīns\",\"Agita\",\"Abita\",\"Agika\",\"Agisa\",\"Aģis\",\"Esams\",\"Esēnija\",\"Esija\",\"Jesēnija\",\"Konstantins\"],\"date\":\"11\\/03\"},{\"names\":[\"Aija\",\"Aiva\",\"Aivis\",\"Aivika\",\"Aivils\",\"Aivo\",\"Ajita\",\"Ešlija\",\"Eta\",\"Etele\",\"Etelvīne\",\"Etere\",\"Eteri\",\"Etīna\",\"Etjēns\",\"Etnija\"],\"date\":\"12\\/03\"},{\"names\":[\"Ernests\",\"Balvis\",\"Baldūrs\",\"Erasts\",\"Ernijs\",\"Ernis\",\"Ernsts\",\"Eulalija\",\"Eulālija\",\"Euzebijs\",\"Nesters\",\"Nestors\",\"Nikifors\",\"Ņikifors\"],\"date\":\"13\\/03\"},{\"names\":[\"Matilde\",\"Ulrika\",\"Eventijs\",\"Everika\",\"Evrika\",\"Matilda\",\"Ulrihs\",\"Ulriks\"],\"date\":\"14\\/03\"},{\"names\":[\"Amilda\",\"Amalda\",\"Imalda\",\"Fabians\",\"Fabiāns\",\"Fabijans\",\"Fabijāns\",\"Ima\",\"Imelda\",\"Imula\",\"Inelda\"],\"date\":\"15\\/03\"},{\"names\":[\"Guntis\",\"Guntars\",\"Guntris\",\"Falks\",\"Gaija\",\"Guntārs\",\"Gunts\",\"Gutars\"],\"date\":\"16\\/03\"},{\"names\":[\"Ģertrūde\",\"Gerda\",\"Ferdinands\",\"Ferijs\",\"Fernands\",\"Gerarda\",\"Gerards\",\"Gerds\",\"Gerhards\",\"Gertija\",\"Gertruda\",\"Gertrūda\",\"Gertrude\",\"Gertrūde\",\"Gerts\",\"Ģertruda\",\"Ģertrūda\",\"Ģertrude\",\"Trauta\",\"Trautiņa\",\"Trūde\",\"Trūta\",\"Trūte\",\"Žerārs\"],\"date\":\"17\\/03\"},{\"names\":[\"Ilona\",\"Adelīna\",\"Adelfina\",\"Adelina\",\"Adeļina\",\"Fetna\",\"Ilana\",\"Ilāna\",\"Ilanda\",\"Ilanta\",\"Ileana\",\"Iliana\",\"Ilija\",\"Ilita\",\"Ilonda\",\"Ilone\",\"Ilonija\",\"Ilons\"],\"date\":\"18\\/03\"},{\"names\":[\"Jāzeps\",\"Juzefa\",\"Jāzepa\",\"Jazepata\",\"Jazeps\",\"Jazupata\",\"Jezufata\",\"Jezupata\",\"Jezupate\",\"Jezups\",\"Jēzups\",\"Jozefa\",\"Jozefata\",\"Jozefina\",\"Jozefīna\",\"Jozefine\",\"Jozefīne\",\"Jozefs\",\"Jozs\",\"Juzefata\",\"Juzefate\",\"Juzefina\",\"Juzefīna\",\"Juzefine\",\"Juzefs\",\"Juzepa\",\"Juzepata\",\"Juzepate\",\"Juzufata\",\"Osips\",\"Žozefina\",\"Žozefs\"],\"date\":\"19\\/03\"},{\"names\":[\"Made\",\"Irbe\",\"Fraskita\",\"Frementijs\",\"Fritjofs\",\"Madaļa\"],\"date\":\"20\\/03\"},{\"names\":[\"Una\",\"Unigunde\",\"Dzelme\",\"Benedikts\",\"Benedikta\",\"Abigeila\",\"Dementijs\",\"Demija\",\"Geila\",\"Gelārijs\",\"Kunegunda\",\"Kunigunda\",\"Kuno\",\"Ūma\",\"Ūna\",\"Unigunda\",\"Unija\",\"Unika\",\"Ūnika\",\"Unita\",\"Uno\",\"Venedikts\"],\"date\":\"21\\/03\"},{\"names\":[\"Tamāra\",\"Dziedra\",\"Gabriels\",\"Gabriela\",\"Ciedra\",\"Damars\",\"Damārs\",\"Damians\",\"Damijs\",\"Damirs\",\"Gabija\",\"Gabriēla\",\"Gabriele\",\"Gabriella\",\"Gabriēls\",\"Gavrils\",\"Gedra\",\"Giedra\",\"Ģiedra\",\"Tamara\",\"Tamārs\"],\"date\":\"22\\/03\"},{\"names\":[\"Mirdza\",\"Žanete\",\"Žanna\",\"Džana\",\"Džaneta\",\"Džanete\",\"Džanita\",\"Džeina\",\"Džena\",\"Dženeta\",\"Dženete\",\"Dženifera\",\"Dženita\",\"Džesija\",\"Džesika\",\"Džina\",\"Džīna\",\"Džineta\",\"Džinita\",\"Džoanna\",\"Janeta\",\"Janete\",\"Janita\",\"Janta\",\"Jesija\",\"Žana\",\"Žaneta\",\"Žanija\",\"Žanneta\"],\"date\":\"23\\/03\"},{\"names\":[\"Kazimirs\",\"Izidors\",\"Džeralda\",\"Džeraldīne\",\"Džeralds\",\"Džerijs\",\"Garlībs\",\"Geraldina\",\"Geralds\",\"Izida\",\"Izīda\",\"Kazemirs\",\"Kazimerina\",\"Kazimira\",\"Kazimirina\",\"Kazis\",\"Kazmerina\",\"Kazmers\",\"Kazmirina\",\"Sidars\",\"Sidors\",\"Zidra\"],\"date\":\"24\\/03\"},{\"names\":[\"Māra\",\"Mārīte\",\"Marita\",\"Mare\",\"Geda\",\"Gēda\",\"Gedimins\",\"Gregors\",\"Grigorijs\",\"Grigors\",\"Ģēda\",\"Ģedimins\",\"Mara\",\"Māre\",\"Mareta\",\"Māreta\",\"Mārieta\",\"Marijeta\",\"Mārita\",\"Marite\",\"Marīte\",\"Marjeta\"],\"date\":\"25\\/03\"},{\"names\":[\"Eiženija\",\"Ženija\",\"Dženija\",\"Eižēnija\",\"Eugenija\",\"Eugēnija\",\"Euģenija\",\"Euģēnija\",\"Evgenija\",\"Evgēnija\",\"Evģenija\",\"Evģēnija\",\"Gelija\",\"Gēlija\",\"Gelinta\",\"Žene\",\"Ženijs\"],\"date\":\"26\\/03\"},{\"names\":[\"Gustavs\",\"Gusts\",\"Tālrīts\",\"Genefa\",\"Generoza\",\"Genija\",\"Genita\",\"Gentra\",\"Gerita\",\"Gesta\",\"Saulis\",\"Sauļus\",\"Tālrids\",\"Tālrita\",\"Tālrits\"],\"date\":\"27\\/03\"},{\"names\":[\"Gunta\",\"Ginta\",\"Gunda\",\"Gianeja\",\"Gina\",\"Gineta\",\"Ginita\",\"Gintija\",\"Gonda\",\"Gundija\",\"Gundis\",\"Guntiņa\",\"Ģinta\",\"Igunda\"],\"date\":\"28\\/03\"},{\"names\":[\"Aldonis\",\"Agija\",\"Agejs\",\"Agijs\",\"Aldons\",\"Gilberts\"],\"date\":\"29\\/03\"},{\"names\":[\"Nanija\",\"Ilgmārs\",\"Igmārs\",\"Ignars\",\"Ilgmars\",\"Nana\",\"Nanete\",\"Nannija\",\"Nena\"],\"date\":\"30\\/03\"},{\"names\":[\"Gvido\",\"Atvars\",\"Atstars\",\"Gido\",\"Gidons\",\"Gvida\",\"Gvidālija\",\"Gvidis\",\"Gvidons\",\"Gvineta\"],\"date\":\"31\\/03\"},{\"names\":[\"Dagnis\",\"Dagne\",\"Dagna\",\"Dagnijs\",\"Dagnita\",\"Gizela\",\"Glaima\",\"Glauda\",\"Gledisa\",\"Glenda\",\"Glendija\",\"Glens\",\"Glita\",\"Gvenda\",\"Innocentijs\"],\"date\":\"01\\/04\"},{\"names\":[\"Irmgarde\",\"Gracija\",\"Grācija\",\"Gracijans\",\"Grants\",\"Grānts\",\"Grasilda\",\"Grata\",\"Grats\",\"Gražina\",\"Grizelda\",\"Irmgarda\",\"Irmtrauta\",\"Irmtraute\"],\"date\":\"02\\/04\"},{\"names\":[\"Daira\",\"Dairis\",\"Daiva\",\"Dairita\",\"Daivis\",\"Grineta\",\"Grinete\",\"Grita\"],\"date\":\"03\\/04\"},{\"names\":[\"Valda\",\"Herta\",\"Ārvalda\",\"Ārvalds\",\"Ārvaldis\",\"Arvalda\",\"Arvaldis\",\"Arvalds\",\"Arvaldina\"],\"date\":\"04\\/04\"},{\"names\":[\"Vija\",\"Vidaga\",\"Aivija\",\"Aivijs\",\"Vidaija\",\"Vide\",\"Videga\",\"Vīdega\",\"Vijars\",\"Vijārs\"],\"date\":\"05\\/04\"},{\"names\":[\"Zinta\",\"Vīlips\",\"Filips\",\"Dzinta\",\"Dzīne\",\"Dzintis\",\"Filipina\",\"Fīlips\"],\"date\":\"06\\/04\"},{\"names\":[\"Zina\",\"Zinaīda\",\"Helmuts\",\"Elmo\",\"Elmonds\",\"Elmuts\",\"Helmute\",\"Helmūts\",\"Zena\",\"Zenaida\",\"Zīna\",\"Zinaida\",\"Zinaidis\",\"Zinaids\",\"Zinīda\"],\"date\":\"07\\/04\"},{\"names\":[\"Edgars\",\"Danute\",\"Dana\",\"Dans\",\"Adgars\",\"Dajana\",\"Dane\",\"Daneks\",\"Daneta\",\"Danica\",\"Danida\",\"Danija\",\"Danijs\",\"Danika\",\"Danīna\",\"Danis\",\"Danita\",\"Danna\",\"Danuta\",\"Daņuta\",\"Denija\",\"Denijs\",\"Edgards\",\"Edgārs\"],\"date\":\"08\\/04\"},{\"names\":[\"Valērija\",\"Žubīte\",\"Alla\",\"Allija\",\"Alondra\",\"Aļa\",\"Aļesja\",\"Matrjona\",\"Matrona\",\"Valeriana\",\"Valerianna\",\"Valerija\",\"Valerijana\",\"Valerina\",\"Valerjana\"],\"date\":\"09\\/04\"},{\"names\":[\"Anita\",\"Anitra\",\"Zīle\",\"Annika\",\"Anaita\",\"Aniceta\",\"Anicets\",\"Anija\",\"Anika\",\"Anis\",\"Zīlīte\"],\"date\":\"10\\/04\"},{\"names\":[\"Hermanis\",\"Vilmārs\",\"Ermanis\",\"Ērmanis\",\"Ermans\",\"Ernando\",\"Hermans\",\"Hermunds\",\"Vilmars\"],\"date\":\"11\\/04\"},{\"names\":[\"Jūlijs\",\"Ainis\",\"Julijans\",\"Julijāns\",\"Jūlijans\",\"Julijs\",\"Juliuss\",\"Jūliuss\",\"Juļjans\",\"Juļjāns\"],\"date\":\"12\\/04\"},{\"names\":[\"Egils\",\"Egīls\",\"Nauris\",\"Aigils\",\"Naula\",\"Neila\",\"Neils\",\"Noela\",\"Noels\",\"Nolāns\"],\"date\":\"13\\/04\"},{\"names\":[\"Strauja\",\"Gudrīte\",\"Engelberts\",\"Engelīna\",\"Gudmunds\",\"Gudruna\",\"Sagita\",\"Siguta\",\"Sigute\",\"Zigeta\",\"Zigija\"],\"date\":\"14\\/04\"},{\"names\":[\"Aelita\",\"Gastons\",\"Haida\",\"Haide\",\"Haideja\",\"Hamilkārs\",\"Heidija\",\"Heilija\"],\"date\":\"15\\/04\"},{\"names\":[\"Mintauts\",\"Alfs\",\"Bernadeta\",\"Alfa\",\"Alfejs\",\"Alfija\",\"Alfijs\",\"Bernada\",\"Bernade\",\"Bernāde\",\"Bernadete\",\"Bernadita\",\"Bernadite\",\"Bernadīte\",\"Mindaugs\",\"Mingaile\"],\"date\":\"16\\/04\"},{\"names\":[\"Rūdolfs\",\"Viviāna\",\"Rūdis\",\"Hardija\",\"Hardijs\",\"Hārdijs\",\"Hardis\",\"Harlijs\",\"Harvijs\",\"Kardijs\",\"Rudi\",\"Rudiards\",\"Rudolfs\",\"Viviana\",\"Viviena\",\"Vivjena\"],\"date\":\"17\\/04\"},{\"names\":[\"Laura\",\"Jadviga\",\"Jadvīga\",\"Jadze\",\"Jedviga\",\"Laure\",\"Laurentīna\",\"Laureta\",\"Laurita\"],\"date\":\"18\\/04\"},{\"names\":[\"Vēsma\",\"Fanija\",\"Fani\",\"Fannija\",\"Fēbe\",\"Feja\",\"Felonija\",\"Fenija\",\"Feona\",\"Feonija\",\"Fionija\",\"Flēra\",\"Hēlija\",\"Helijs\",\"Heliodors\",\"Helita\",\"Helju\",\"Hella\",\"Hellija\",\"Helta\",\"Vēsmiņa\"],\"date\":\"19\\/04\"},{\"names\":[\"Mirta\",\"Ziedīte\",\"Bitīte\",\"Flora\",\"Floransa\",\"Florence\",\"Florentija\",\"Florentina\",\"Florentīna\",\"Florentine\",\"Florentīne\",\"Floriana\",\"Florians\",\"Floriāns\",\"Florija\",\"Florijana\",\"Florijans\",\"Florijs\",\"Hendija\",\"Henija\",\"Henisa\",\"Henita\",\"Hennija\",\"Henno\",\"Hiacinta\",\"Jacinta\",\"Orhideja\"],\"date\":\"20\\/04\"},{\"names\":[\"Marģers\",\"Anastasija\",\"Afanasija\",\"Afanasijs\",\"Anastāsija\",\"Anastasijs\",\"Anastāsijs\",\"Anastazija\",\"Anastāzija\",\"Anastazijs\",\"Anastāzijs\",\"Atanazijs\",\"Hera\",\"Hēra\",\"Herenija\",\"Herita\",\"Marģeris\",\"Marģis\",\"Nastasija\",\"Nastja\"],\"date\":\"21\\/04\"},{\"names\":[\"Armands\",\"Armanda\",\"Armando\",\"Armants\",\"Arma\",\"Armass\",\"Hete\",\"Hetija\",\"Hevena\",\"Hevijs\",\"Vadims\"],\"date\":\"22\\/04\"},{\"names\":[\"Jurģis\",\"Juris\",\"Georgs\",\"Džordžs\",\"Georgijs\",\"Irži\",\"Ježijs\",\"Jirgens\",\"Jorgens\",\"Jurands\",\"Juranta\",\"Jureks\",\"Jureta\",\"Jurgita\",\"Jurijs\",\"Jurika\",\"Juriks\",\"Jurita\",\"Žoržs\"],\"date\":\"23\\/04\"},{\"names\":[\"Visvaldis\",\"Nameda\",\"Ritvaldis\",\"Honorads\",\"Honorata\",\"Honoreta\",\"Horsts\",\"Hortenzija\",\"Ortenzija\",\"Ortija\",\"Ritums\",\"Ritvalds\",\"Visvalda\",\"Visvalds\",\"Visvaris\",\"Visvars\"],\"date\":\"24\\/04\"},{\"names\":[\"Līksma\",\"Bārbala\",\"Barbala\",\"Barbola\",\"Borbala\",\"Borbola\",\"Borbula\"],\"date\":\"25\\/04\"},{\"names\":[\"Alīna\",\"Sandris\",\"Rūsiņš\",\"Aliāna\",\"Alina\",\"Aline\",\"Alīne\",\"Alinte\",\"Aļina\",\"Imars\",\"Imārs\",\"Imarts\",\"Sandars\",\"Sanders\",\"Sandrino\",\"Sandro\",\"Sandrs\",\"Sandors\",\"Šandors\"],\"date\":\"26\\/04\"},{\"names\":[\"Tāle\",\"Raimonda\",\"Raina\",\"Klementīne\",\"Ingolfs\",\"Inolds\",\"Klemans\",\"Klemens\",\"Klemenss\",\"Klementijs\",\"Klementina\",\"Klementīna\",\"Klementine\",\"Klementīns\",\"Klements\",\"Klimans\",\"Klimentijs\",\"Klimentina\",\"Klimentīna\",\"Raima\",\"Raimija\",\"Raimona\",\"Rimona\",\"Rimonda\",\"Tāla\"],\"date\":\"27\\/04\"},{\"names\":[\"Gundega\",\"Terēze\",\"Inrigo\",\"Teresa\",\"Terēsa\",\"Terese\",\"Terēse\",\"Teresija\",\"Terēsija\",\"Tereza\",\"Terēza\",\"Tereze\",\"Terezija\",\"Terēzija\",\"Termija\"],\"date\":\"28\\/04\"},{\"names\":[\"Vilnis\",\"Raimonds\",\"Laine\",\"Irta\",\"Iruta\",\"Irute\",\"Laina\",\"Laineta\",\"Lainis\",\"Leina\",\"Leino\",\"Raimis\",\"Raimo\",\"Raimons\",\"Raimunds\",\"Reimo\",\"Rimonds\",\"Rimons\"],\"date\":\"29\\/04\"},{\"names\":[\"Lilija\",\"Liāna\",\"Altairs\",\"Dālija\",\"Elta\",\"Eltons\",\"Isma\",\"Itallo\",\"Italo\",\"Itālo\",\"Lia\",\"Liana\",\"Lianda\",\"Lianta\",\"Līlija\",\"Lilja\",\"Lillija\"],\"date\":\"30\\/04\"},{\"names\":[\"Ziedonis\",\"Izanda\",\"Izaura\",\"Jalmars\",\"Jūtvaldis\",\"Kuzma\",\"Ziednese\",\"Ziedons\",\"Ziedvalda\"],\"date\":\"01\\/05\"},{\"names\":[\"Zigmunds\",\"Sigmunds\",\"Zigismunds\",\"Jaroslava\",\"Jaroslavs\",\"Jeroslavs\",\"Jurate\",\"Jurāte\",\"Jūrāte\",\"Jūris\",\"Sigismunds\",\"Sigizmunds\",\"Sigunds\",\"Zigis\",\"Zigizmunds\",\"Zigmans\",\"Zigmants\",\"Zigmonds\",\"Zigmonts\",\"Zigmunda\",\"Zigmunts\"],\"date\":\"02\\/05\"},{\"names\":[\"Gints\",\"Uvis\",\"Gintis\",\"Ģints\",\"Jella\",\"Jermolajs\",\"Juvents\",\"Juvita\"],\"date\":\"03\\/05\"},{\"names\":[\"Vizbulīte\",\"Viola\",\"Vijolīte\",\"Kaido\",\"Violanda\",\"Violanta\",\"Violenta\",\"Vizbule\",\"Vizbulis\"],\"date\":\"04\\/05\"},{\"names\":[\"Ģirts\",\"Ģederts\",\"Kaliksts\",\"Kalins\",\"Keisija\",\"Keits\",\"Omars\",\"Omārs\",\"Otars\",\"Otārs\",\"Rahmats\",\"Raksana\",\"Rašids\"],\"date\":\"05\\/05\"},{\"names\":[\"Gaidis\",\"Didzis\",\"Didrihs\",\"Didriķis\",\"Didžus\",\"Dīters\",\"Gaidonis\",\"Gaidvars\"],\"date\":\"06\\/05\"},{\"names\":[\"Henriete\",\"Henrijs\",\"Jete\",\"Enriko\",\"Anriete\",\"Domicela\",\"Domicele\",\"Domicelija\",\"Domicella\",\"Donicela\",\"Ennrike\",\"Enrija\",\"Enrijs\",\"Enrika\",\"Enriketa\",\"Enriks\",\"Genrieta\",\"Henrieta\",\"Henrija\",\"Henrita\",\"Jeta\"],\"date\":\"07\\/05\"},{\"names\":[\"Staņislavs\",\"Staņislava\",\"Stefānija\",\"Kasandra\",\"Stanislava\",\"Stanislavs\",\"Stase\",\"Stasija\",\"Stasis\",\"Stasja\",\"Stass\",\"Stefanida\",\"Stefanīda\",\"Stefanija\",\"Stefi\",\"Steisija\",\"Stepanida\",\"Stepanīda\",\"Stepanija\",\"Stepānija\"],\"date\":\"08\\/05\"},{\"names\":[\"Klāvs\",\"Einārs\",\"Ervīns\",\"Eina\",\"Einards\",\"Einars\",\"Einarts\",\"Einis\",\"Eino\",\"Ervids\",\"Ervijs\",\"Ervils\",\"Ervīna\",\"Ervins\",\"Ervis\",\"Ervita\",\"Glafira\",\"Glafīra\",\"Kevins\",\"Klaidis\",\"Klaids\",\"Klāss\",\"Timiāna\",\"Timofejs\",\"Timotejs\",\"Tims\"],\"date\":\"09\\/05\"},{\"names\":[\"Maija\",\"Paija\",\"Keila\",\"Keitlīna\",\"Kelija\",\"Kelina\",\"Kellija\",\"Kenets\",\"Kestutis\",\"Ketlina\",\"Ketlīna\",\"Ķestutis\",\"Ķēstutis\"],\"date\":\"10\\/05\"},{\"names\":[\"Milda\",\"Karmena\",\"Manfreds\",\"Karmene\",\"Kilikeja\",\"Kima\",\"Kimberlija\",\"Kims\",\"Manfrēds\",\"Mildreda\"],\"date\":\"11\\/05\"},{\"names\":[\"Valija\",\"Ināra\",\"Ina\",\"Inārs\",\"Anāra\",\"Anars\",\"Anārs\",\"Īna\",\"Inaida\",\"Inara\",\"Inārija\",\"Inārijs\",\"Inars\",\"Inarta\",\"Inarts\",\"Inatra\",\"Inija\",\"Inna\",\"Innara\",\"Ino\",\"Valijs\",\"Vallija\"],\"date\":\"12\\/05\"},{\"names\":[\"Irēna\",\"Irīna\",\"Ira\",\"Iraīda\",\"Airina\",\"Airīna\",\"Arina\",\"Arīna\",\"Arins\",\"Arīns\",\"Arions\",\"Eirana\",\"Īra\",\"Iraida\",\"Iraidis\",\"Iranda\",\"Irena\",\"Irene\",\"Irēne\",\"Irenejs\",\"Irenijs\",\"Irēnijs\",\"Irija\",\"Īrija\",\"Irina\",\"Irinejs\",\"Ironijs\"],\"date\":\"13\\/05\"},{\"names\":[\"Krišjānis\",\"Elfa\",\"Aivita\",\"Elvita\",\"Elfija\",\"Kristjans\",\"Kristjānis\",\"Krišjāns\"],\"date\":\"14\\/05\"},{\"names\":[\"Sofija\",\"Taiga\",\"Airita\",\"Arita\",\"Airīte\",\"Airlenda\",\"Airtons\",\"Gļebs\",\"Safija\",\"Sofja\",\"Sonāte\",\"Sonija\",\"Sonita\",\"Soņa\",\"Volga\",\"Zofija\",\"Zosja\"],\"date\":\"15\\/05\"},{\"names\":[\"Edvīns\",\"Edijs\",\"Edija\",\"Ediks\",\"Edis\",\"Edvija\",\"Edvijs\",\"Edvīna\",\"Edvīne\",\"Edvins\",\"Kleofa\",\"Kleopatra\",\"Kleotilda\",\"Klodija\",\"Klods\",\"Klotilde\"],\"date\":\"16\\/05\"},{\"names\":[\"Herberts\",\"Dailis\",\"Umberts\",\"Dailonis\",\"Dailons\",\"Deila\",\"Deils\",\"Deja\",\"Erberts\",\"Erhards\",\"Koleta\"],\"date\":\"17\\/05\"},{\"names\":[\"Inese\",\"Inesis\",\"Ēriks\",\"Erihs\",\"Ērihs\",\"Eriks\",\"Ero\",\"Ēro\",\"Ignese\",\"Inesa\",\"Inesīte\",\"Konsuela\",\"Konsuella\",\"Kreigs\"],\"date\":\"18\\/05\"},{\"names\":[\"Lita\",\"Sibilla\",\"Teika\",\"Ksaverija\",\"Ksavērija\",\"Ksaverijs\",\"Ksavērijs\",\"Ksavers\"],\"date\":\"19\\/05\"},{\"names\":[\"Venta\",\"Salvis\",\"Selva\",\"Fadejs\",\"Lada\",\"Ladislavs\",\"Laira\",\"Lala\",\"Salvija\",\"Salvijs\",\"Salvo\",\"Selvijs\",\"Selvins\",\"Selvis\",\"Solvis\",\"Tadeušs\"],\"date\":\"20\\/05\"},{\"names\":[\"Ernestīne\",\"Ingmārs\",\"Akvelīna\",\"Akilina\",\"Akulina\",\"Akuļina\",\"Akvelina\",\"Akvilina\",\"Akvilīna\",\"Avelina\",\"Avelīna\",\"Erneste\",\"Ernestina\",\"Ernestīna\",\"Ernestine\",\"Ingemāra\",\"Ingemars\",\"Ingemārs\",\"Ingmāra\",\"Ingmars\",\"Ingomars\",\"Inmārs\"],\"date\":\"21\\/05\"},{\"names\":[\"Emīlija\"],\"date\":\"22\\/05\"},{\"names\":[\"Leontīne\",\"Leokādija\",\"Lonija\",\"Ligija\",\"Leokadija\",\"Leontija\",\"Leontijs\",\"Leontina\",\"Leontīna\",\"Leontine\",\"Leontins\",\"Leontīns\",\"Levantīna\",\"Līgija\",\"Ligindra\",\"Lone\",\"Lonita\",\"Lonnija\",\"Lontīne\",\"Ļoņa\"],\"date\":\"23\\/05\"},{\"names\":[\"Ilvija\",\"Marlēna\",\"Ziedone\",\"Kurbads\",\"Kurbats\",\"Marlena\",\"Marlens\",\"Ziedonija\"],\"date\":\"24\\/05\"},{\"names\":[\"Anšlavs\",\"Junora\",\"Andzelms\",\"Anselms\",\"Anzelma\",\"Anzelms\",\"Juna\",\"Jūnija\",\"Jūnijs\",\"Junita\",\"Junona\",\"Junta\",\"Krīvs\"],\"date\":\"25\\/05\"},{\"names\":[\"Edvards\",\"Edvarts\",\"Eduards\",\"Varis\",\"Eduarda\",\"Eduārds\",\"Eduars\",\"Edvarda\",\"Edvārts\",\"Eidis\",\"Tedijs\",\"Tedis\",\"Varaidotis\",\"Varaidots\",\"Varimands\",\"Varimants\",\"Varita\",\"Varīte\",\"Varonis\"],\"date\":\"26\\/05\"},{\"names\":[\"Dzidra\",\"Gunita\",\"Loreta\",\"Dzidris\",\"Aglikerija\",\"Dzidrīte\",\"Glikerija\",\"Guneta\",\"Gunitra\",\"Lora\",\"Lorands\",\"Loransa\",\"Loreina\",\"Lorena\",\"Lorēna\",\"Lorens\",\"Lorensa\",\"Lorenss\",\"Lorenta\",\"Lorete\",\"Lorija\",\"Lorijs\",\"Lorika\",\"Lorina\",\"Lorīna\",\"Lorita\"],\"date\":\"27\\/05\"},{\"names\":[\"Vilis\",\"Vilhelms\",\"Langina\",\"Lengina\",\"Leongina\",\"Leongīna\",\"Leongīne\",\"Leongins\",\"Leongīns\",\"Logina\",\"Longina\",\"Longīna\",\"Longins\",\"Longīns\",\"Vilārs\",\"Vilberts\",\"Vilens\",\"Vilhelmins\",\"Vilhelmīns\",\"Vilijs\",\"Viljams\",\"Villems\",\"Villijs\",\"Viļums\",\"Viļus\"],\"date\":\"28\\/05\"},{\"names\":[\"Maksis\",\"Maksims\",\"Raivis\",\"Raivo\",\"Lakija\",\"Lara\",\"Largija\",\"Larija\",\"Larijs\",\"Larina\",\"Larions\",\"Laris\",\"Maksimilians\",\"Maksimiliāns\",\"Maksimiljans\",\"Makss\",\"Raiva\",\"Raivita\"],\"date\":\"29\\/05\"},{\"names\":[\"Vitolds\",\"Lolita\",\"Letīcija\",\"Jevdokija\",\"Lalita\",\"Lea\",\"Leāna\",\"Leāra\",\"Leida\",\"Leila\",\"Leticija\",\"Levijs\",\"Levita\",\"Logita\",\"Lola\",\"Lolija\",\"Lollija\",\"Vitolda\",\"Vitols\",\"Vītols\"],\"date\":\"30\\/05\"},{\"names\":[\"Alīda\",\"Jūsma\",\"Alida\",\"Alide\",\"Alīde\",\"Alidija\",\"Alīdija\",\"Alis\",\"Amīda\",\"Elīda\",\"Faina\",\"Jūsmiņš\",\"Lendija\",\"Petronela\",\"Petronele\",\"Petronelija\",\"Petronella\",\"Petronellija\",\"Petroneļa\",\"Petrunela\",\"Petrunele\",\"Petrunelija\",\"Petruneļa\"],\"date\":\"31\\/05\"},{\"names\":[\"Biruta\",\"Mairita\",\"Bernedīne\",\"Bernadina\",\"Bernadīne\",\"Birute\",\"Leolita\",\"Liāra\",\"Liards\",\"Mairīta\",\"Mairīte\",\"Mairuta\",\"Nikodems\",\"Nikodēms\",\"Nikodims\"],\"date\":\"01\\/06\"},{\"names\":[\"Lība\",\"Emma\",\"Eimija\",\"Ema\",\"Emija\",\"Emilda\",\"Emima\",\"Emme\",\"Emmija\",\"Liberata\",\"Liberijs\",\"Liona\",\"Lioneta\",\"Lionija\"],\"date\":\"02\\/06\"},{\"names\":[\"Inta\",\"Ineta\",\"Intra\",\"Inete\",\"Inneta\",\"Inota\",\"Lipija\",\"Lira\",\"Līrija\"],\"date\":\"03\\/06\"},{\"names\":[\"Elfrīda\",\"Sintija\",\"Sindija\",\"Cera\",\"Cerība\",\"Ceronis\",\"Cerons\",\"Elfrīda\",\"Elfrīde\",\"Elfrīds\",\"Sinda\",\"Sindijs\",\"Sindra\",\"Sinita\",\"Sinta\",\"Sinti\",\"Sintijs\",\"Taive\",\"Taivo\",\"Toivo\",\"Zinda\",\"Zindra\",\"Zinija\"],\"date\":\"04\\/06\"},{\"names\":[\"Igors\",\"Margots\",\"Ingvars\",\"Argija\",\"Argils\",\"Argita\",\"Argo\",\"Argods\",\"Argons\",\"Argots\",\"Argunda\",\"Arguts\",\"Bonifacija\",\"Bonifācija\",\"Bonifacijs\",\"Bonifācijs\",\"Bonifatijs\",\"Bonifātijs\",\"Bonifats\",\"Inguards\",\"Ingvards\",\"Ingvilda\",\"Ingvilds\",\"Igars\",\"Jegors\",\"Margonis\",\"Margons\",\"Margota\",\"Margote\",\"Marguss\",\"Marguta\",\"Marguts\"],\"date\":\"05\\/06\"},{\"names\":[\"Ingrīda\",\"Ardis\",\"Ards\",\"Ingra\",\"Ingre\",\"Ingreta\",\"Ingrida\",\"Ingrita\",\"Kandida\",\"Kendija\",\"Kendisa\",\"Loida\"],\"date\":\"06\\/06\"},{\"names\":[\"Gaida\",\"Arnis\",\"Arno\",\"Arne\",\"Arnela\",\"Arnijs\",\"Arons\",\"Ārons\",\"Gaidīte\",\"Loveta\",\"Luana\",\"Luāna\",\"Luāra\",\"Lueta\",\"Lugra\",\"Lukrecija\",\"Lukrēcija\"],\"date\":\"07\\/06\"},{\"names\":[\"Frīdis\",\"Frīda\",\"Mundra\",\"Frida\",\"Fridberts\",\"Fridis\",\"Munda\",\"Mundis\",\"Mundris\",\"Mundrīte\",\"Salamons\",\"Salimona\",\"Salimonija\",\"Salimons\",\"Salome\",\"Salomeja\",\"Salomija\",\"Salomons\",\"Solomeja\",\"Solomija\",\"Solomonija\",\"Solomons\",\"Solumeja\",\"Šalome\",\"Zalamans\",\"Zālamans\",\"Zalamons\"],\"date\":\"08\\/06\"},{\"names\":[\"Ligita\",\"Gita\",\"Gitana\",\"Gitāna\",\"Gitija\",\"Gits\",\"Ļeda\",\"Ļudgarda\"],\"date\":\"09\\/06\"},{\"names\":[\"Malva\",\"Anatols\",\"Anatolijs\",\"Anata\",\"Anatolija\",\"Mafalda\",\"Mazalda\"],\"date\":\"10\\/06\"},{\"names\":[\"Ingus\",\"Mairis\",\"Vidvuds\",\"Engus\",\"Inguss\",\"Mairolds\",\"Mairs\",\"Makrina\",\"Mamerts\",\"Videvuds\",\"Videvuts\",\"Vidis\",\"Vido\",\"Vidulis\",\"Vidvars\",\"Veidvedis\",\"Vidvuts\"],\"date\":\"11\\/06\"},{\"names\":[\"Nora\",\"Lenora\",\"Ija\",\"Īģe\",\"Manda\",\"Norgita\",\"Norika\",\"Noriņa\",\"Noris\",\"Norīte\",\"Norītis\",\"Norvalda\",\"Nurja\"],\"date\":\"12\\/06\"},{\"names\":[\"Zigfrīds\",\"Ainārs\",\"Uva\",\"Aināra\",\"Ainards\",\"Ainars\",\"Ūva\",\"Uve\",\"Ūve\",\"Zigfrids\"],\"date\":\"13\\/06\"},{\"names\":[\"Tija\",\"Saiva\",\"Sentis\",\"Santis\",\"Saivis\",\"Saiga\",\"Saigits\",\"Saija\",\"Saila\",\"Sailensa\",\"Sailita\",\"Saira\",\"Sairis\",\"Sairita\",\"Sairuss\",\"Santijs\",\"Santo\",\"Santoss\"],\"date\":\"14\\/06\"},{\"names\":[\"Baņuta\",\"Žermēna\",\"Vilija\",\"Vits\",\"Maranda\",\"Maranta\",\"Marats\",\"Marenda\",\"Moda\",\"Modesta\",\"Modests\",\"Modis\",\"Vila\",\"Vilenta\",\"Vilita\",\"Vilja\",\"Viljanta\",\"Villija\",\"Vitis\",\"Vito\",\"Vitus\",\"Žermena\"],\"date\":\"15\\/06\"},{\"names\":[\"Justīne\",\"Juta\",\"Džastina\",\"Džastīne\",\"Džastins\",\"Justa\",\"Justina\",\"Justīna\",\"Justine\",\"Justīnija\",\"Marsela\",\"Marseljēza\",\"Marsella\",\"Marsels\",\"Ustinija\",\"Ustiņja\"],\"date\":\"16\\/06\"},{\"names\":[\"Artūrs\",\"Artis\",\"Arčijs\",\"Ārčijs\",\"Arčils\",\"Arsenijs\",\"Arsēnijs\",\"Arsens\",\"Arsēns\",\"Arsentijs\",\"Artijs\",\"Artiks\",\"Arts\",\"Arturs\",\"Artuss\",\"Mečeslavs\",\"Mečislava\",\"Mečislavs\",\"Palmira\",\"Palmīra\",\"Paloma\",\"Pamela\"],\"date\":\"17\\/06\"},{\"names\":[\"Alberts\",\"Madis\",\"Adalberta\",\"Adalberts\",\"Alberta\",\"Edelberts\",\"Edilberts\",\"Merseda\",\"Mersēda\",\"Mersedesa\",\"Mervils\"],\"date\":\"18\\/06\"},{\"names\":[\"Viktors\",\"Nils\",\"Mila\",\"Mīla\",\"Milana\",\"Milāna\",\"Milānija\",\"Milans\",\"Milāns\",\"Mīle\",\"Milena\",\"Milēna\",\"Milēnija\",\"Milona\",\"Milvards\",\"Milvars\",\"Milvija\",\"Napoleons\",\"Nila\",\"Nilija\",\"Nīls\",\"Nilss\",\"Niluta\",\"Vikijs\",\"Viktorijs\",\"Vitors\"],\"date\":\"19\\/06\"},{\"names\":[\"Rasma\",\"Rasa\",\"Maira\",\"Maila\",\"Maima\",\"Maina\",\"Mairina\",\"Mimoza\",\"Molija\",\"Mollija\",\"Mora\",\"Morēna\",\"Morgane\",\"Rasita\",\"Rasmīte\",\"Rasulīte\"],\"date\":\"20\\/06\"},{\"names\":[\"Emīls\",\"Egita\",\"Monvīds\",\"Ahto\",\"Egīna\",\"Egīns\",\"Egits\",\"Emilians\",\"Emilijans\",\"Emīlijs\",\"Emilis\",\"Emīlis\",\"Emiljans\",\"Emils\",\"Jemeļjans\",\"Monrita\",\"Monvida\",\"Monvids\"],\"date\":\"21\\/06\"},{\"names\":[\"Ludmila\",\"Laimdots\",\"Laimiņš\",\"Bogdana\",\"Bogdans\",\"Bogumila\",\"Laimdotis\",\"Ludmilla\",\"Lūlija\"],\"date\":\"22\\/06\"},{\"names\":[\"Līga\",\"Līgonis\",\"Līgotnis\"],\"date\":\"23\\/06\"},{\"names\":[\"Jānis\"],\"date\":\"24\\/06\"},{\"names\":[\"Milija\",\"Maiga\",\"Maida\",\"Maigone\",\"Mia\",\"Mija\",\"Milica\",\"Milita\",\"Mille\",\"Millija\"],\"date\":\"25\\/06\"},{\"names\":[\"Ausma\",\"Inguna\",\"Ingūna\",\"Inguns\",\"Ausmis\",\"Ingunda\",\"Ingūns\",\"Ingura\",\"Ingūra\",\"Ingurds\",\"Ingurs\",\"Inguta\",\"Muza\",\"Mūza\",\"Naidžels\"],\"date\":\"26\\/06\"},{\"names\":[\"Malvīne\",\"Malvis\",\"Jelisejs\",\"Jeļisejs\",\"Malvina\",\"Malvīna\",\"Malvine\",\"Naila\",\"Naina\",\"Naira\",\"Nansija\",\"Naomi\",\"Nensija\"],\"date\":\"27\\/06\"},{\"names\":[\"Viesturs\",\"Kitija\",\"Viestards\",\"Klitija\",\"Narcise\",\"Narciss\",\"Narciza\",\"Nargisa\",\"Nargiza\",\"Vestards\",\"Viestars\",\"Viestarts\",\"Viesturis\",\"Vieturs\"],\"date\":\"28\\/06\"},{\"names\":[\"Pēteris\",\"Pāvils\",\"Pauls\",\"Paulis\",\"Narajana\",\"Nareks\",\"Narija\",\"Nārija\",\"Narimans\",\"Narimants\",\"Narine\",\"Narinē\",\"Pavels\",\"Pāvels\",\"Pavils\",\"Pāvuls\",\"Peta\",\"Pēters\",\"Petra\",\"Petro\",\"Petrs\",\"Piters\",\"Pīters\",\"Pits\",\"Pjotrs\",\"Pola\",\"Pols\",\"Povils\"],\"date\":\"29\\/06\"},{\"names\":[\"Tālivaldis\",\"Mareks\",\"Mareka\",\"Mereks\",\"Savelijs\",\"Savēlijs\",\"Tālivalda\",\"Tālivalds\",\"Tālvaldis\"],\"date\":\"30\\/06\"},{\"names\":[\"Imants\",\"Rimants\",\"Ingars\",\"Intars\",\"Ingārs\",\"Ingera\",\"Ingēra\",\"Ingerts\",\"Intārs\",\"Natans\",\"Nātans\",\"Rimands\",\"Rimanta\"],\"date\":\"01\\/07\"},{\"names\":[\"Lauma\",\"Ilvars\",\"Halina\",\"Galina\",\"Gaļina\",\"Halīna\",\"Ilvārs\",\"Ilvers\",\"Laumīte\",\"Nāra\",\"Necija\",\"Neda\"],\"date\":\"02\\/07\"},{\"names\":[\"Benita\",\"Everita\",\"Verita\",\"Emerita\",\"Benigna\",\"Benilda\",\"Benito\",\"Emarita\",\"Emerenciana\",\"Emerencija\",\"Emerencijana\",\"Emerenta\",\"Emerentiana\",\"Emerentina\",\"Emerentīne\",\"Emertijana\",\"Emīra\",\"Emirita\",\"Enerita\",\"Gorijs\",\"Gurijs\"],\"date\":\"03\\/07\"},{\"names\":[\"Ulvis\",\"Uldis\",\"Sandis\",\"Sandijs\",\"Nērika\",\"Neringa\",\"Nida\",\"Nigra\",\"Sando\",\"Sandus\",\"Sanduss\",\"Sendijs\",\"Uldriķis\",\"Ulfs\",\"Ulvars\",\"Ulvija\",\"Ulvita\"],\"date\":\"04\\/07\"},{\"names\":[\"Andžs\",\"Andžejs\",\"Edīte\",\"Esmeralda\",\"Anžijs\",\"Edita\",\"Edīta\",\"Edite\",\"Endžija\",\"Esmeralde\"],\"date\":\"05\\/07\"},{\"names\":[\"Anrijs\",\"Arkādijs\",\"Agripina\",\"Agripīna\",\"Anrī\",\"Anris\",\"Anriss\",\"Anrita\",\"Arkādija\",\"Ēsa\",\"Haldons\",\"Haldors\",\"Heldurs\",\"Niāra\",\"Niceta\"],\"date\":\"06\\/07\"},{\"names\":[\"Alda\",\"Maruta\",\"Aldija\",\"Aldīna\",\"Māruta\",\"Marute\",\"Nija\",\"Nijole\",\"Niola\"],\"date\":\"07\\/07\"},{\"names\":[\"Antra\",\"Adele\",\"Ada\",\"Adaļa\",\"Adela\",\"Adelaida\",\"Adelaīda\",\"Adelaide\",\"Adelgunde\",\"Adelheida\",\"Adelheide\",\"Adelija\",\"Adēlija\",\"Adelions\",\"Adeljans\",\"Adeļa\",\"Adeļjons\",\"Adija\",\"Adis\",\"Antris\",\"Fevronija\",\"Nimmija\",\"Nimue\",\"Nira\",\"Nīra\",\"Nita\"],\"date\":\"08\\/07\"},{\"names\":[\"Zaiga\",\"Asne\",\"Asna\",\"Kirils\",\"Nominanda\",\"Nona\",\"Nonna\",\"Zaigonis\"],\"date\":\"09\\/07\"},{\"names\":[\"Lija\",\"Olīvija\",\"Olivers\",\"Odrija\",\"Oliva\",\"Olīva\",\"Olivija\",\"Olvija\",\"Olvita\",\"Samsons\"],\"date\":\"10\\/07\"},{\"names\":[\"Leonora\",\"Svens\",\"Lennijs\",\"Lenvija\",\"Leonorija\",\"Svenis\",\"Taila\",\"Taimira\",\"Taunis\"],\"date\":\"11\\/07\"},{\"names\":[\"Indriķis\",\"Ints\",\"Namejs\",\"Indreks\",\"Indriks\",\"Intis\",\"Nameisis\",\"Omula\",\"Oniks\",\"Oniksa\"],\"date\":\"12\\/07\"},{\"names\":[\"Margrieta\",\"Margarita\",\"Magrieta\",\"Malgožata\",\"Margareta\",\"Margarēta\",\"Margarieta\",\"Margieta\",\"Margreta\",\"Margrita\",\"Marģieta\",\"Mārģieta\",\"Pegija\"],\"date\":\"13\\/07\"},{\"names\":[\"Oskars\",\"Ritvars\",\"Anvars\",\"Orlando\",\"Ornella\",\"Ornets\",\"Oskarina\",\"Oskarīna\"],\"date\":\"14\\/07\"},{\"names\":[\"Egons\",\"Egmonts\",\"Egija\",\"Henriks\",\"Heinrihs\",\"Ega\",\"Egijs\",\"Egmonds\",\"Egmonta\",\"Ego\",\"Heincs\",\"Heindrihs\",\"Heinis\",\"Heino\",\"Heinriks\",\"Hendrihs\",\"Hendriks\",\"Henrihs\",\"Henrika\"],\"date\":\"15\\/07\"},{\"names\":[\"Hermīne\",\"Estere\",\"Liepa\",\"Aleftina\",\"Aleftīna\",\"Aleftīne\",\"Aleta\",\"Alevtina\",\"Alevtīna\",\"Alevtine\",\"Alevtīne\",\"Esfira\",\"Estera\",\"Ēstere\",\"Estra\",\"Estris\",\"Herma\",\"Hermina\",\"Hermīna\",\"Hermine\",\"Hervita\",\"Ostins\",\"Rainelda\",\"Rainelde\"],\"date\":\"16\\/07\"},{\"names\":[\"Aleksis\",\"Aleksejs\",\"Alekss\",\"Aleks\",\"Alika\",\"Aliks\",\"Aļika\",\"Aļiks\",\"Pijs\",\"Pius\"],\"date\":\"17\\/07\"},{\"names\":[\"Rozālija\",\"Roze\",\"Rosa\",\"Rosita\",\"Rosvita\",\"Roza\",\"Rozalija\",\"Rozalinda\",\"Rozemarija\",\"Rozita\",\"Rozīte\",\"Rozmarija\",\"Rozvita\"],\"date\":\"18\\/07\"},{\"names\":[\"Jautrīte\",\"Kamila\",\"Digna\",\"Sāra\",\"Digne\",\"Dignija\",\"Jautra\",\"Jautris\",\"Kamēlija\",\"Kamena\",\"Kamilija\",\"Kamīlija\",\"Kamilla\",\"Kamils\",\"Kamita\",\"Pireta\",\"Sallija\",\"Sallijs\",\"Sarika\",\"Sarita\",\"Seila\",\"Sella\",\"Sellija\",\"Zallija\",\"Zara\",\"Zāra\",\"Zarina\"],\"date\":\"19\\/07\"},{\"names\":[\"Ritma\",\"Ramona\",\"Platons\",\"Plūdonis\",\"Rada\",\"Radimins\",\"Ramons\",\"Ramuna\",\"Ramune\",\"Ramute\",\"Ritmars\",\"Ritmārs\",\"Rusanda\",\"Ruzanna\",\"Ruze\"],\"date\":\"20\\/07\"},{\"names\":[\"Meldra\",\"Meldris\",\"Melisa\",\"Potencija\",\"Pudencija\",\"Pudentija\"],\"date\":\"21\\/07\"},{\"names\":[\"Marija\",\"Marika\",\"Marina\",\"Marī\",\"Mariamija\",\"Mārika\",\"Marīna\",\"Marja\",\"Marjama\",\"Miriama\",\"Mirjama\",\"Mirjāma\",\"Mirjana\"],\"date\":\"22\\/07\"},{\"names\":[\"Magda\",\"Magone\",\"Mērija\",\"Magdalēna\",\"Madelaina\",\"Madeleina\",\"Madlena\",\"Madlēna\",\"Magdalena\",\"Magdaliene\",\"Magdalina\",\"Magita\",\"Meralda\",\"Meri\",\"Merīda\",\"Merija\",\"Merilina\",\"Merita\",\"Radislavs\",\"Radmila\",\"Radomirs\"],\"date\":\"23\\/07\"},{\"names\":[\"Kristīne\",\"Kristīna\",\"Krista\",\"Kristiāna\",\"Kristiāns\",\"Hristiāna\",\"Kersti\",\"Kerstina\",\"Kriste\",\"Kristela\",\"Kristena\",\"Kristiana\",\"Kristiāne\",\"Kristianna\",\"Kristians\",\"Kristija\",\"Kristijana\",\"Kristijāns\",\"Kristilla\",\"Kristina\",\"Kristine\",\"Ķersta\",\"Ķērsta\"],\"date\":\"24\\/07\"},{\"names\":[\"Jēkabs\",\"Žaklīna\",\"Džeims\",\"Džeimss\",\"Džema\",\"Džemma\",\"Džems\",\"Džemss\",\"Džims\",\"Jaceks\",\"Jakobīna\",\"Jakobs\",\"Jākobs\",\"Jakovs\",\"Jakubs\",\"Jākubs\",\"Žaklina\",\"Žaklīne\",\"Žaks\"],\"date\":\"25\\/07\"},{\"names\":[\"Anna\",\"Ance\",\"Annija\",\"Ana\",\"Anabella\",\"Ancis\",\"Anne\",\"Annele\",\"Annelija\",\"Anniņa\",\"Aņa\",\"Aņeļa\",\"Aņuta\",\"Ona\",\"Oneta\"],\"date\":\"26\\/07\"},{\"names\":[\"Marta\",\"Dita\",\"Dite\",\"Mārta\",\"Martijana\",\"Martina\",\"Martīna\",\"Radu\",\"Radvilis\",\"Radvils\",\"Raēle\"],\"date\":\"27\\/07\"},{\"names\":[\"Cecīlija\",\"Cilda\",\"Cecilija\",\"Celerina\",\"Celina\",\"Celīna\",\"Cicilija\",\"Cildis\",\"Cildonis\",\"Cilija\",\"Cilina\",\"Cilmija\",\"Cilnija\",\"Rafaels\",\"Rafaēls\",\"Rafails\",\"Rafiks\"],\"date\":\"28\\/07\"},{\"names\":[\"Edmunds\",\"Edžus\",\"Vidmants\",\"Asmunds\",\"Ausmunds\",\"Edmonda\",\"Edmonds\",\"Edmons\",\"Edmunts\",\"Raida\",\"Raiders\",\"Raido\",\"Raiena\",\"Raiens\",\"Raigards\",\"Raigo\",\"Raija\",\"Vidmands\",\"Vidmunds\"],\"date\":\"29\\/07\"},{\"names\":[\"Valters\",\"Renārs\",\"Regnārs\",\"Ragnars\",\"Ragnārs\",\"Ragnēda\",\"Rāgners\",\"Ragnija\",\"Regnars\",\"Reinards\",\"Reinars\",\"Reinārs\",\"Reiners\",\"Renards\",\"Renars\",\"Renarts\",\"Rinards\",\"Rinārs\",\"Rintars\",\"Valteris\",\"Valtra\",\"Valtraude\",\"Valtrauta\",\"Valtraute\"],\"date\":\"30\\/07\"},{\"names\":[\"Rūta\",\"Ruta\",\"Angelika\",\"Sigita\",\"Andžela\",\"Andželika\",\"Andželīna\",\"Andželita\",\"Andžella\",\"Andželo\",\"Anga\",\"Angarijs\",\"Angela\",\"Angelija\",\"Angēlika\",\"Angelina\",\"Angelīna\",\"Angelita\",\"Angeļa\",\"Anģelina\",\"Anģelīna\",\"Anhelita\",\"Anžela\",\"Anželika\",\"Anželina\",\"Anželita\",\"Anžella\",\"Rute\",\"Rūte\",\"Rūtiņa\",\"Sigeta\",\"Sigija\",\"Sigits\"],\"date\":\"31\\/07\"},{\"names\":[\"Albīns\",\"Albīna\",\"Alba\",\"Albina\",\"Albine\",\"Albīne\",\"Albinsa\",\"Rameka\",\"Ramērs\",\"Ramils\",\"Ramina\",\"Ramīna\",\"Ramiro\"],\"date\":\"01\\/08\"},{\"names\":[\"Normunds\",\"Stefans\",\"Elia\",\"Eliana\",\"Eliass\",\"Eliašs\",\"Elija\",\"Ēlija\",\"Elijass\",\"Elijašs\",\"Elijs\",\"Elis\",\"Eljašs\",\"Holgers\",\"Iljana\",\"Iļana\",\"Iļja\",\"Iļjana\",\"Norlands\",\"Norma\",\"Normands\",\"Normans\",\"Normanta\",\"Normants\",\"Normens\",\"Normuds\",\"Normunda\",\"Stefāns\",\"Stepans\",\"Stepons\",\"Stīvens\"],\"date\":\"02\\/08\"},{\"names\":[\"Augusts\",\"Anufrijs\",\"Augustins\",\"Augustīns\",\"Ogists\",\"Oktavians\",\"Oktavija\",\"Oktāvija\",\"Onufrija\",\"Onufrijs\"],\"date\":\"03\\/08\"},{\"names\":[\"Romāns\",\"Romualds\",\"Romualda\",\"Roma\",\"Romalda\",\"Romalds\",\"Romanda\",\"Romands\",\"Romanija\",\"Romānija\",\"Romans\",\"Romants\",\"Romass\",\"Romena\",\"Romēna\",\"Romēns\",\"Romeo\",\"Rometa\",\"Romija\",\"Romis\",\"Roms\",\"Romulds\",\"Romvalda\",\"Romvalds\"],\"date\":\"04\\/08\"},{\"names\":[\"Osvalds\",\"Arvils\",\"Arvīns\",\"Osvaldis\",\"Rasmuss\",\"Rauza\",\"Ravena\",\"Ravita\",\"Salma\",\"Salme\"],\"date\":\"05\\/08\"},{\"names\":[\"Askolds\",\"Aisma\",\"Aista\",\"Asma\",\"Reds\",\"Reičela\",\"Reičele\",\"Remberts\"],\"date\":\"06\\/08\"},{\"names\":[\"Alfrēds\",\"Madars\",\"Fredis\",\"Alfra\",\"Alfreds\",\"Alfrida\",\"Alfrīda\",\"Alfrids\",\"Alfrīds\",\"Alimpiada\",\"Alva\",\"Alvaro\",\"Alvars\",\"Fredijs\",\"Freds\",\"Olimpiada\",\"Olimpija\",\"Rema\",\"Remigijs\",\"Remijs\",\"Remirs\",\"Remo\",\"Rems\"],\"date\":\"07\\/08\"},{\"names\":[\"Mudīte\",\"Vladislavs\",\"Vladislava\",\"Midīte\",\"Mudijs\",\"Mudiņš\",\"Mudis\",\"Renda\",\"Rendija\",\"Rendijs\",\"Renē\",\"Renno\",\"Reno\",\"Rens\",\"Reons\",\"Vlada\",\"Vladeks\"],\"date\":\"08\\/08\"},{\"names\":[\"Madara\",\"Genoveva\",\"Genovefa\",\"Anfija\",\"Anfisa\",\"Genovaite\",\"Genoveja\",\"Genovera\",\"Genuvefa\",\"Gunavefa\",\"Ģenovefa\",\"Madare\",\"Sava\"],\"date\":\"09\\/08\"},{\"names\":[\"Brencis\",\"Audris\",\"Inuta\",\"Auda\",\"Audars\",\"Audra\",\"Brenda\",\"Brendons\",\"Breta\",\"Brets\",\"Brina\",\"Brinda\",\"Labrencis\",\"Lars\",\"Larss\",\"Laurentijs\",\"Lavrentijs\"],\"date\":\"10\\/08\"},{\"names\":[\"Olga\",\"Zita\",\"Liega\",\"Zigita\",\"Alesja\",\"Aļesja\",\"Olesija\",\"Olesja\",\"Olgita\",\"Olmars\",\"Olrita\",\"Oļesija\",\"Oļesja\",\"Oļesje\"],\"date\":\"11\\/08\"},{\"names\":[\"Vizma\",\"Klāra\",\"Klara\",\"Klēra\",\"Reta\",\"Rets\",\"Revita\",\"Revs\",\"Vizulis\"],\"date\":\"12\\/08\"},{\"names\":[\"Elvīra\",\"Velga\",\"Rēzija\",\"Elvira\",\"Elvīrs\",\"Hipolits\",\"Ilvīra\",\"Ipolits\",\"Rezēda\",\"Rezenda\",\"Rezija\"],\"date\":\"13\\/08\"},{\"names\":[\"Zelma\",\"Zemgus\",\"Virma\",\"Rianda\",\"Riandra\",\"Rids\",\"Rieta\",\"Selma\",\"Zelmars\",\"Zemlita\",\"Zemvaldis\",\"Zemvalds\"],\"date\":\"14\\/08\"},{\"names\":[\"Zenta\",\"Dzelde\",\"Zelda\",\"Dzeja\",\"Dzestra\",\"Rima\",\"Rimars\",\"Rimma\",\"Rimvalda\",\"Rinvalda\",\"Zelga\",\"Zenita\"],\"date\":\"15\\/08\"},{\"names\":[\"Astra\",\"Astrīda\",\"Asterija\",\"Astērija\",\"Astērijs\",\"Astrida\",\"Astride\",\"Astrīde\",\"Astrids\",\"Astrīds\",\"Astrīte\",\"Rinta\",\"Rio\",\"Riona\",\"Rivo\"],\"date\":\"16\\/08\"},{\"names\":[\"Vineta\",\"Oļegs\",\"Rjuriks\",\"Roalds\",\"Roans\",\"Ruriks\",\"Veneta\",\"Venita\",\"Venjamina\",\"Veņa\",\"Vinete\",\"Vinets\",\"Vinita\"],\"date\":\"17\\/08\"},{\"names\":[\"Liene\",\"Helēna\",\"Elena\",\"Ellena\",\"Liena\",\"Aļona\",\"Elana\",\"Elāna\",\"Elands\",\"Elans\",\"Elāns\",\"Elēna\",\"Elens\",\"Ellana\",\"Helena\",\"Helene\",\"Helēne\",\"Hellēna\",\"Jeļena\",\"Lena\",\"Lēna\",\"Lenija\",\"Lenita\",\"Lienīte\"],\"date\":\"18\\/08\"},{\"names\":[\"Melānija\",\"Imanta\",\"Imanda\",\"Imandra\",\"Malānija\",\"Māle\",\"Malgonija\",\"Malinda\",\"Malle\",\"Meisija\",\"Melanija\",\"Melija\",\"Melinda\",\"Melisandra\",\"Melizanda\",\"Melizande\",\"Rodžers\",\"Roēna\",\"Rogate\"],\"date\":\"19\\/08\"},{\"names\":[\"Bernhards\",\"Boriss\",\"Rojs\",\"Bernads\",\"Bernarda\",\"Bernarde\",\"Bernardina\",\"Bernardīna\",\"Bernards\",\"Bernārs\",\"Bernats\",\"Borislavs\",\"Rokijs\",\"Roko\",\"Roksana\",\"Roksolana\",\"Samuela\",\"Samuels\",\"Samuēls\",\"Samvels\",\"Zamuels\",\"Zāmuels\",\"Zāmuēls\"],\"date\":\"20\\/08\"},{\"names\":[\"Janīna\",\"Linda\",\"Janina\",\"Jaņina\",\"Jaņīna\",\"Linde\",\"Lindija\",\"Lindons\",\"Linna\",\"Linsija\",\"Romāra\",\"Romina\",\"Romunds\",\"Romuss\",\"Romuta\"],\"date\":\"21\\/08\"},{\"names\":[\"Rudīte\",\"Everts\",\"Evarists\",\"Evars\",\"Evarts\",\"Rode\",\"Rodijs\",\"Ruda\"],\"date\":\"22\\/08\"},{\"names\":[\"Vitālijs\",\"Ralfs\",\"Valgudis\",\"Ralda\",\"Raldis\",\"Rolfs\",\"Rolijs\",\"Rolita\",\"Vitalija\",\"Vitālija\",\"Vitalijs\",\"Vitalina\",\"Vitalis\",\"Vitālis\",\"Vitalisa\",\"Vitaliss\",\"Vitāls\",\"Vitars\"],\"date\":\"23\\/08\"},{\"names\":[\"Bērtulis\",\"Boļeslavs\",\"Bartolomejs\",\"Bārtulis\",\"Bertolds\",\"Bertrams\",\"Bierants\",\"Boļeslava\",\"Rorijs\",\"Rosma\",\"Rostislavs\",\"Varfolomejs\"],\"date\":\"24\\/08\"},{\"names\":[\"Ludvigs\",\"Ludis\",\"Ivonna\",\"Patrīcija\",\"Patriks\",\"Ivona\",\"Ivonda\",\"Ivonija\",\"Ludolfs\",\"Lūdolfs\",\"Ludovika\",\"Ludoviks\",\"Ludviga\",\"Ludvika\",\"Ludviks\",\"Ludviķis\",\"Ludvisa\",\"Ludvise\",\"Ludvisija\",\"Luijs\",\"Luiss\",\"Ļudvise\",\"Patricija\",\"Patricijs\",\"Patrisija\"],\"date\":\"25\\/08\"},{\"names\":[\"Natālija\",\"Tālija\",\"Broņislavs\",\"Broņislava\",\"Bronija\",\"Bronis\",\"Bronislava\",\"Bronislavs\",\"Broņa\",\"Nata\",\"Natalī\",\"Natalija\",\"Natalja\",\"Nataļja\",\"Nate\",\"Natela\",\"Natella\",\"Neta\",\"Talija\",\"Talita\",\"Tihons\"],\"date\":\"26\\/08\"},{\"names\":[\"Žanis\",\"Jorens\",\"Alens\",\"Alana\",\"Alans\",\"Alēns\",\"Allans\",\"Allens\",\"Alons\",\"Džo\",\"Džonatans\",\"Džonijs\",\"Džonis\",\"Džons\",\"Huans\",\"Ivans\",\"Janeks\",\"Janis\",\"Janošs\",\"Jans\",\"Jāns\",\"Janušs\",\"Joans\",\"Johans\",\"Jonatans\",\"Jonatāns\",\"Jonijs\",\"Jons\",\"Jorēns\",\"Juhans\",\"Žanno\",\"Žano\",\"Žans\",\"Žuans\"],\"date\":\"27\\/08\"},{\"names\":[\"Auguste\",\"Guste\",\"Augusta\",\"Augustina\",\"Augustīna\",\"Augustīne\",\"Gusta\",\"Rovena\",\"Rovēna\",\"Rovens\",\"Ruāna\"],\"date\":\"28\\/08\"},{\"names\":[\"Armīns\",\"Vismants\",\"Aiga\",\"Aigija\",\"Aigijs\",\"Aigis\",\"Aigita\",\"Aigo\",\"Aigula\",\"Armanis\",\"Armans\",\"Armāns\",\"Armens\",\"Armida\",\"Armīda\",\"Armīds\",\"Armilda\",\"Armins\",\"Armis\",\"Rubens\",\"Rubīna\",\"Rufina\",\"Visija\",\"Viskants\",\"Visma\",\"Vismands\"],\"date\":\"29\\/08\"},{\"names\":[\"Alvis\",\"Jolanta\",\"Samanta\",\"Alvija\",\"Alvijs\",\"Alvika\",\"Alvita\",\"Alvits\",\"Jalanta\",\"Jolanda\",\"Jolands\",\"Jolants\",\"Jolita\",\"Ruslana\",\"Ruslands\",\"Ruslans\",\"Ruslāns\"],\"date\":\"30\\/08\"},{\"names\":[\"Vilma\",\"Aigars\",\"Aigvars\",\"Saksija\",\"Valida\",\"Valīda\",\"Valisa\",\"Valita\",\"Vallida\",\"Valma\"],\"date\":\"31\\/08\"},{\"names\":[\"Ilmārs\",\"Iluta\",\"Austrums\",\"Hilmars\",\"Hilmārs\",\"Ilmāra\",\"Ilmars\",\"Salda\"],\"date\":\"01\\/09\"},{\"names\":[\"Elīza\",\"Lizete\",\"Zete\",\"Elisa\",\"Elīsa\",\"Elise\",\"Eliss\",\"Elīss\",\"Eliza\",\"Elize\",\"Elizete\",\"Elīze\",\"Lisete\",\"Lizabete\",\"Lizbete\",\"Līzbete\",\"Lizelote\",\"Lizeta\",\"Sančo\",\"Savina\",\"Savīna\",\"Savita\",\"Zeta\",\"Zetiņa\"],\"date\":\"02\\/09\"},{\"names\":[\"Berta\",\"Bella\",\"Aribella\",\"Belēna\",\"Belinda\",\"Berts\",\"Sangrita\",\"Sangvids\",\"Sanlija\",\"Sedriks\",\"Senefra\",\"Serafima\",\"Serafims\",\"Serafina\",\"Seranta\"],\"date\":\"03\\/09\"},{\"names\":[\"Dzintra\",\"Dzintara\",\"Dzintars\",\"Ambere\",\"Dimants\",\"Dzintāra\",\"Dzintārija\",\"Dzintārs\",\"Dzintris\",\"Gintars\",\"Gintārs\",\"Gintauts\",\"Ģintars\",\"Zintars\",\"Zintra\"],\"date\":\"04\\/09\"},{\"names\":[\"Klaudija\",\"Persijs\",\"Vaida\",\"Klavdija\",\"Pērs\",\"Vaidelotis\",\"Vaidis\"],\"date\":\"05\\/09\"},{\"names\":[\"Maigonis\",\"Magnuss\",\"Mariuss\",\"Magnolija\",\"Magnus\",\"Maigons\",\"Marjus\",\"Maro\"],\"date\":\"06\\/09\"},{\"names\":[\"Regīna\",\"Ermīns\",\"Erma\",\"Ermina\",\"Ermīna\",\"Ermine\",\"Ermīne\",\"Ermionija\",\"Ermonija\",\"Regija\",\"Regina\",\"Regīns\",\"Regita\",\"Rego\",\"Reģina\",\"Reģīna\",\"Sēlija\",\"Selēna\",\"Selina\",\"Selīna\",\"Selīne\",\"Selinga\",\"Selita\",\"Senora\",\"Serena\",\"Serīna\",\"Serlana\",\"Sinora\"],\"date\":\"07\\/09\"},{\"names\":[\"Ilga\",\"Ilgards\",\"Ilgars\",\"Ilgārs\",\"Ilgarts\",\"Ilgnese\",\"Sianda\",\"Siandra\",\"Sianta\",\"Siāra\"],\"date\":\"08\\/09\"},{\"names\":[\"Bruno\",\"Telma\",\"Bronhilda\",\"Brunhilda\",\"Brunhilde\",\"Brunis\",\"Brunita\",\"Brunons\",\"Brūss\",\"Sidija\",\"Sidnejs\",\"Sidnija\",\"Sidonija\",\"Sidžija\",\"Teldijs\",\"Telesfors\",\"Zidija\",\"Zidonija\"],\"date\":\"09\\/09\"},{\"names\":[\"Jausma\",\"Albertīne\",\"Albertina\",\"Albertīna\",\"Albertine\",\"Sigma\",\"Sijanda\",\"Zigma\"],\"date\":\"10\\/09\"},{\"names\":[\"Signe\",\"Signija\",\"Siglinda\",\"Siglinde\",\"Signa\",\"Signeja\",\"Signejana\",\"Signese\",\"Signeta\",\"Signijs\",\"Signis\",\"Signita\",\"Zigna\",\"Zigne\"],\"date\":\"11\\/09\"},{\"names\":[\"Erna\",\"Evita\",\"Eva\",\"Ernita\",\"Ēva\",\"Eve\",\"Evelinda\",\"Evelita\",\"Evi\",\"Evī\",\"Ēvī\",\"Evianna\",\"Evīna\",\"Silards\",\"Sinatra\"],\"date\":\"12\\/09\"},{\"names\":[\"Iza\",\"Izabella\",\"Genadijs\",\"Genādijs\",\"Gennadijs\",\"Gennādijs\",\"Isabela\",\"Izabela\",\"Singa\",\"Singita\",\"Singrita\",\"Singūna\",\"Singurs\"],\"date\":\"13\\/09\"},{\"names\":[\"Sanita\",\"Santa\",\"Sanda\",\"Sanija\",\"Sandija\",\"Marfa\",\"Sana\",\"Sandita\",\"Saneta\",\"Sanijs\",\"Sanna\",\"Sannija\",\"Santana\",\"Santija\",\"Senda\",\"Sendija\",\"Sendlija\",\"Senija\"],\"date\":\"14\\/09\"},{\"names\":[\"Sandra\",\"Gunvaldis\",\"Gunvaris\",\"Sondra\",\"Gunivaldis\",\"Gunivalds\",\"Gunvalds\",\"Gunvars\",\"Sandriāna\",\"Sandrīte\",\"Santra\",\"Sendra\",\"Sondars\",\"Sondris\",\"Zandra\"],\"date\":\"15\\/09\"},{\"names\":[\"Asja\",\"Asnate\",\"Dāgs\",\"Anfims\",\"Asija\",\"Asnāte\",\"Dags\",\"Domna\",\"Sirdsvalda\",\"Sirdsvaldis\",\"Sirdvalda\"],\"date\":\"16\\/09\"},{\"names\":[\"Vera\",\"Vaira\",\"Vairis\",\"Aila\",\"Ailands\",\"Ailenda\",\"Aili\",\"Ailija\",\"Ailita\",\"Ajla\",\"Sīrija\",\"Sīringa\",\"Sirje\",\"Sirke\",\"Sivija\",\"Vaila\",\"Vaileta\",\"Vairita\",\"Vairīte\",\"Vaironis\",\"Vairons\",\"Vaiva\",\"Vaivars\",\"Vēra\",\"Verena\",\"Verēna\",\"Verija\",\"Virēna\"],\"date\":\"17\\/09\"},{\"names\":[\"Liesma\",\"Elita\",\"Alita\",\"Elite\",\"Eralds\",\"Mefodijs\",\"Metodijs\",\"Skara\",\"Skarleta\",\"Skārleta\",\"Skaudris\"],\"date\":\"18\\/09\"},{\"names\":[\"Verners\",\"Muntis\",\"Munise\",\"Sorenta\",\"Spārīte\",\"Spartaks\",\"Spēkonis\",\"Vernis\",\"Vernons\",\"Veronis\"],\"date\":\"19\\/09\"},{\"names\":[\"Guntra\",\"Ginters\",\"Marianna\",\"Mariana\",\"Marians\",\"Mariela\",\"Marijana\",\"Marijanna\",\"Marijans\",\"Maritana\",\"Marjana\",\"Marjanna\",\"Marjans\",\"Staldzis\"],\"date\":\"20\\/09\"},{\"names\":[\"Modris\",\"Matīss\",\"Mariss\",\"Marijs\",\"Mārijs\",\"Mario\",\"Mariona\",\"Marisa\",\"Mateass\",\"Matejs\",\"Mateuss\",\"Mateušs\",\"Matiass\",\"Matija\",\"Matis\",\"Matvejs\",\"Maurīcijs\",\"Metjū\",\"Modriņš\"],\"date\":\"21\\/09\"},{\"names\":[\"Māris\",\"Mārica\",\"Maigurs\",\"Maris\",\"Morics\",\"Moriss\",\"Steinārs\",\"Stenlijs\"],\"date\":\"22\\/09\"},{\"names\":[\"Vanda\",\"Veneranda\",\"Venija\",\"Snorre\",\"Vandze\",\"Vaneranda\",\"Vanesa\",\"Vanese\",\"Venefrīda\",\"Venera\",\"Venēra\",\"Venerande\",\"Veners\",\"Venīna\",\"Veniranda\"],\"date\":\"23\\/09\"},{\"names\":[\"Agris\",\"Agrita\",\"Agrits\",\"Agrons\",\"Steidzīte\",\"Steiga\"],\"date\":\"24\\/09\"},{\"names\":[\"Rodrigo\",\"Rauls\",\"Raulis\",\"Sulamite\",\"Sulamīte\",\"Svanhilda\"],\"date\":\"25\\/09\"},{\"names\":[\"Gundars\",\"Kurts\",\"Knuts\",\"Gundaris\",\"Gundolfs\",\"Gundra\",\"Nikita\",\"Ņikita\",\"Šeila\",\"Šeilija\",\"Šeina\",\"Šelbija\",\"Šelda\",\"Šellija\",\"Šerona\"],\"date\":\"26\\/09\"},{\"names\":[\"Ādolfs\",\"Ilgonis\",\"Ado\",\"Adolfina\",\"Ādolfina\",\"Adolfīne\",\"Ādolfīne\",\"Adonija\",\"Adonis\",\"Adoniss\",\"Delfija\",\"Delfina\",\"Delfīna\",\"Delfīne\",\"Ilgons\",\"Širleja\",\"Širlija\"],\"date\":\"27\\/09\"},{\"names\":[\"Sergejs\",\"Svetlana\",\"Lana\",\"Lāna\",\"Sergo\",\"Seržs\",\"Sveta\",\"Svetoslavs\",\"Svjatoslavs\",\"Vaclava\",\"Vaclavs\",\"Večella\",\"Večeslavs\",\"Večislavs\",\"Venceslavs\",\"Vencislava\",\"Vencislavs\",\"Venčeslavs\",\"Vinca\",\"Vinceslavs\",\"Vincis\",\"Vincs\",\"Vjačeslavs\"],\"date\":\"28\\/09\"},{\"names\":[\"Miķelis\",\"Mikus\",\"Miks\",\"Mihails\",\"Jumis\",\"Maikls\",\"Maiks\",\"Mihaels\",\"Mihailina\",\"Mihalina\",\"Mihalīna\",\"Mihaļina\",\"Mikaela\",\"Mikaels\",\"Mikalina\",\"Mikēle\",\"Mikija\",\"Mikijs\",\"Miķēlis\",\"Mišela\",\"Mišels\"],\"date\":\"29\\/09\"},{\"names\":[\"Elma\",\"Menarda\",\"Elna\",\"Elmija\",\"Elmīna\",\"Elmīne\",\"Elnara\",\"Elnāra\",\"Elneta\",\"Elnurs\",\"Geronima\",\"Geronims\",\"Geronīms\",\"Heronima\",\"Heronims\",\"Heronīms\",\"Hieronīms\",\"Jeronims\",\"Jeronīms\",\"Ļubova\",\"Medards\",\"Medarts\",\"Medeja\",\"Meinards\",\"Meinhards\",\"Mena\",\"Mendija\",\"Meredita\"],\"date\":\"30\\/09\"},{\"names\":[\"Zanda\",\"Lāsma\",\"Zandis\",\"Lāse\",\"Lasma\",\"Lāsmiņa\"],\"date\":\"01\\/10\"},{\"names\":[\"Ilma\",\"Skaidris\",\"Hilma\",\"Ilme\",\"Ilmija\",\"Ilna\",\"Terijs\",\"Tesa\",\"Tilla\",\"Tillija\",\"Tils\"],\"date\":\"02\\/10\"},{\"names\":[\"Elza\",\"Ilizana\",\"Ilizane\",\"Tira\",\"Tits\",\"Tobijs\"],\"date\":\"03\\/10\"},{\"names\":[\"Modra\",\"Francis\",\"Dmitrijs\",\"Dimārs\",\"Dimitrijs\",\"Ditmārs\",\"Ferencs\",\"Francs\",\"Franeks\",\"Franks\",\"Fransuāza\",\"Franuse\",\"Frenks\",\"Frensisa\",\"Prans\",\"Tora\",\"Toralfs\",\"Torija\",\"Torolfs\",\"Tors\",\"Torvalds\",\"Tūrs\"],\"date\":\"04\\/10\"},{\"names\":[\"Amālija\",\"Amēlija\",\"Amelija\",\"Amelita\",\"Rostams\",\"Rustams\",\"Rusudana\",\"Saida\",\"Saids\",\"Samija\",\"Samira\",\"Samīra\",\"Samīrs\",\"Sevda\",\"Tagils\",\"Tahirs\",\"Tahmina\",\"Timurs\",\"Ulams\",\"Vagifs\",\"Vahtangs\",\"Zemfira\",\"Zemira\",\"Zemīra\"],\"date\":\"05\\/10\"},{\"names\":[\"Monika\",\"Zilgma\",\"Zilga\",\"Mona\",\"Monija\",\"Monna\",\"Treisija\",\"Treviss\",\"Zilgars\",\"Zilgme\"],\"date\":\"06\\/10\"},{\"names\":[\"Daumants\",\"Druvvaldis\",\"Augmants\",\"Daumands\",\"Druvaldis\",\"Druvalds\",\"Druvinalds\",\"Druvvalds\",\"Druvars\",\"Tullija\",\"Turaida\",\"Turaids\",\"Tusnelda\"],\"date\":\"07\\/10\"},{\"names\":[\"Aina\",\"Anete\",\"Ainita\",\"Aino\",\"Ane\",\"Aneka\",\"Anela\",\"Anēle\",\"Anelija\",\"Anēlija\",\"Aneļa\",\"Anēļa\",\"Anese\",\"Aneta\",\"Anneta\",\"Annete\",\"Udo\"],\"date\":\"08\\/10\"},{\"names\":[\"Elga\",\"Helga\",\"Elgars\",\"Elgasts\",\"Elgita\",\"Elgons\",\"Helge\",\"Helgi\",\"Helgrīda\"],\"date\":\"09\\/10\"},{\"names\":[\"Arvīds\",\"Arvis\",\"Druvis\",\"Arvedo\",\"Arveds\",\"Arvēds\",\"Arvida\",\"Arvīda\",\"Arvīde\",\"Arvids\",\"Arvita\",\"Arvo\",\"Druvārs\"],\"date\":\"10\\/10\"},{\"names\":[\"Monta\",\"Tince\",\"Silva\",\"Haritons\",\"Hartvigs\",\"Monda\",\"Montija\",\"Montis\",\"Monts\",\"Silmonta\",\"Silvana\",\"Silvars\",\"Silvers\",\"Silveta\",\"Silvita\",\"Zilva\"],\"date\":\"11\\/10\"},{\"names\":[\"Valfrīds\",\"Kira\",\"Cirēnija\",\"Valfreds\",\"Valfrēds\",\"Valfrīda\",\"Valfrids\"],\"date\":\"12\\/10\"},{\"names\":[\"Irma\",\"Mirga\",\"Irmants\",\"Irme\",\"Irmina\",\"Irmīna\",\"Irmīne\",\"Irmiņa\",\"Mira\",\"Mirabella\",\"Miralda\",\"Miranda\",\"Miroslava\",\"Miroslavs\"],\"date\":\"13\\/10\"},{\"names\":[\"Vilhelmīne\",\"Minna\",\"Mīce\",\"Mina\",\"Minadora\",\"Mindora\",\"Vilhelma\",\"Vilhelmina\",\"Vilhelmīna\",\"Vilhelmine\"],\"date\":\"14\\/10\"},{\"names\":[\"Eda\",\"Hedviga\",\"Helvijs\",\"Ede\",\"Edīna\",\"Edviga\",\"Heda\",\"Hedija\",\"Hedijs\",\"Hedvigs\",\"Helvi\",\"Helvigs\",\"Helvija\",\"Helvis\",\"Helvita\"],\"date\":\"15\\/10\"},{\"names\":[\"Daiga\",\"Dinija\",\"Dinārs\",\"Daido\",\"Daidze\",\"Daiens\",\"Daigars\",\"Daigone\",\"Daigonis\",\"Daija\",\"Dilans\",\"Dinara\",\"Dināra\",\"Dinards\",\"Dinars\",\"Dineta\",\"Dinijs\",\"Dinnija\"],\"date\":\"16\\/10\"},{\"names\":[\"Gaits\",\"Karīna\",\"Gaitis\",\"Gaita\",\"Karena\",\"Kārena\",\"Karens\",\"Karija\",\"Kārija\",\"Karina\",\"Kārina\",\"Karine\",\"Karinē\",\"Karīne\",\"Karita\",\"Kerena\"],\"date\":\"17\\/10\"},{\"names\":[\"Rolands\",\"Rolanda\",\"Ronalds\",\"Erlends\",\"Lūkass\",\"Erlanda\",\"Erlands\",\"Erlenda\",\"Erlens\",\"Lukass\",\"Railands\",\"Railija\",\"Rolande\",\"Rolans\",\"Rolāns\",\"Rolanta\",\"Rona\",\"Ronalda\",\"Ronaldo\",\"Ronda\",\"Ronijs\",\"Ronta\",\"Ronvalds\"],\"date\":\"18\\/10\"},{\"names\":[\"Elīna\",\"Drosma\",\"Drosmis\",\"Drosme\",\"Drosmiņš\",\"Drošvaldis\",\"Drošvaris\",\"Elika\",\"Elina\",\"Elīne\",\"Elīns\"],\"date\":\"19\\/10\"},{\"names\":[\"Leonīds\",\"Leonīda\",\"Leonida\",\"Leonide\",\"Leonids\",\"Leonita\",\"Pelageja\"],\"date\":\"20\\/10\"},{\"names\":[\"Urzula\",\"Severīns\",\"Severīna\",\"Severins\",\"Severjans\",\"Taida\",\"Taīda\",\"Taisa\",\"Taisija\",\"Taīsija\",\"Ursula\",\"Uršula\",\"Uršule\",\"Uršuļa\"],\"date\":\"21\\/10\"},{\"names\":[\"Īrisa\",\"Irīda\",\"Airisa\",\"Airida\",\"Arisa\",\"Iraisa\",\"Iresa\",\"Irida\",\"Irisa\"],\"date\":\"22\\/10\"},{\"names\":[\"Daina\",\"Dainis\",\"Dainida\",\"Daimona\",\"Daimonds\",\"Daimons\",\"Dainars\",\"Dainārs\",\"Dainarts\",\"Dainita\",\"Dainīte\",\"Dainors\",\"Deimonds\",\"Deimons\",\"Jevlampija\"],\"date\":\"23\\/10\"},{\"names\":[\"Renāte\",\"Modrīte\",\"Mudrīte\",\"Mudra\",\"Mudris\",\"Rana\",\"Ranāte\",\"Raneta\",\"Ranita\",\"Ranta\",\"Rena\",\"Rēna\",\"Renata\",\"Renāta\",\"Renate\",\"Reneta\",\"Renija\",\"Renijs\",\"Renita\",\"Renta\",\"Rineta\",\"Rinete\"],\"date\":\"24\\/10\"},{\"names\":[\"Beāte\",\"Beatrise\",\"Beata\",\"Beāta\",\"Beate\",\"Beatrisa\",\"Biatrise\",\"Gilarijs\",\"Hilards\",\"Hilarija\",\"Hilarijs\",\"Hilārijs\",\"Hilars\",\"Hilārs\"],\"date\":\"25\\/10\"},{\"names\":[\"Amanda\",\"Kaiva\",\"Amanta\",\"Amandis\",\"Amands\",\"Amantija\",\"Amaranda\",\"Amaranta\",\"Amarilla\",\"Amenta\",\"Araminta\",\"Azanda\",\"Azella\",\"Kaivis\"],\"date\":\"26\\/10\"},{\"names\":[\"Lilita\",\"Irita\",\"Ita\",\"Itars\",\"Itārs\",\"Itija\",\"Itvars\",\"Lillita\",\"Praskovja\",\"Proskovja\"],\"date\":\"27\\/10\"},{\"names\":[\"Ņina\",\"Ninona\",\"Antoņina\",\"Oksana\",\"Aksana\",\"Antonina\",\"Antonīna\",\"Nina\",\"Nīna\",\"Ninele\",\"Ninella\",\"Nineta\",\"Niseta\",\"Niveta\",\"Ņīna\",\"Oksāna\"],\"date\":\"28\\/10\"},{\"names\":[\"Laimonis\",\"Elvijs\",\"Elva\",\"Elvis\",\"Laimis\",\"Elvars\",\"Elvi\",\"Elviga\",\"Elvigs\",\"Elvija\",\"Elvisa\",\"Elviss\",\"Elvo\",\"Laimonds\",\"Laimons\",\"Laimonts\",\"Laimutis\",\"Laimzieds\"],\"date\":\"29\\/10\"},{\"names\":[\"Nadīna\",\"Ulla\",\"Adīna\",\"Adina\",\"Adīne\",\"Eila\",\"Nadežda\",\"Nadija\",\"Nadina\",\"Nadīne\",\"Ulda\",\"Uldive\",\"Uldze\",\"Ulita\",\"Uljana\",\"Uljans\",\"Ullija\",\"Uļjana\",\"Uļjans\"],\"date\":\"30\\/10\"},{\"names\":[\"Valts\",\"Rinalds\",\"Rinalda\",\"Rainis\",\"Rainita\",\"Rainolds\",\"Rina\",\"Rīna\",\"Rinaldo\",\"Rinalts\",\"Vaits\",\"Valta\",\"Valtis\"],\"date\":\"31\\/10\"},{\"names\":[\"Ikars\",\"Ihtiandrs\",\"Ikola\",\"Ildefons\",\"Ildra\",\"Iraklijs\",\"Tautmīlis\",\"Tautvaldis\",\"Tautvaris\",\"Ungars\"],\"date\":\"01\\/11\"},{\"names\":[\"Vivita\",\"Dzīle\",\"Viva\",\"Dzilvars\",\"Venda\",\"Vendeta\",\"Vendija\",\"Vendijs\",\"Vivanta\",\"Vivanto\",\"Viveja\",\"Viveta\",\"Vivija\",\"Vivina\"],\"date\":\"02\\/11\"},{\"names\":[\"Ērika\",\"Dagnija\",\"Era\",\"Ēra\",\"Erena\",\"Erēna\",\"Erika\",\"Huberts\",\"Hūberts\",\"Valeska\",\"Valve\"],\"date\":\"03\\/11\"},{\"names\":[\"Atis\",\"Otomārs\",\"Oto\",\"Ata\",\"Otis\",\"Otomars\",\"Vega\",\"Vegita\"],\"date\":\"04\\/11\"},{\"names\":[\"Šarlote\",\"Lote\",\"Late\",\"Lato\",\"Lota\",\"Šadija\",\"Šarlota\",\"Veidols\",\"Veikla\",\"Veiksma\",\"Veimārs\"],\"date\":\"05\\/11\"},{\"names\":[\"Linards\",\"Leons\",\"Leo\",\"Leonards\",\"Leonarda\",\"Lenards\",\"Lenārs\",\"Lenarts\",\"Leona\",\"Leonāra\",\"Leonardo\",\"Leonarija\",\"Leonārija\",\"Leonars\",\"Leonārs\",\"Leone\",\"Leonella\",\"Leonhards\",\"Leonija\",\"Leonila\",\"Leonilla\",\"Linarda\",\"Linārs\",\"Linarts\",\"Linerts\",\"Lonards\",\"Lonarts\",\"Ļevs\"],\"date\":\"06\\/11\"},{\"names\":[\"Helma\",\"Lotārs\",\"Helmī\",\"Helmija\",\"Helmīna\",\"Helmīne\",\"Lotars\",\"Pērle\",\"Vena\",\"Vēna\",\"Venancijs\",\"Venantijs\",\"Veno\"],\"date\":\"07\\/11\"},{\"names\":[\"Aleksandra\",\"Agra\",\"Agreda\",\"Agrida\",\"Agrīda\",\"Agrija\",\"Agrīna\",\"Agrite\",\"Agrīte\",\"Aleksa\",\"Aleksandrija\",\"Aleksandrina\",\"Aleksandrīna\",\"Aleksandrīne\"],\"date\":\"08\\/11\"},{\"names\":[\"Teodors\",\"Fedors\",\"Fedots\",\"Feodora\",\"Feodors\",\"Feodosija\",\"Fjodors\",\"Tea\",\"Teo\",\"Teobalds\",\"Teodora\",\"Teofila\",\"Teofīla\",\"Teofile\",\"Teofilija\",\"Teofīlija\",\"Teofils\",\"Teovils\"],\"date\":\"09\\/11\"},{\"names\":[\"Mārtiņš\",\"Mārcis\",\"Markuss\",\"Marks\",\"Marcela\",\"Marcelina\",\"Marcella\",\"Marciana\",\"Marcianna\",\"Marcijana\",\"Marcijanna\",\"Marcis\",\"Marčela\",\"Marčija\",\"Marko\",\"Markss\",\"Markus\",\"Martens\",\"Martins\",\"Martiņš\",\"Mortens\"],\"date\":\"10\\/11\"},{\"names\":[\"Ojārs\",\"Rainers\",\"Nellija\",\"Lāčplēsis\",\"Nele\",\"Nelija\",\"Nelima\",\"Nelita\",\"Nella\",\"Neļa\",\"Neonila\",\"Neonilla\",\"Rainars\",\"Reimars\",\"Reimārs\"],\"date\":\"11\\/11\"},{\"names\":[\"Kaija\",\"Kornēlija\",\"Kaira\",\"Kajs\",\"Kajsa\",\"Kornelija\",\"Kornelijs\",\"Kornēlijs\",\"Kortnija\",\"Veta\",\"Vianda\",\"Viāna\",\"Vianita\",\"Vianta\",\"Vidards\",\"Vidars\",\"Vidarts\",\"Vidavs\",\"Zinovija\",\"Zinovijs\"],\"date\":\"12\\/11\"},{\"names\":[\"Eižens\",\"Jevgeņijs\",\"Jevgeņija\",\"Augenija\",\"Eiženijs\",\"Eugenijs\",\"Eugēnijs\",\"Euģenijs\",\"Euģēnijs\",\"Evgenijs\",\"Evgēnijs\",\"Evģenijs\",\"Evģēnijs\",\"Jevgenija\",\"Jevgēnija\",\"Jevgenijs\",\"Jevgēnijs\",\"Jevgēņija\",\"Jevgēņijs\",\"Jevģenija\",\"Jevģēnija\",\"Jevģenijs\",\"Jevģēnijs\",\"Jevženija\",\"Jevžēnija\"],\"date\":\"13\\/11\"},{\"names\":[\"Fricis\",\"Vikentijs\",\"Vincents\",\"Frederika\",\"Frederiks\",\"Friderika\",\"Frideriks\",\"Fridriha\",\"Fridrihs\",\"Frīdrihs\",\"Spricis\",\"Vicenta\",\"Vicents\",\"Vikars\",\"Vincens\",\"Vincenta\",\"Vincentijs\",\"Vincentina\",\"Vincentīna\",\"Vincentīne\",\"Vinsents\"],\"date\":\"14\\/11\"},{\"names\":[\"Leopolds\",\"Undīne\",\"Unda\",\"Leopoldina\",\"Undalgs\",\"Undija\",\"Undina\",\"Undīna\",\"Undis\",\"Undita\"],\"date\":\"15\\/11\"},{\"names\":[\"Banga\",\"Glorija\",\"Ganda\",\"Jefimija\",\"Jefims\",\"Landa\",\"Landijs\",\"Vētra\"],\"date\":\"16\\/11\"},{\"names\":[\"Hugo\",\"Uga\",\"Uģis\",\"Higo\",\"Igo\",\"Ugo\"],\"date\":\"17\\/11\"},{\"names\":[\"Aleksandrs\",\"Doloresa\",\"Brīve\",\"Aleksanders\",\"Aleksandris\",\"Alesandrs\",\"Brīva\",\"Brīvīte\",\"Dolita\",\"Dollija\",\"Laisve\",\"Latvis\",\"Latvīte\",\"Zandars\",\"Zanders\"],\"date\":\"18\\/11\"},{\"names\":[\"Elizabete\",\"Liza\",\"Līze\",\"Betija\",\"Alžbeta\",\"Beta\",\"Betsija\",\"Eba\",\"Elizabeta\",\"Elīzabeta\",\"Elīzabete\",\"Elizaveta\",\"Elizavete\",\"Elizbete\",\"Elzabeta\",\"Elžbeta\",\"Jelizabeta\",\"Jelizaveta\",\"Jelizavete\",\"Jeļizabeta\",\"Jeļizaveta\",\"Jeļizavete\",\"Lisa\",\"Lisija\",\"Līza\",\"Lize\",\"Līziņa\"],\"date\":\"19\\/11\"},{\"names\":[\"Anda\",\"Andīna\",\"Vigo\",\"Andija\",\"Andina\",\"Andīne\",\"Nanda\",\"Viga\",\"Vīga\",\"Vīgants\",\"Vigars\",\"Vigda\",\"Vigelijs\",\"Vigeta\",\"Vigija\",\"Vigilija\",\"Vigilijs\",\"Vigita\",\"Vīgo\",\"Viģīlija\"],\"date\":\"20\\/11\"},{\"names\":[\"Zeltīte\",\"Andis\",\"Andars\",\"Andejs\",\"Andijs\",\"Ando\",\"Vigors\",\"Vigorts\",\"Vigra\",\"Vigurds\",\"Vilfrida\",\"Vilfrīds\",\"Vilibalds\",\"Viliberts\",\"Zelta\",\"Zeltiņa\",\"Zlata\"],\"date\":\"21\\/11\"},{\"names\":[\"Aldis\",\"Alfons\",\"Aldris\",\"Aldijs\",\"Aldra\",\"Alfins\",\"Alfonija\",\"Alfonss\",\"Vilonija\",\"Vilora\"],\"date\":\"22\\/11\"},{\"names\":[\"Zigrīda\",\"Zigfrīda\",\"Zigrīds\",\"Sigrīda\",\"Sigrija\",\"Sigruna\",\"Sigrūna\",\"Sigurnija\",\"Ziga\",\"Zigda\",\"Zigfrida\",\"Zigra\",\"Zigrida\",\"Zigrids\",\"Zigrita\",\"Zigvija\"],\"date\":\"23\\/11\"},{\"names\":[\"Velta\",\"Velda\",\"Velards\",\"Veldra\",\"Velita\",\"Velte\",\"Veltija\",\"Vīna\",\"Vinārs\",\"Viners\",\"Vīne\"],\"date\":\"24\\/11\"},{\"names\":[\"Katrīna\",\"Kate\",\"Kadrija\",\"Trīne\",\"Katrīne\",\"Jekaterina\",\"Jekaterīna\",\"Kadija\",\"Katalīna\",\"Katarina\",\"Katarīna\",\"Katažina\",\"Katerina\",\"Katerīna\",\"Katija\",\"Katiņa\",\"Katra\",\"Katre\",\"Katri\",\"Katrina\",\"Katrine\",\"Katriona\",\"Kecija\",\"Keita\",\"Keitija\",\"Keta\",\"Kēta\",\"Kete\",\"Kēte\",\"Ketija\",\"Ketri\",\"Ketrija\",\"Ketrina\",\"Ketrīna\",\"Trīna\"],\"date\":\"25\\/11\"},{\"names\":[\"Konrāds\",\"Sebastians\",\"Kondrats\",\"Kondrāts\",\"Konrads\",\"Konrands\",\"Konrāts\",\"Manefa\",\"Sebastjans\",\"Vingra\"],\"date\":\"26\\/11\"},{\"names\":[\"Lauris\",\"Norberts\",\"Laurijs\",\"Nords\",\"Vinifreda\",\"Vinifreds\",\"Vinija\",\"Vinnija\",\"Vinolds\",\"Vinona\"],\"date\":\"27\\/11\"},{\"names\":[\"Rita\",\"Vita\",\"Olita\",\"Olija\",\"Olina\",\"Olis\",\"Ollija\",\"Ritija\",\"Vinta\",\"Vintars\",\"Vintārs\",\"Vintra\",\"Vints\",\"Vitija\"],\"date\":\"28\\/11\"},{\"names\":[\"Ignats\",\"Virgīnija\",\"Aimo\",\"Ignatijs\",\"Ignātijs\",\"Ignāts\",\"Vergenija\",\"Virdžīnija\",\"Virga\",\"Virgenija\",\"Virgilijs\",\"Virgina\",\"Virgīna\",\"Virgine\",\"Virgīne\",\"Virginija\",\"Virginijs\",\"Virģinija\",\"Virģīnija\"],\"date\":\"29\\/11\"},{\"names\":[\"Andrievs\",\"Andrejs\",\"Andris\",\"Anders\",\"Anderss\",\"Andrāšs\",\"Andreass\",\"Andrejans\",\"Andrējs\",\"Andress\",\"Andrians\",\"Andriāns\",\"Andrijans\",\"Andrijs\",\"Androns\",\"Andrs\",\"Andruss\",\"Endrijs\",\"Endrū\"],\"date\":\"30\\/11\"},{\"names\":[\"Arnolds\",\"Emanuels\",\"Arnotijs\",\"Arnulfs\",\"Emanuela\",\"Emanuēla\",\"Emanuils\",\"Emmanuels\",\"Imanuels\",\"Immanuels\",\"Manuela\",\"Manuēla\",\"Noldis\"],\"date\":\"01\\/12\"},{\"names\":[\"Meta\",\"Sniedze\",\"Mēta\",\"Snežana\",\"Snežanna\",\"Sniedzīte\",\"Sniga\",\"Sņežana\",\"Sņežanna\",\"Voicehs\",\"Voiceks\",\"Voicihs\",\"Voiciks\",\"Voičiks\",\"Voitiks\"],\"date\":\"02\\/12\"},{\"names\":[\"Evija\",\"Raita\",\"Jogita\",\"Akims\",\"Ako\",\"Džovita\",\"Ēvija\",\"Evijs\",\"Evika\",\"Evisa\",\"Ēvisa\",\"Jakims\",\"Joahims\",\"Joakims\",\"Jovars\",\"Jovita\",\"Jugita\",\"Jukums\",\"Volfgangs\",\"Volfreds\",\"Volfrids\",\"Volfrīds\",\"Volfs\"],\"date\":\"03\\/12\"},{\"names\":[\"Baiba\",\"Barbara\",\"Barba\",\"Varvara\",\"Vsevolods\",\"Vudis\",\"Vudro\"],\"date\":\"04\\/12\"},{\"names\":[\"Sabīne\",\"Sarma\",\"Klaudijs\",\"Sabina\",\"Sabīna\",\"Sabine\",\"Sabrina\",\"Sabrīna\",\"Sabrīne\",\"Sarme\",\"Zabīne\",\"Zanga\",\"Zanza\"],\"date\":\"05\\/12\"},{\"names\":[\"Nikolajs\",\"Niklāvs\",\"Niks\",\"Nikola\",\"Meikols\",\"Meikulis\",\"Meikuls\",\"Nika\",\"Nikandrs\",\"Nikija\",\"Nikijs\",\"Niklass\",\"Niklāss\",\"Niklavs\",\"Niko\",\"Nikolass\",\"Nikole\",\"Nikoleta\",\"Nikolīna\",\"Nikolla\",\"Ņika\"],\"date\":\"06\\/12\"},{\"names\":[\"Antonija\",\"Anta\",\"Dzirkstīte\",\"Antainna\",\"Antija\",\"Antonela\",\"Antonida\",\"Antonīda\",\"Antuaneta\",\"Antuanete\",\"Tone\",\"Tonija\",\"Tonita\",\"Toņa\",\"Zbigņevs\",\"Zdeneks\"],\"date\":\"07\\/12\"},{\"names\":[\"Gunārs\",\"Vladimirs\",\"Gunis\",\"Gināra\",\"Ginārs\",\"Gunāra\",\"Gunards\",\"Gunars\",\"Gunarts\",\"Gunijs\",\"Gunnars\",\"Guno\",\"Vladilena\",\"Vladilens\",\"Vladimira\",\"Vladis\",\"Vladlena\",\"Vladlēna\",\"Vladlens\",\"Vlads\"],\"date\":\"08\\/12\"},{\"names\":[\"Tabita\",\"Sarmīte\",\"Sārtīte\",\"Tabite\",\"Zenobija\",\"Zenona\",\"Zenons\"],\"date\":\"09\\/12\"},{\"names\":[\"Guna\",\"Judīte\",\"Džudīte\",\"Gunefa\",\"Nevils\",\"Zēra\"],\"date\":\"10\\/12\"},{\"names\":[\"Voldemārs\",\"Valdemārs\",\"Valdis\",\"Valdeko\",\"Valdeks\",\"Valdemars\",\"Valdimārts\",\"Valdimirs\",\"Valdmiers\",\"Valdona\",\"Valdone\",\"Valdonis\",\"Valdons\",\"Valds\",\"Vivaldis\",\"Voldemars\",\"Voldis\",\"Voldmārs\",\"Volmārs\",\"Vulmārs\"],\"date\":\"11\\/12\"},{\"names\":[\"Otīlija\",\"Iveta\",\"Atala\",\"Atāls\",\"Igeta\",\"Igila\",\"Igita\",\"Iverta\",\"Iverts\",\"Ivete\",\"Odeta\",\"Odita\",\"Ofēlija\",\"Otālija\",\"Otilija\",\"Zezostrs\"],\"date\":\"12\\/12\"},{\"names\":[\"Lūcija\",\"Veldze\",\"Lucianna\",\"Lucians\",\"Luciāns\",\"Lucija\",\"Lucijana\",\"Lucijans\",\"Lucijāns\",\"Lusiāna\",\"Lusija\",\"Ļusja\",\"Veldza\"],\"date\":\"13\\/12\"},{\"names\":[\"Auseklis\",\"Gaisma\",\"Gaismīte\",\"Gaismone\",\"Gaismonis\",\"Gaismons\",\"Illuminata\"],\"date\":\"14\\/12\"},{\"names\":[\"Johanna\",\"Hanna\",\"Jana\",\"Hanelita\",\"Hanija\",\"Hannelora\",\"Hannelore\",\"Hannija\",\"Jāna\",\"Janeka\",\"Janija\",\"Janika\",\"Janna\",\"Joana\",\"Joanna\",\"Johana\",\"Jonita\",\"Juanna\",\"Junna\",\"Žuanete\"],\"date\":\"15\\/12\"},{\"names\":[\"Alvīne\",\"Alvina\",\"Alvīna\",\"Alvine\",\"Alvīnija\",\"Alvins\",\"Alvīns\",\"Zira\",\"Zola\",\"Zolija\"],\"date\":\"16\\/12\"},{\"names\":[\"Hilda\",\"Teiksma\",\"Borghilde\",\"Borģīne\",\"Dziesma\",\"Hildegarde\",\"Hildura\",\"Hilga\",\"Hilja\",\"Ilda\",\"Ildars\"],\"date\":\"17\\/12\"},{\"names\":[\"Kristaps\",\"Kristofers\",\"Krists\",\"Klinta\",\"Kristers\",\"Kriss\",\"Kristafors\",\"Kristans\",\"Kristars\",\"Kristens\",\"Kristo\",\"Kristofors\",\"Kristofs\",\"Kšištofs\"],\"date\":\"18\\/12\"},{\"names\":[\"Lelde\",\"Sarmis\",\"Alena\",\"Alēna\",\"Alereins\",\"Lelda\",\"Tots\"],\"date\":\"19\\/12\"},{\"names\":[\"Arta\",\"Minjona\",\"Artemida\",\"Artemijs\",\"Artēmijs\",\"Artija\",\"Artjoms\",\"Vitnija\"],\"date\":\"20\\/12\"},{\"names\":[\"Toms\",\"Tomass\",\"Saulcerīte\",\"Saulceris\",\"Saulgaida\",\"Saulgaitis\",\"Tomašs\",\"Tomāšs\",\"Tomijs\",\"Tumašs\"],\"date\":\"21\\/12\"},{\"names\":[\"Saulvedis\",\"Saule\",\"Saulīte\",\"Saulstarīte\",\"Saulstars\",\"Saulvija\"],\"date\":\"22\\/12\"},{\"names\":[\"Viktorija\",\"Balva\",\"Vika\",\"Vikija\",\"Viktora\",\"Viktorina\"],\"date\":\"23\\/12\"},{\"names\":[\"Ādams\",\"Ieva\",\"Ieviņa\",\"Odums\"],\"date\":\"24\\/12\"},{\"names\":[\"Stella\",\"Larisa\",\"Estella\",\"Zvaigznīte\"],\"date\":\"25\\/12\"},{\"names\":[\"Dainuvīte\",\"Gija\",\"Megija\",\"Dainavīte\",\"Gijs\",\"Mega\"],\"date\":\"26\\/12\"},{\"names\":[\"Elmārs\",\"Inita\",\"Helmārs\",\"Elmāra\",\"Elmars\",\"Helmars\",\"Initra\"],\"date\":\"27\\/12\"},{\"names\":[\"Inga\",\"Ivita\",\"Irvita\",\"Ingeborga\",\"Inge\",\"Ingerūda\",\"Ingeta\",\"Ingita\",\"Ingo\",\"Irvalds\",\"Irvings\",\"Irvins\",\"Irvīns\"],\"date\":\"28\\/12\"},{\"names\":[\"Solveiga\",\"Ilgona\",\"Invalds\",\"Invars\",\"Inveiga\",\"Solanža\",\"Solvega\",\"Solvēga\"],\"date\":\"29\\/12\"},{\"names\":[\"Dāvids\",\"Dāvis\",\"Dāniels\",\"Daniela\",\"Daniels\",\"Daniēla\",\"Dāniela\",\"Daniella\",\"Daniēls\",\"Daniils\",\"Danils\",\"Daņiils\",\"Daņila\",\"Daņils\",\"Dato\",\"Davids\",\"Dāvīds\",\"Dāvs\",\"Deivids\",\"Deivija\",\"Deivijs\",\"Deivis\",\"Deivs\",\"Deniels\",\"Dēvids\",\"Dēvija\",\"Dēvijs\"],\"date\":\"30\\/12\"},{\"names\":[\"Silvestrs\",\"Silvis\",\"Kalvis\",\"Kalve\",\"Silvesters\",\"Silvestra\",\"Silvestris\"],\"date\":\"31\\/12\"}]}\n"
  },
  {
    "path": "android_mobile/src/main/res/raw/lv_namedays.json",
    "content": "{\"data\":[{\"names\":[\"Laimnesis\",\"Solvita\",\"Solvija\"],\"date\":\"01\\/01\"},{\"names\":[\"Indulis\",\"Ivo\",\"Iva\",\"Ivis\"],\"date\":\"02\\/01\"},{\"names\":[\"Miervaldis\",\"Miervalda\",\"Ringolds\"],\"date\":\"03\\/01\"},{\"names\":[\"Spodra\",\"Ilva\",\"Ilvita\"],\"date\":\"04\\/01\"},{\"names\":[\"Sīmanis\",\"Zintis\"],\"date\":\"05\\/01\"},{\"names\":[\"Spulga\",\"Arnita\"],\"date\":\"06\\/01\"},{\"names\":[\"Rota\",\"Zigmārs\",\"Juliāns\",\"Digmārs\"],\"date\":\"07\\/01\"},{\"names\":[\"Gatis\",\"Ivanda\"],\"date\":\"08\\/01\"},{\"names\":[\"Kaspars\",\"Aksels\",\"Alta\"],\"date\":\"09\\/01\"},{\"names\":[\"Tatjana\",\"Dorisa\"],\"date\":\"10\\/01\"},{\"names\":[\"Smaida\",\"Franciska\"],\"date\":\"11\\/01\"},{\"names\":[\"Reinis\",\"Reina\",\"Reinholds\",\"Renāts\"],\"date\":\"12\\/01\"},{\"names\":[\"Harijs\",\"Ārijs\",\"Āris\",\"Aira\"],\"date\":\"13\\/01\"},{\"names\":[\"Roberts\",\"Roberta\",\"Raitis\",\"Raits\"],\"date\":\"14\\/01\"},{\"names\":[\"Fēlikss\",\"Felicita\"],\"date\":\"15\\/01\"},{\"names\":[\"Lidija\",\"Lida\"],\"date\":\"16\\/01\"},{\"names\":[\"Tenis\",\"Dravis\"],\"date\":\"17\\/01\"},{\"names\":[\"Antons\",\"Antis\",\"Antonijs\"],\"date\":\"18\\/01\"},{\"names\":[\"Andulis\",\"Alnis\"],\"date\":\"19\\/01\"},{\"names\":[\"Oļģerts\",\"Orests\",\"Aļģirds\",\"Aļģis\"],\"date\":\"20\\/01\"},{\"names\":[\"Agnese\",\"Agnija\",\"Agne\"],\"date\":\"21\\/01\"},{\"names\":[\"Austris\"],\"date\":\"22\\/01\"},{\"names\":[\"Grieta\",\"Strauta\",\"Rebeka\"],\"date\":\"23\\/01\"},{\"names\":[\"Krišs\",\"Ksenija\",\"Eglons\",\"Egle\"],\"date\":\"24\\/01\"},{\"names\":[\"Zigurds\",\"Sigurds\",\"Sigvards\"],\"date\":\"25\\/01\"},{\"names\":[\"Ansis\",\"Agnis\",\"Agneta\"],\"date\":\"26\\/01\"},{\"names\":[\"Ilze\",\"Ildze\",\"Izolde\"],\"date\":\"27\\/01\"},{\"names\":[\"Kārlis\",\"Spodris\"],\"date\":\"28\\/01\"},{\"names\":[\"Aivars\",\"Valērijs\"],\"date\":\"29\\/01\"},{\"names\":[\"Tīna\",\"Valentīna\",\"Pārsla\"],\"date\":\"30\\/01\"},{\"names\":[\"Tekla\",\"Violeta\"],\"date\":\"31\\/01\"},{\"names\":[\"Brigita\",\"Indra\",\"Indars\",\"Indris\"],\"date\":\"01\\/02\"},{\"names\":[\"Spīdola\",\"Sonora\"],\"date\":\"02\\/02\"},{\"names\":[\"Aīda\",\"Ida\",\"Vida\"],\"date\":\"03\\/02\"},{\"names\":[\"Daila\",\"Veronika\",\"Dominiks\"],\"date\":\"04\\/02\"},{\"names\":[\"Agate\",\"Selga\",\"Silga\",\"Sinilga\"],\"date\":\"05\\/02\"},{\"names\":[\"Dace\",\"Dārta\",\"Dora\"],\"date\":\"06\\/02\"},{\"names\":[\"Nelda\",\"Rihards\",\"Ričards\",\"Rišards\"],\"date\":\"07\\/02\"},{\"names\":[\"Aldona\",\"Česlavs\"],\"date\":\"08\\/02\"},{\"names\":[\"Simona\",\"Apolonija\"],\"date\":\"09\\/02\"},{\"names\":[\"Paulīne\",\"Paula\",\"Jasmīna\"],\"date\":\"10\\/02\"},{\"names\":[\"Laima\",\"Laimdota\"],\"date\":\"11\\/02\"},{\"names\":[\"Karlīna\",\"Līna\"],\"date\":\"12\\/02\"},{\"names\":[\"Malda\",\"Melita\"],\"date\":\"13\\/02\"},{\"names\":[\"Valentīns\"],\"date\":\"14\\/02\"},{\"names\":[\"Alvils\",\"Olafs\",\"Aloizs\",\"Olavs\"],\"date\":\"15\\/02\"},{\"names\":[\"Jūlija\",\"Džuljeta\"],\"date\":\"16\\/02\"},{\"names\":[\"Donats\",\"Konstance\"],\"date\":\"17\\/02\"},{\"names\":[\"Kora\",\"Kintija\"],\"date\":\"18\\/02\"},{\"names\":[\"Zane\",\"Zuzanna\"],\"date\":\"19\\/02\"},{\"names\":[\"Vitauts\",\"Smuidra\",\"Smuidris\"],\"date\":\"20\\/02\"},{\"names\":[\"Eleonora\",\"Ariadne\"],\"date\":\"21\\/02\"},{\"names\":[\"Ārija\",\"Rigonda\",\"Adrians\",\"Adriāna\",\"Adrija\"],\"date\":\"22\\/02\"},{\"names\":[\"Haralds\",\"Almants\"],\"date\":\"23\\/02\"},{\"names\":[\"Diāna\",\"Dina\",\"Dins\"],\"date\":\"24\\/02\"},{\"names\":[\"Alma\",\"Annemarija\"],\"date\":\"25\\/02\"},{\"names\":[\"Evelīna\",\"Aurēlija\",\"Mētra\"],\"date\":\"26\\/02\"},{\"names\":[\"Līvija\",\"Līva\",\"Andra\"],\"date\":\"27\\/02\"},{\"names\":[\"Skaidrīte\",\"Justs\",\"Skaidra\"],\"date\":\"28\\/02\"},{\"names\":[],\"date\":\"29\\/02\"},{\"names\":[\"Ivars\",\"Ilgvars\"],\"date\":\"01\\/03\"},{\"names\":[\"Lavīze\",\"Luīze\",\"Laila\"],\"date\":\"02\\/03\"},{\"names\":[\"Tālis\",\"Tālavs\",\"Marts\"],\"date\":\"03\\/03\"},{\"names\":[\"Alise\",\"Auce\",\"Enija\"],\"date\":\"04\\/03\"},{\"names\":[\"Austra\",\"Aurora\"],\"date\":\"05\\/03\"},{\"names\":[\"Vents\",\"Centis\",\"Gotfrīds\"],\"date\":\"06\\/03\"},{\"names\":[\"Ella\",\"Elmīra\"],\"date\":\"07\\/03\"},{\"names\":[\"Dagmāra\",\"Marga\",\"Margita\"],\"date\":\"08\\/03\"},{\"names\":[\"Ēvalds\"],\"date\":\"09\\/03\"},{\"names\":[\"Silvija\",\"Laimrota\",\"Liliāna\"],\"date\":\"10\\/03\"},{\"names\":[\"Konstantīns\",\"Agita\"],\"date\":\"11\\/03\"},{\"names\":[\"Aija\",\"Aiva\",\"Aivis\"],\"date\":\"12\\/03\"},{\"names\":[\"Ernests\",\"Balvis\"],\"date\":\"13\\/03\"},{\"names\":[\"Matilde\",\"Ulrika\"],\"date\":\"14\\/03\"},{\"names\":[\"Amilda\",\"Amalda\",\"Imalda\"],\"date\":\"15\\/03\"},{\"names\":[\"Guntis\",\"Guntars\",\"Guntris\"],\"date\":\"16\\/03\"},{\"names\":[\"Ģertrūde\",\"Gerda\"],\"date\":\"17\\/03\"},{\"names\":[\"Ilona\",\"Adelīna\"],\"date\":\"18\\/03\"},{\"names\":[\"Jāzeps\",\"Juzefa\"],\"date\":\"19\\/03\"},{\"names\":[\"Made\",\"Irbe\"],\"date\":\"20\\/03\"},{\"names\":[\"Una\",\"Unigunde\",\"Dzelme\",\"Benedikts\",\"Benedikta\"],\"date\":\"21\\/03\"},{\"names\":[\"Tamāra\",\"Dziedra\",\"Gabriels\",\"Gabriela\"],\"date\":\"22\\/03\"},{\"names\":[\"Mirdza\",\"Žanete\",\"Žanna\"],\"date\":\"23\\/03\"},{\"names\":[\"Kazimirs\",\"Izidors\"],\"date\":\"24\\/03\"},{\"names\":[\"Māra\",\"Mārīte\",\"Marita\",\"Mare\"],\"date\":\"25\\/03\"},{\"names\":[\"Eiženija\",\"Ženija\"],\"date\":\"26\\/03\"},{\"names\":[\"Gustavs\",\"Gusts\",\"Tālrīts\"],\"date\":\"27\\/03\"},{\"names\":[\"Gunta\",\"Ginta\",\"Gunda\"],\"date\":\"28\\/03\"},{\"names\":[\"Aldonis\",\"Agija\"],\"date\":\"29\\/03\"},{\"names\":[\"Nanija\",\"Ilgmārs\"],\"date\":\"30\\/03\"},{\"names\":[\"Gvido\",\"Atvars\"],\"date\":\"31\\/03\"},{\"names\":[\"Dagnis\",\"Dagne\"],\"date\":\"01\\/04\"},{\"names\":[\"Irmgarde\"],\"date\":\"02\\/04\"},{\"names\":[\"Daira\",\"Dairis\",\"Daiva\"],\"date\":\"03\\/04\"},{\"names\":[\"Valda\",\"Herta\",\"Ārvalda\",\"Ārvalds\",\"Ārvaldis\"],\"date\":\"04\\/04\"},{\"names\":[\"Vija\",\"Vidaga\",\"Aivija\"],\"date\":\"05\\/04\"},{\"names\":[\"Zinta\",\"Vīlips\",\"Filips\",\"Dzinta\"],\"date\":\"06\\/04\"},{\"names\":[\"Zina\",\"Zinaīda\",\"Helmuts\"],\"date\":\"07\\/04\"},{\"names\":[\"Edgars\",\"Danute\",\"Dana\",\"Dans\"],\"date\":\"08\\/04\"},{\"names\":[\"Valērija\",\"Žubīte\",\"Alla\"],\"date\":\"09\\/04\"},{\"names\":[\"Anita\",\"Anitra\",\"Zīle\",\"Annika\"],\"date\":\"10\\/04\"},{\"names\":[\"Hermanis\",\"Vilmārs\"],\"date\":\"11\\/04\"},{\"names\":[\"Jūlijs\",\"Ainis\"],\"date\":\"12\\/04\"},{\"names\":[\"Egils\",\"Egīls\",\"Nauris\"],\"date\":\"13\\/04\"},{\"names\":[\"Strauja\",\"Gudrīte\"],\"date\":\"14\\/04\"},{\"names\":[\"Aelita\",\"Gastons\"],\"date\":\"15\\/04\"},{\"names\":[\"Mintauts\",\"Alfs\",\"Bernadeta\"],\"date\":\"16\\/04\"},{\"names\":[\"Rūdolfs\",\"Viviāna\",\"Rūdis\"],\"date\":\"17\\/04\"},{\"names\":[\"Laura\",\"Jadviga\"],\"date\":\"18\\/04\"},{\"names\":[\"Vēsma\",\"Fanija\"],\"date\":\"19\\/04\"},{\"names\":[\"Mirta\",\"Ziedīte\"],\"date\":\"20\\/04\"},{\"names\":[\"Marģers\",\"Anastasija\"],\"date\":\"21\\/04\"},{\"names\":[\"Armands\",\"Armanda\"],\"date\":\"22\\/04\"},{\"names\":[\"Jurģis\",\"Juris\",\"Georgs\"],\"date\":\"23\\/04\"},{\"names\":[\"Visvaldis\",\"Nameda\",\"Ritvaldis\"],\"date\":\"24\\/04\"},{\"names\":[\"Līksma\",\"Bārbala\"],\"date\":\"25\\/04\"},{\"names\":[\"Alīna\",\"Sandris\",\"Rūsiņš\"],\"date\":\"26\\/04\"},{\"names\":[\"Tāle\",\"Raimonda\",\"Raina\",\"Klementīne\"],\"date\":\"27\\/04\"},{\"names\":[\"Gundega\",\"Terēze\"],\"date\":\"28\\/04\"},{\"names\":[\"Vilnis\",\"Raimonds\",\"Laine\"],\"date\":\"29\\/04\"},{\"names\":[\"Lilija\",\"Liāna\"],\"date\":\"30\\/04\"},{\"names\":[\"Ziedonis\"],\"date\":\"01\\/05\"},{\"names\":[\"Zigmunds\",\"Sigmunds\",\"Zigismunds\"],\"date\":\"02\\/05\"},{\"names\":[\"Gints\",\"Uvis\"],\"date\":\"03\\/05\"},{\"names\":[\"Vizbulīte\",\"Viola\",\"Vijolīte\"],\"date\":\"04\\/05\"},{\"names\":[\"Ģirts\",\"Ģederts\"],\"date\":\"05\\/05\"},{\"names\":[\"Gaidis\",\"Didzis\"],\"date\":\"06\\/05\"},{\"names\":[\"Henriete\",\"Henrijs\",\"Jete\",\"Enriko\"],\"date\":\"07\\/05\"},{\"names\":[\"Staņislavs\",\"Staņislava\",\"Stefānija\"],\"date\":\"08\\/05\"},{\"names\":[\"Klāvs\",\"Einārs\",\"Ervīns\"],\"date\":\"09\\/05\"},{\"names\":[\"Maija\",\"Paija\"],\"date\":\"10\\/05\"},{\"names\":[\"Milda\",\"Karmena\",\"Manfreds\"],\"date\":\"11\\/05\"},{\"names\":[\"Valija\",\"Ināra\",\"Ina\",\"Inārs\"],\"date\":\"12\\/05\"},{\"names\":[\"Irēna\",\"Irīna\",\"Ira\",\"Iraīda\"],\"date\":\"13\\/05\"},{\"names\":[\"Krišjānis\",\"Elfa\",\"Aivita\",\"Elvita\"],\"date\":\"14\\/05\"},{\"names\":[\"Sofija\",\"Taiga\",\"Airita\",\"Arita\"],\"date\":\"15\\/05\"},{\"names\":[\"Edvīns\",\"Edijs\"],\"date\":\"16\\/05\"},{\"names\":[\"Herberts\",\"Dailis\",\"Umberts\"],\"date\":\"17\\/05\"},{\"names\":[\"Inese\",\"Inesis\",\"Ēriks\"],\"date\":\"18\\/05\"},{\"names\":[\"Lita\",\"Sibilla\",\"Teika\"],\"date\":\"19\\/05\"},{\"names\":[\"Venta\",\"Salvis\",\"Selva\"],\"date\":\"20\\/05\"},{\"names\":[\"Ernestīne\",\"Ingmārs\",\"Akvelīna\"],\"date\":\"21\\/05\"},{\"names\":[\"Emīlija\"],\"date\":\"22\\/05\"},{\"names\":[\"Leontīne\",\"Leokādija\",\"Lonija\",\"Ligija\"],\"date\":\"23\\/05\"},{\"names\":[\"Ilvija\",\"Marlēna\",\"Ziedone\"],\"date\":\"24\\/05\"},{\"names\":[\"Anšlavs\",\"Junora\"],\"date\":\"25\\/05\"},{\"names\":[\"Edvards\",\"Edvarts\",\"Eduards\",\"Varis\"],\"date\":\"26\\/05\"},{\"names\":[\"Dzidra\",\"Gunita\",\"Loreta\",\"Dzidris\"],\"date\":\"27\\/05\"},{\"names\":[\"Vilis\",\"Vilhelms\"],\"date\":\"28\\/05\"},{\"names\":[\"Maksis\",\"Maksims\",\"Raivis\",\"Raivo\"],\"date\":\"29\\/05\"},{\"names\":[\"Vitolds\",\"Lolita\",\"Letīcija\"],\"date\":\"30\\/05\"},{\"names\":[\"Alīda\",\"Jūsma\"],\"date\":\"31\\/05\"},{\"names\":[\"Biruta\",\"Mairita\",\"Bernedīne\"],\"date\":\"01\\/06\"},{\"names\":[\"Lība\",\"Emma\"],\"date\":\"02\\/06\"},{\"names\":[\"Inta\",\"Ineta\",\"Intra\"],\"date\":\"03\\/06\"},{\"names\":[\"Elfrīda\",\"Sintija\",\"Sindija\"],\"date\":\"04\\/06\"},{\"names\":[\"Igors\",\"Margots\",\"Ingvars\"],\"date\":\"05\\/06\"},{\"names\":[\"Ingrīda\",\"Ardis\"],\"date\":\"06\\/06\"},{\"names\":[\"Gaida\",\"Arnis\",\"Arno\"],\"date\":\"07\\/06\"},{\"names\":[\"Frīdis\",\"Frīda\",\"Mundra\"],\"date\":\"08\\/06\"},{\"names\":[\"Ligita\",\"Gita\"],\"date\":\"09\\/06\"},{\"names\":[\"Malva\",\"Anatols\",\"Anatolijs\"],\"date\":\"10\\/06\"},{\"names\":[\"Ingus\",\"Mairis\",\"Vidvuds\"],\"date\":\"11\\/06\"},{\"names\":[\"Nora\",\"Lenora\",\"Ija\"],\"date\":\"12\\/06\"},{\"names\":[\"Zigfrīds\",\"Ainārs\",\"Uva\"],\"date\":\"13\\/06\"},{\"names\":[\"Tija\",\"Saiva\",\"Sentis\",\"Santis\",\"Saivis\"],\"date\":\"14\\/06\"},{\"names\":[\"Baņuta\",\"Žermēna\",\"Vilija\",\"Vits\"],\"date\":\"15\\/06\"},{\"names\":[\"Justīne\",\"Juta\"],\"date\":\"16\\/06\"},{\"names\":[\"Artūrs\",\"Artis\"],\"date\":\"17\\/06\"},{\"names\":[\"Alberts\",\"Madis\"],\"date\":\"18\\/06\"},{\"names\":[\"Viktors\",\"Nils\"],\"date\":\"19\\/06\"},{\"names\":[\"Rasma\",\"Rasa\",\"Maira\"],\"date\":\"20\\/06\"},{\"names\":[\"Emīls\",\"Egita\",\"Monvīds\"],\"date\":\"21\\/06\"},{\"names\":[\"Ludmila\",\"Laimdots\",\"Laimiņš\"],\"date\":\"22\\/06\"},{\"names\":[\"Līga\"],\"date\":\"23\\/06\"},{\"names\":[\"Jānis\"],\"date\":\"24\\/06\"},{\"names\":[\"Milija\",\"Maiga\"],\"date\":\"25\\/06\"},{\"names\":[\"Ausma\",\"Inguna\",\"Ingūna\",\"Inguns\",\"Ausmis\"],\"date\":\"26\\/06\"},{\"names\":[\"Malvīne\",\"Malvis\"],\"date\":\"27\\/06\"},{\"names\":[\"Viesturs\",\"Kitija\",\"Viestards\"],\"date\":\"28\\/06\"},{\"names\":[\"Pēteris\",\"Pāvils\",\"Pauls\",\"Paulis\"],\"date\":\"29\\/06\"},{\"names\":[\"Tālivaldis\",\"Mareks\"],\"date\":\"30\\/06\"},{\"names\":[\"Imants\",\"Rimants\",\"Ingars\",\"Intars\"],\"date\":\"01\\/07\"},{\"names\":[\"Lauma\",\"Ilvars\",\"Halina\"],\"date\":\"02\\/07\"},{\"names\":[\"Benita\",\"Everita\",\"Verita\",\"Emerita\"],\"date\":\"03\\/07\"},{\"names\":[\"Ulvis\",\"Uldis\",\"Sandis\",\"Sandijs\"],\"date\":\"04\\/07\"},{\"names\":[\"Andžs\",\"Andžejs\",\"Edīte\",\"Esmeralda\"],\"date\":\"05\\/07\"},{\"names\":[\"Anrijs\",\"Arkādijs\"],\"date\":\"06\\/07\"},{\"names\":[\"Alda\",\"Maruta\"],\"date\":\"07\\/07\"},{\"names\":[\"Antra\",\"Adele\",\"Ada\"],\"date\":\"08\\/07\"},{\"names\":[\"Zaiga\",\"Asne\",\"Asna\"],\"date\":\"09\\/07\"},{\"names\":[\"Lija\",\"Olīvija\",\"Olivers\",\"Odrija\"],\"date\":\"10\\/07\"},{\"names\":[\"Leonora\",\"Svens\"],\"date\":\"11\\/07\"},{\"names\":[\"Indriķis\",\"Ints\",\"Namejs\"],\"date\":\"12\\/07\"},{\"names\":[\"Margrieta\",\"Margarita\"],\"date\":\"13\\/07\"},{\"names\":[\"Oskars\",\"Ritvars\",\"Anvars\"],\"date\":\"14\\/07\"},{\"names\":[\"Egons\",\"Egmonts\",\"Egija\",\"Henriks\",\"Heinrihs\"],\"date\":\"15\\/07\"},{\"names\":[\"Hermīne\",\"Estere\",\"Liepa\"],\"date\":\"16\\/07\"},{\"names\":[\"Aleksis\",\"Aleksejs\",\"Alekss\"],\"date\":\"17\\/07\"},{\"names\":[\"Rozālija\",\"Roze\"],\"date\":\"18\\/07\"},{\"names\":[\"Jautrīte\",\"Kamila\",\"Digna\",\"Sāra\"],\"date\":\"19\\/07\"},{\"names\":[\"Ritma\",\"Ramona\"],\"date\":\"20\\/07\"},{\"names\":[\"Meldra\",\"Meldris\",\"Melisa\"],\"date\":\"21\\/07\"},{\"names\":[\"Marija\",\"Marika\",\"Marina\"],\"date\":\"22\\/07\"},{\"names\":[\"Magda\",\"Magone\",\"Mērija\",\"Magdalēna\"],\"date\":\"23\\/07\"},{\"names\":[\"Kristīne\",\"Kristīna\",\"Krista\",\"Kristiāna\",\"Kristiāns\"],\"date\":\"24\\/07\"},{\"names\":[\"Jēkabs\",\"Žaklīna\"],\"date\":\"25\\/07\"},{\"names\":[\"Anna\",\"Ance\",\"Annija\"],\"date\":\"26\\/07\"},{\"names\":[\"Marta\",\"Dita\",\"Dite\"],\"date\":\"27\\/07\"},{\"names\":[\"Cecīlija\",\"Cilda\"],\"date\":\"28\\/07\"},{\"names\":[\"Edmunds\",\"Edžus\",\"Vidmants\"],\"date\":\"29\\/07\"},{\"names\":[\"Valters\",\"Renārs\",\"Regnārs\"],\"date\":\"30\\/07\"},{\"names\":[\"Rūta\",\"Ruta\",\"Angelika\",\"Sigita\"],\"date\":\"31\\/07\"},{\"names\":[\"Albīns\",\"Albīna\"],\"date\":\"01\\/08\"},{\"names\":[\"Normunds\",\"Stefans\"],\"date\":\"02\\/08\"},{\"names\":[\"Augusts\"],\"date\":\"03\\/08\"},{\"names\":[\"Romāns\",\"Romualds\",\"Romualda\"],\"date\":\"04\\/08\"},{\"names\":[\"Osvalds\",\"Arvils\"],\"date\":\"05\\/08\"},{\"names\":[\"Askolds\",\"Aisma\"],\"date\":\"06\\/08\"},{\"names\":[\"Alfrēds\",\"Madars\",\"Fredis\"],\"date\":\"07\\/08\"},{\"names\":[\"Mudīte\",\"Vladislavs\",\"Vladislava\"],\"date\":\"08\\/08\"},{\"names\":[\"Madara\",\"Genoveva\",\"Genovefa\"],\"date\":\"09\\/08\"},{\"names\":[\"Brencis\",\"Audris\",\"Inuta\"],\"date\":\"10\\/08\"},{\"names\":[\"Olga\",\"Zita\",\"Liega\",\"Zigita\"],\"date\":\"11\\/08\"},{\"names\":[\"Vizma\",\"Klāra\"],\"date\":\"12\\/08\"},{\"names\":[\"Elvīra\",\"Velga\",\"Rēzija\"],\"date\":\"13\\/08\"},{\"names\":[\"Zelma\",\"Zemgus\",\"Virma\"],\"date\":\"14\\/08\"},{\"names\":[\"Zenta\",\"Dzelde\",\"Zelda\"],\"date\":\"15\\/08\"},{\"names\":[\"Astra\",\"Astrīda\"],\"date\":\"16\\/08\"},{\"names\":[\"Vineta\",\"Oļegs\"],\"date\":\"17\\/08\"},{\"names\":[\"Liene\",\"Helēna\",\"Elena\",\"Ellena\",\"Liena\"],\"date\":\"18\\/08\"},{\"names\":[\"Melānija\",\"Imanta\"],\"date\":\"19\\/08\"},{\"names\":[\"Bernhards\",\"Boriss\",\"Rojs\"],\"date\":\"20\\/08\"},{\"names\":[\"Janīna\",\"Linda\"],\"date\":\"21\\/08\"},{\"names\":[\"Rudīte\",\"Everts\"],\"date\":\"22\\/08\"},{\"names\":[\"Vitālijs\",\"Ralfs\",\"Valgudis\"],\"date\":\"23\\/08\"},{\"names\":[\"Bērtulis\",\"Boļeslavs\"],\"date\":\"24\\/08\"},{\"names\":[\"Ludvigs\",\"Ludis\",\"Ivonna\",\"Patrīcija\",\"Patriks\"],\"date\":\"25\\/08\"},{\"names\":[\"Natālija\",\"Tālija\",\"Broņislavs\",\"Broņislava\"],\"date\":\"26\\/08\"},{\"names\":[\"Žanis\",\"Jorens\",\"Alens\"],\"date\":\"27\\/08\"},{\"names\":[\"Auguste\",\"Guste\"],\"date\":\"28\\/08\"},{\"names\":[\"Armīns\",\"Vismants\",\"Aiga\"],\"date\":\"29\\/08\"},{\"names\":[\"Alvis\",\"Jolanta\",\"Samanta\"],\"date\":\"30\\/08\"},{\"names\":[\"Vilma\",\"Aigars\"],\"date\":\"31\\/08\"},{\"names\":[\"Ilmārs\",\"Iluta\",\"Austrums\"],\"date\":\"01\\/09\"},{\"names\":[\"Elīza\",\"Lizete\",\"Zete\"],\"date\":\"02\\/09\"},{\"names\":[\"Berta\",\"Bella\"],\"date\":\"03\\/09\"},{\"names\":[\"Dzintra\",\"Dzintara\",\"Dzintars\"],\"date\":\"04\\/09\"},{\"names\":[\"Klaudija\",\"Persijs\",\"Vaida\"],\"date\":\"05\\/09\"},{\"names\":[\"Maigonis\",\"Magnuss\",\"Mariuss\"],\"date\":\"06\\/09\"},{\"names\":[\"Regīna\",\"Ermīns\"],\"date\":\"07\\/09\"},{\"names\":[\"Ilga\"],\"date\":\"08\\/09\"},{\"names\":[\"Bruno\",\"Telma\"],\"date\":\"09\\/09\"},{\"names\":[\"Jausma\",\"Albertīne\"],\"date\":\"10\\/09\"},{\"names\":[\"Signe\",\"Signija\"],\"date\":\"11\\/09\"},{\"names\":[\"Erna\",\"Evita\",\"Eva\"],\"date\":\"12\\/09\"},{\"names\":[\"Iza\",\"Izabella\"],\"date\":\"13\\/09\"},{\"names\":[\"Sanita\",\"Santa\",\"Sanda\",\"Sanija\",\"Sandija\"],\"date\":\"14\\/09\"},{\"names\":[\"Sandra\",\"Gunvaldis\",\"Gunvaris\",\"Sondra\"],\"date\":\"15\\/09\"},{\"names\":[\"Asja\",\"Asnate\",\"Dāgs\"],\"date\":\"16\\/09\"},{\"names\":[\"Vera\",\"Vaira\",\"Vairis\"],\"date\":\"17\\/09\"},{\"names\":[\"Liesma\",\"Elita\",\"Alita\"],\"date\":\"18\\/09\"},{\"names\":[\"Verners\",\"Muntis\"],\"date\":\"19\\/09\"},{\"names\":[\"Guntra\",\"Ginters\",\"Marianna\"],\"date\":\"20\\/09\"},{\"names\":[\"Modris\",\"Matīss\",\"Mariss\"],\"date\":\"21\\/09\"},{\"names\":[\"Māris\",\"Mārica\",\"Maigurs\"],\"date\":\"22\\/09\"},{\"names\":[\"Vanda\",\"Veneranda\",\"Venija\"],\"date\":\"23\\/09\"},{\"names\":[\"Agris\",\"Agrita\"],\"date\":\"24\\/09\"},{\"names\":[\"Rodrigo\",\"Rauls\"],\"date\":\"25\\/09\"},{\"names\":[\"Gundars\",\"Kurts\",\"Knuts\"],\"date\":\"26\\/09\"},{\"names\":[\"Ādolfs\",\"Ilgonis\"],\"date\":\"27\\/09\"},{\"names\":[\"Sergejs\",\"Svetlana\",\"Lana\"],\"date\":\"28\\/09\"},{\"names\":[\"Miķelis\",\"Mikus\",\"Miks\",\"Mihails\"],\"date\":\"29\\/09\"},{\"names\":[\"Elma\",\"Menarda\",\"Elna\"],\"date\":\"30\\/09\"},{\"names\":[\"Zanda\",\"Lāsma\",\"Zandis\"],\"date\":\"01\\/10\"},{\"names\":[\"Ilma\",\"Skaidris\"],\"date\":\"02\\/10\"},{\"names\":[\"Elza\",\"Ilizana\"],\"date\":\"03\\/10\"},{\"names\":[\"Modra\",\"Francis\",\"Dmitrijs\"],\"date\":\"04\\/10\"},{\"names\":[\"Amālija\",\"Amēlija\"],\"date\":\"05\\/10\"},{\"names\":[\"Monika\",\"Zilgma\",\"Zilga\"],\"date\":\"06\\/10\"},{\"names\":[\"Daumants\",\"Druvvaldis\"],\"date\":\"07\\/10\"},{\"names\":[\"Aina\",\"Anete\"],\"date\":\"08\\/10\"},{\"names\":[\"Elga\",\"Helga\",\"Elgars\"],\"date\":\"09\\/10\"},{\"names\":[\"Arvīds\",\"Arvis\",\"Druvis\"],\"date\":\"10\\/10\"},{\"names\":[\"Monta\",\"Tince\",\"Silva\"],\"date\":\"11\\/10\"},{\"names\":[\"Valfrīds\",\"Kira\"],\"date\":\"12\\/10\"},{\"names\":[\"Irma\",\"Mirga\"],\"date\":\"13\\/10\"},{\"names\":[\"Vilhelmīne\",\"Minna\"],\"date\":\"14\\/10\"},{\"names\":[\"Eda\",\"Hedviga\",\"Helvijs\"],\"date\":\"15\\/10\"},{\"names\":[\"Daiga\",\"Dinija\",\"Dinārs\"],\"date\":\"16\\/10\"},{\"names\":[\"Gaits\",\"Karīna\",\"Gaitis\"],\"date\":\"17\\/10\"},{\"names\":[\"Rolands\",\"Rolanda\",\"Ronalds\",\"Erlends\",\"Lūkass\"],\"date\":\"18\\/10\"},{\"names\":[\"Elīna\",\"Drosma\",\"Drosmis\"],\"date\":\"19\\/10\"},{\"names\":[\"Leonīds\",\"Leonīda\"],\"date\":\"20\\/10\"},{\"names\":[\"Urzula\",\"Severīns\"],\"date\":\"21\\/10\"},{\"names\":[\"Īrisa\",\"Irīda\",\"Airisa\"],\"date\":\"22\\/10\"},{\"names\":[\"Daina\",\"Dainis\",\"Dainida\"],\"date\":\"23\\/10\"},{\"names\":[\"Renāte\",\"Modrīte\",\"Mudrīte\"],\"date\":\"24\\/10\"},{\"names\":[\"Beāte\",\"Beatrise\"],\"date\":\"25\\/10\"},{\"names\":[\"Amanda\",\"Kaiva\",\"Amanta\"],\"date\":\"26\\/10\"},{\"names\":[\"Lilita\",\"Irita\",\"Ita\"],\"date\":\"27\\/10\"},{\"names\":[\"Ņina\",\"Ninona\",\"Antoņina\",\"Oksana\"],\"date\":\"28\\/10\"},{\"names\":[\"Laimonis\",\"Elvijs\",\"Elva\",\"Elvis\",\"Laimis\"],\"date\":\"29\\/10\"},{\"names\":[\"Nadīna\",\"Ulla\",\"Adīna\"],\"date\":\"30\\/10\"},{\"names\":[\"Valts\",\"Rinalds\",\"Rinalda\"],\"date\":\"31\\/10\"},{\"names\":[\"Ikars\"],\"date\":\"01\\/11\"},{\"names\":[\"Vivita\",\"Dzīle\",\"Viva\"],\"date\":\"02\\/11\"},{\"names\":[\"Ērika\",\"Dagnija\"],\"date\":\"03\\/11\"},{\"names\":[\"Atis\",\"Otomārs\",\"Oto\"],\"date\":\"04\\/11\"},{\"names\":[\"Šarlote\",\"Lote\"],\"date\":\"05\\/11\"},{\"names\":[\"Linards\",\"Leons\",\"Leo\",\"Leonards\",\"Leonarda\"],\"date\":\"06\\/11\"},{\"names\":[\"Helma\",\"Lotārs\"],\"date\":\"07\\/11\"},{\"names\":[\"Aleksandra\",\"Agra\"],\"date\":\"08\\/11\"},{\"names\":[\"Teodors\"],\"date\":\"09\\/11\"},{\"names\":[\"Mārtiņš\",\"Mārcis\",\"Markuss\",\"Marks\"],\"date\":\"10\\/11\"},{\"names\":[\"Ojārs\",\"Rainers\",\"Nellija\"],\"date\":\"11\\/11\"},{\"names\":[\"Kaija\",\"Kornēlija\"],\"date\":\"12\\/11\"},{\"names\":[\"Eižens\",\"Jevgeņijs\",\"Jevgeņija\"],\"date\":\"13\\/11\"},{\"names\":[\"Fricis\",\"Vikentijs\",\"Vincents\"],\"date\":\"14\\/11\"},{\"names\":[\"Leopolds\",\"Undīne\",\"Unda\"],\"date\":\"15\\/11\"},{\"names\":[\"Banga\",\"Glorija\"],\"date\":\"16\\/11\"},{\"names\":[\"Hugo\",\"Uga\",\"Uģis\"],\"date\":\"17\\/11\"},{\"names\":[\"Aleksandrs\",\"Doloresa\",\"Brīve\"],\"date\":\"18\\/11\"},{\"names\":[\"Elizabete\",\"Liza\",\"Līze\",\"Betija\"],\"date\":\"19\\/11\"},{\"names\":[\"Anda\",\"Andīna\",\"Vigo\"],\"date\":\"20\\/11\"},{\"names\":[\"Zeltīte\",\"Andis\"],\"date\":\"21\\/11\"},{\"names\":[\"Aldis\",\"Alfons\",\"Aldris\"],\"date\":\"22\\/11\"},{\"names\":[\"Zigrīda\",\"Zigfrīda\",\"Zigrīds\"],\"date\":\"23\\/11\"},{\"names\":[\"Velta\",\"Velda\"],\"date\":\"24\\/11\"},{\"names\":[\"Katrīna\",\"Kate\",\"Kadrija\",\"Trīne\",\"Katrīne\"],\"date\":\"25\\/11\"},{\"names\":[\"Konrāds\",\"Sebastians\"],\"date\":\"26\\/11\"},{\"names\":[\"Lauris\",\"Norberts\"],\"date\":\"27\\/11\"},{\"names\":[\"Rita\",\"Vita\",\"Olita\"],\"date\":\"28\\/11\"},{\"names\":[\"Ignats\",\"Virgīnija\"],\"date\":\"29\\/11\"},{\"names\":[\"Andrievs\",\"Andrejs\",\"Andris\"],\"date\":\"30\\/11\"},{\"names\":[\"Arnolds\",\"Emanuels\"],\"date\":\"01\\/12\"},{\"names\":[\"Meta\",\"Sniedze\"],\"date\":\"02\\/12\"},{\"names\":[\"Evija\",\"Raita\",\"Jogita\"],\"date\":\"03\\/12\"},{\"names\":[\"Baiba\",\"Barbara\",\"Barba\"],\"date\":\"04\\/12\"},{\"names\":[\"Sabīne\",\"Sarma\",\"Klaudijs\"],\"date\":\"05\\/12\"},{\"names\":[\"Nikolajs\",\"Niklāvs\",\"Niks\",\"Nikola\"],\"date\":\"06\\/12\"},{\"names\":[\"Antonija\",\"Anta\",\"Dzirkstīte\"],\"date\":\"07\\/12\"},{\"names\":[\"Gunārs\",\"Vladimirs\",\"Gunis\"],\"date\":\"08\\/12\"},{\"names\":[\"Tabita\",\"Sarmīte\"],\"date\":\"09\\/12\"},{\"names\":[\"Guna\",\"Judīte\"],\"date\":\"10\\/12\"},{\"names\":[\"Voldemārs\",\"Valdemārs\",\"Valdis\"],\"date\":\"11\\/12\"},{\"names\":[\"Otīlija\",\"Iveta\"],\"date\":\"12\\/12\"},{\"names\":[\"Lūcija\",\"Veldze\"],\"date\":\"13\\/12\"},{\"names\":[\"Auseklis\",\"Gaisma\"],\"date\":\"14\\/12\"},{\"names\":[\"Johanna\",\"Hanna\",\"Jana\"],\"date\":\"15\\/12\"},{\"names\":[\"Alvīne\"],\"date\":\"16\\/12\"},{\"names\":[\"Hilda\",\"Teiksma\"],\"date\":\"17\\/12\"},{\"names\":[\"Kristaps\",\"Kristofers\",\"Krists\",\"Klinta\",\"Kristers\"],\"date\":\"18\\/12\"},{\"names\":[\"Lelde\",\"Sarmis\"],\"date\":\"19\\/12\"},{\"names\":[\"Arta\",\"Minjona\"],\"date\":\"20\\/12\"},{\"names\":[\"Toms\",\"Tomass\",\"Saulcerīte\"],\"date\":\"21\\/12\"},{\"names\":[\"Saulvedis\"],\"date\":\"22\\/12\"},{\"names\":[\"Viktorija\",\"Balva\"],\"date\":\"23\\/12\"},{\"names\":[\"Ādams\",\"Ieva\"],\"date\":\"24\\/12\"},{\"names\":[\"Stella\",\"Larisa\"],\"date\":\"25\\/12\"},{\"names\":[\"Dainuvīte\",\"Gija\",\"Megija\"],\"date\":\"26\\/12\"},{\"names\":[\"Elmārs\",\"Inita\",\"Helmārs\"],\"date\":\"27\\/12\"},{\"names\":[\"Inga\",\"Ivita\",\"Irvita\",\"Ingeborga\"],\"date\":\"28\\/12\"},{\"names\":[\"Solveiga\",\"Ilgona\"],\"date\":\"29\\/12\"},{\"names\":[\"Dāvids\",\"Dāvis\",\"Dāniels\",\"Daniela\",\"Daniels\"],\"date\":\"30\\/12\"},{\"names\":[\"Silvestrs\",\"Silvis\",\"Kalvis\"],\"date\":\"31\\/12\"}]}"
  },
  {
    "path": "android_mobile/src/main/res/raw/ro_namedays.json",
    "content": "{\"special\":[{\"toEaster\":-1,\"variations\":[\"Florin\",\"Viorel\",\"Viorica\",\"Florin\",\"Viorel\",\"Florian\",\"Florea\",\"Florentin\",\"Florinel\",\"Trandafir\",\"Bujor\",\"Floricel\",\"Margarit\",\"Mărgărit\",\"Crin\",\"Viorica\",\"Florentina\",\"Florica\",\"Floarea\",\"Florina\",\"Garofita\",\"Garofița\",\"Liliana\",\"Iris\",\"Lacramioara\",\"Lăcrămioara\",\"Anemona\",\"Panseluta\",\"Panseluța\",\"Delia\",\"Narcisa\",\"Malina\",\"Mălina\",\"Crina\",\"Violeta\"]}],\"data\":[{\"date\":\"1\\/1\",\"names\":[\"Vasile\",\"Vasilica\",\"Vasilică\",\"Silica\",\"Silică\",\"Sile\",\"Vasi\",\"Sica\",\"Sică\",\"Vasilca\",\"Vasilcă\",\"Vasila\",\"Vasilă\"]},{\"date\":\"7\\/1\",\"names\":[\"Ioana\",\"Ionela\",\"Nela\",\"Ionelia\",\"Ioan\",\"Ion\",\"Ionut\",\"Ionuț\",\"Ionel\",\"Nelu\",\"Neluța\",\"Neluta\"]},{\"date\":\"23\\/4\",\"names\":[\"George\",\"Gheorghita\",\"Gheorghiță\",\"Ghiorghita\",\"Ghiorghiță\",\"Gane\",\"Ghica\",\"Ghergus\",\"Gherguș\",\"Goga\",\"Gogea\",\"Giurea\",\"Giurca\",\"Gelu\",\"Geo\",\"Georgel\",\"Gheorghies\",\"Gheorghieș\",\"Gica\",\"Gică\",\"Gyuri\",\"Iorga\",\"Iorgu\",\"Georgeta\",\"Gherghina\",\"Georgiana\",\"Geta\",\"Gheorghina\"]},{\"date\":\"5\\/5\",\"names\":[\"Irina\"]},{\"date\":\"21\\/5\",\"names\":[\"Constantin\",\"Costi\",\"Costică\",\"Costica\",\"Codin\",\"Codina\",\"Constanța\",\"Constanta\",\"Constantina\",\"Costache\",\"Costas\",\"Costel\",\"Costin\",\"Dinu\",\"Tică\",\"Tica\",\"Titi\",\"Titel\",\"Elena\",\"Ela\",\"Ella\",\"Eleonora\",\"Ileana\",\"Leana\",\"Ilinca\",\"Lenus\",\"Lenuș\",\"Nuti\",\"Nuți\",\"Lenuta\",\"Lenuța\"]},{\"date\":\"29\\/6\",\"names\":[\"Petru\",\"Pavel\",\"Petruta\",\"Petruța\",\"Petre\",\"Paul\",\"Paula\",\"Peter\",\"Petronela\",\"Paulina\",\"Petrica\",\"Petrică\"]},{\"date\":\"20\\/7\",\"names\":[\"Ilie\",\"Iliuta\",\"Iliuța\",\"Iliut\",\"Iliuț\",\"Ilia\",\"Iulia\",\"Ilinca\",\"Iulian\",\"Iuliana\"]},{\"date\":\"15\\/8\",\"names\":[\"Mari\",\"Meri\",\"Marioara\",\"Măriuța\",\"Mariuta\",\"Marița\",\"Marita\",\"Mara\",\"Mariana\",\"Marilena\",\"Marina\",\"Marinela\",\"Marusia\",\"Mariuca\",\"Măriuca\",\"Maricica\",\"Mia\",\"Mioara\",\"Marian\",\"Marin\"]},{\"date\":\"30\\/8\",\"names\":[\"Alexandra\",\"Sanda\",\"Sandra\",\"Alexa\",\"Alex\",\"Alexia\",\"Alessia\",\"Alexandru\",\"Alexe\",\"Sandu\",\"Săndel\",\"Sandel\"]},{\"date\":\"9\\/9\",\"names\":[\"Ana\",\"Anna\"]},{\"date\":\"26\\/10\",\"names\":[\"Dimitrie\",\"Dumitru\",\"Dumitra\",\"Dumitrita\",\"Dumitrița\",\"Dumitrica\",\"Dima\",\"Mitica\",\"Mitică\",\"Mitu\",\"Mitrea\",\"Mitrut\",\"Mitruț\"]},{\"date\":\"8\\/11\",\"names\":[\"Mihai\",\"Michi\",\"Mihaita\",\"Mihăiță\",\"Misu\",\"Mișu\",\"Mihnea\",\"Mihalache\",\"Mihalcea\",\"Mihu\",\"Mihaela\",\"Mihaiela\",\"Misa\",\"Mihaila\",\"Mihăilă\",\"Gavril\",\"Gabriel\",\"Gabriela\",\"Gabita\",\"Găbiță\",\"Gabi\",\"Gavrila\",\"Gavrilă\",\"Gavriil.\"]},{\"date\":\"30\\/11\",\"names\":[\"Andrei\",\"Andreea\",\"Andra\",\"Andrea\",\"Andreia\",\"Andruta\",\"Andrusa\",\"Andruța\",\"Andrușa\",\"Andras\",\"Andraș\",\"Endre\",\"Andreeas\",\"Andreas\"]},{\"date\":\"25\\/12\",\"names\":[\"Cristi\",\"Cristina\",\"Christina\",\"Cristiana\",\"Cristian\",\"Cris\",\"Chris\"]},{\"date\":\"27\\/12\",\"names\":[\"Ștefan\",\"Stefan\",\"Istvan\",\"Fanel\",\"Fănel\",\"Stefanel\",\"Ștefănel\",\"Stefanut\",\"Ștefănuț\",\"Fane\",\"Stefanus\",\"Ștefănuș\",\"Fanica\",\"Fănică\",\"Fanuta\",\"Fănuță\",\"Stefania\",\"Ștefania\",\"Stefana\",\"Ștefana\",\"Fanica\",\"Fănica\",\"Fana\"]}]}\n"
  },
  {
    "path": "android_mobile/src/main/res/raw/ru_namedays.json",
    "content": "{\"data\":[{\"names\":[\"Ulyana\"],\"date\":\"03\\/01\"},{\"names\":[\"Anastasia\"],\"date\":\"04\\/01\"},{\"names\":[\"Evgenia\",\"Klavdia\"],\"date\":\"06\\/01\"},{\"names\":[\"Lidia\",\"Maria\"],\"date\":\"19\\/01\"},{\"names\":[\"Tatyana\"],\"date\":\"25\\/01\"},{\"names\":[\"Nina\"],\"date\":\"27\\/01\"},{\"names\":[\"Ksenia\"],\"date\":\"31\\/01\"},{\"names\":[\"Inna\"],\"date\":\"02\\/02\"},{\"names\":[\"Anastasia\"],\"date\":\"04\\/02\"},{\"names\":[\"Ksenia\"],\"date\":\"06\\/02\"},{\"names\":[\"Maria\"],\"date\":\"08\\/02\"},{\"names\":[\"Anna\"],\"date\":\"16\\/02\"},{\"names\":[\"Maria\"],\"date\":\"19\\/02\"},{\"names\":[\"Anna\",\"Valentina\"],\"date\":\"23\\/02\"},{\"names\":[\"Svetlana\"],\"date\":\"26\\/02\"},{\"names\":[\"Kira\",\"Marina\"],\"date\":\"12\\/03\"},{\"names\":[\"Antonina\"],\"date\":\"14\\/03\"},{\"names\":[\"Galina\"],\"date\":\"23\\/03\"},{\"names\":[\"Maria\"],\"date\":\"31\\/03\"},{\"names\":[\"Darya\",\"Klavdia\"],\"date\":\"01\\/04\"},{\"names\":[\"Svetlana\"],\"date\":\"02\\/04\"},{\"names\":[\"Larissa\"],\"date\":\"07\\/04\"},{\"names\":[\"Alla\",\"Anna\"],\"date\":\"08\\/04\"},{\"names\":[\"Maria\"],\"date\":\"14\\/04\"},{\"names\":[\"Tamara\"],\"date\":\"28\\/04\"},{\"names\":[\"Irina\"],\"date\":\"29\\/04\"},{\"names\":[\"Tamara\"],\"date\":\"02\\/05\"},{\"names\":[\"Alexandra\"],\"date\":\"06\\/05\"},{\"names\":[\"Elizaveta\"],\"date\":\"07\\/05\"},{\"names\":[\"Irina\"],\"date\":\"14\\/05\"},{\"names\":[\"Varvara\"],\"date\":\"19\\/05\"},{\"names\":[\"Alexandra\",\"Faina\",\"Julia\"],\"date\":\"31\\/05\"},{\"names\":[\"Julia\"],\"date\":\"16\\/06\"},{\"names\":[\"Maria\",\"Valeria\"],\"date\":\"20\\/06\"},{\"names\":[\"Maria\"],\"date\":\"22\\/06\"},{\"names\":[\"Alexandra\",\"Antonina\"],\"date\":\"23\\/06\"},{\"names\":[\"Angelina\"],\"date\":\"14\\/07\"},{\"names\":[\"Anna\"],\"date\":\"18\\/07\"},{\"names\":[\"Elena\",\"Olga\"],\"date\":\"24\\/07\"},{\"names\":[\"Alevtina\",\"Valentina\"],\"date\":\"29\\/07\"},{\"names\":[\"Margarita\",\"Marina\"],\"date\":\"30\\/07\"},{\"names\":[\"Maria\"],\"date\":\"04\\/08\"},{\"names\":[\"Darya\"],\"date\":\"17\\/08\"},{\"names\":[\"Natalia\"],\"date\":\"08\\/09\"},{\"names\":[\"Elizaveta\",\"Raisa\"],\"date\":\"18\\/09\"},{\"names\":[\"Ludmila\"],\"date\":\"29\\/09\"},{\"names\":[\"Lubov\",\"Nadezhda\",\"Vera\"],\"date\":\"30\\/09\"},{\"names\":[\"Ariadna\",\"Irina\",\"Sofya\"],\"date\":\"01\\/10\"},{\"names\":[\"Veronica\"],\"date\":\"17\\/10\"},{\"names\":[\"Taisia\"],\"date\":\"21\\/10\"},{\"names\":[\"Zinaida\"],\"date\":\"29\\/10\"},{\"names\":[\"Anastasia\"],\"date\":\"11\\/11\"},{\"names\":[\"Alexander\"],\"date\":\"19\\/11\"},{\"names\":[\"Ekaterina\"],\"date\":\"07\\/12\"},{\"names\":[\"Varvara\"],\"date\":\"17\\/12\"},{\"names\":[\"Anna\"],\"date\":\"22\\/12\"},{\"names\":[\"Angelina\"],\"date\":\"23\\/12\"},{\"names\":[\"Marina\"],\"date\":\"29\\/12\"}]}"
  },
  {
    "path": "android_mobile/src/main/res/raw/sk_namedays.json",
    "content": "{\"data\":[{\"names\":[\"Alexandra\"],\"date\":\"02\\/01\"},{\"names\":[\"Daniela\"],\"date\":\"03\\/01\"},{\"names\":[\"Drahoslav\"],\"date\":\"04\\/01\"},{\"names\":[\"Andrea\"],\"date\":\"05\\/01\"},{\"names\":[\"Antónia\"],\"date\":\"06\\/01\"},{\"names\":[\"Bohuslava\"],\"date\":\"07\\/01\"},{\"names\":[\"Severín\"],\"date\":\"08\\/01\"},{\"names\":[\"Alexej\"],\"date\":\"09\\/01\"},{\"names\":[\"Dáša\"],\"date\":\"10\\/01\"},{\"names\":[\"Malvína\"],\"date\":\"11\\/01\"},{\"names\":[\"Ernest\"],\"date\":\"12\\/01\"},{\"names\":[\"Rastislav\"],\"date\":\"13\\/01\"},{\"names\":[\"Radovan\"],\"date\":\"14\\/01\"},{\"names\":[\"Dobroslav\"],\"date\":\"15\\/01\"},{\"names\":[\"Kristína\"],\"date\":\"16\\/01\"},{\"names\":[\"Nataša\"],\"date\":\"17\\/01\"},{\"names\":[\"Bohdana\"],\"date\":\"18\\/01\"},{\"names\":[\"Drahomíra\",\"Mário\"],\"date\":\"19\\/01\"},{\"names\":[\"Dalibor\"],\"date\":\"20\\/01\"},{\"names\":[\"Vincent\"],\"date\":\"21\\/01\"},{\"names\":[\"Zora\"],\"date\":\"22\\/01\"},{\"names\":[\"Miloš\"],\"date\":\"23\\/01\"},{\"names\":[\"Timotej\"],\"date\":\"24\\/01\"},{\"names\":[\"Gejza\"],\"date\":\"25\\/01\"},{\"names\":[\"Tamara\"],\"date\":\"26\\/01\"},{\"names\":[\"Bohuš\"],\"date\":\"27\\/01\"},{\"names\":[\"Alfonz\"],\"date\":\"28\\/01\"},{\"names\":[\"Gašpar\"],\"date\":\"29\\/01\"},{\"names\":[\"Ema\"],\"date\":\"30\\/01\"},{\"names\":[\"Emil\"],\"date\":\"31\\/01\"},{\"names\":[\"Tatiana\"],\"date\":\"01\\/02\"},{\"names\":[\"Erik\",\"Erika\"],\"date\":\"02\\/02\"},{\"names\":[\"Blažej\"],\"date\":\"03\\/02\"},{\"names\":[\"Veronika\"],\"date\":\"04\\/02\"},{\"names\":[\"Agáta\"],\"date\":\"05\\/02\"},{\"names\":[\"Dorota\"],\"date\":\"06\\/02\"},{\"names\":[\"Vanda\"],\"date\":\"07\\/02\"},{\"names\":[\"Zoja\"],\"date\":\"08\\/02\"},{\"names\":[\"Zdenko\"],\"date\":\"09\\/02\"},{\"names\":[\"Gabriela\"],\"date\":\"10\\/02\"},{\"names\":[\"Dezider\"],\"date\":\"11\\/02\"},{\"names\":[\"Perla\"],\"date\":\"12\\/02\"},{\"names\":[\"Arpád\"],\"date\":\"13\\/02\"},{\"names\":[\"Valentín\"],\"date\":\"14\\/02\"},{\"names\":[\"Pravoslav\"],\"date\":\"15\\/02\"},{\"names\":[\"Ida\",\"Liana\"],\"date\":\"16\\/02\"},{\"names\":[\"Miloslava\"],\"date\":\"17\\/02\"},{\"names\":[\"Jaromír\"],\"date\":\"18\\/02\"},{\"names\":[\"Vlasta\"],\"date\":\"19\\/02\"},{\"names\":[\"Lívia\"],\"date\":\"20\\/02\"},{\"names\":[\"Eleonóra\"],\"date\":\"21\\/02\"},{\"names\":[\"Etela\"],\"date\":\"22\\/02\"},{\"names\":[\"Roman\",\"Romana\"],\"date\":\"23\\/02\"},{\"names\":[\"Matej\"],\"date\":\"24\\/02\"},{\"names\":[\"Frederik\",\"Frederika\"],\"date\":\"25\\/02\"},{\"names\":[\"Viktor\"],\"date\":\"26\\/02\"},{\"names\":[\"Alexander\"],\"date\":\"27\\/02\"},{\"names\":[\"Zlatica\"],\"date\":\"28\\/02\"},{\"names\":[\"Radomír\"],\"date\":\"29\\/02\"},{\"names\":[\"Albín\"],\"date\":\"01\\/03\"},{\"names\":[\"Anežka\"],\"date\":\"02\\/03\"},{\"names\":[\"Bohumil\",\"Bohumila\"],\"date\":\"03\\/03\"},{\"names\":[\"Kazimír\"],\"date\":\"04\\/03\"},{\"names\":[\"Fridrich\"],\"date\":\"05\\/03\"},{\"names\":[\"Radoslav\",\"Radoslava\"],\"date\":\"06\\/03\"},{\"names\":[\"Tomáš\"],\"date\":\"07\\/03\"},{\"names\":[\"Alan\",\"Alana\"],\"date\":\"08\\/03\"},{\"names\":[\"Františka\"],\"date\":\"09\\/03\"},{\"names\":[\"Branislav\",\"Bruno\"],\"date\":\"10\\/03\"},{\"names\":[\"Angela\",\"Angelika\"],\"date\":\"11\\/03\"},{\"names\":[\"Gregor\"],\"date\":\"12\\/03\"},{\"names\":[\"Vlastimil\"],\"date\":\"13\\/03\"},{\"names\":[\"Matilda\"],\"date\":\"14\\/03\"},{\"names\":[\"Svetlana\"],\"date\":\"15\\/03\"},{\"names\":[\"Boleslav\"],\"date\":\"16\\/03\"},{\"names\":[\"Ľubica\"],\"date\":\"17\\/03\"},{\"names\":[\"Eduard\"],\"date\":\"18\\/03\"},{\"names\":[\"Jozef\"],\"date\":\"19\\/03\"},{\"names\":[\"Víťazoslav\",\"Klaudius\"],\"date\":\"20\\/03\"},{\"names\":[\"Blahoslav\"],\"date\":\"21\\/03\"},{\"names\":[\"Beňadik\"],\"date\":\"22\\/03\"},{\"names\":[\"Adrián\"],\"date\":\"23\\/03\"},{\"names\":[\"Gabriel\"],\"date\":\"24\\/03\"},{\"names\":[\"Marián\"],\"date\":\"25\\/03\"},{\"names\":[\"Emanuel\"],\"date\":\"26\\/03\"},{\"names\":[\"Alena\"],\"date\":\"27\\/03\"},{\"names\":[\"Soňa\"],\"date\":\"28\\/03\"},{\"names\":[\"Miroslav\"],\"date\":\"29\\/03\"},{\"names\":[\"Vieroslava\"],\"date\":\"30\\/03\"},{\"names\":[\"Benjamín\"],\"date\":\"31\\/03\"},{\"names\":[\"Hugo\"],\"date\":\"01\\/04\"},{\"names\":[\"Zita\"],\"date\":\"02\\/04\"},{\"names\":[\"Richard\"],\"date\":\"03\\/04\"},{\"names\":[\"Izidor\"],\"date\":\"04\\/04\"},{\"names\":[\"Miroslava\"],\"date\":\"05\\/04\"},{\"names\":[\"Irena\"],\"date\":\"06\\/04\"},{\"names\":[\"Zoltán\"],\"date\":\"07\\/04\"},{\"names\":[\"Albert\"],\"date\":\"08\\/04\"},{\"names\":[\"Milena\"],\"date\":\"09\\/04\"},{\"names\":[\"Igor\"],\"date\":\"10\\/04\"},{\"names\":[\"Július\"],\"date\":\"11\\/04\"},{\"names\":[\"Estera\"],\"date\":\"12\\/04\"},{\"names\":[\"Aleš\"],\"date\":\"13\\/04\"},{\"names\":[\"Justínia\"],\"date\":\"14\\/04\"},{\"names\":[\"Fedor\"],\"date\":\"15\\/04\"},{\"names\":[\"Dana\",\"Danica\"],\"date\":\"16\\/04\"},{\"names\":[\"Rudolf\"],\"date\":\"17\\/04\"},{\"names\":[\"Valér\"],\"date\":\"18\\/04\"},{\"names\":[\"Jela\"],\"date\":\"19\\/04\"},{\"names\":[\"Marcel\"],\"date\":\"20\\/04\"},{\"names\":[\"Ervín\"],\"date\":\"21\\/04\"},{\"names\":[\"Slavomír\"],\"date\":\"22\\/04\"},{\"names\":[\"Vojtech\"],\"date\":\"23\\/04\"},{\"names\":[\"Juraj\"],\"date\":\"24\\/04\"},{\"names\":[\"Marek\"],\"date\":\"25\\/04\"},{\"names\":[\"Jaroslava\"],\"date\":\"26\\/04\"},{\"names\":[\"Jaroslav\"],\"date\":\"27\\/04\"},{\"names\":[\"Jarmila\"],\"date\":\"28\\/04\"},{\"names\":[\"Lea\"],\"date\":\"29\\/04\"},{\"names\":[\"Anastázia\"],\"date\":\"30\\/04\"},{\"names\":[],\"date\":\"01\\/05\"},{\"names\":[\"Žigmund\"],\"date\":\"02\\/05\"},{\"names\":[\"Galina\"],\"date\":\"03\\/05\"},{\"names\":[\"Florián\"],\"date\":\"04\\/05\"},{\"names\":[\"Lesana\",\"Lesia\"],\"date\":\"05\\/05\"},{\"names\":[\"Hermína\"],\"date\":\"06\\/05\"},{\"names\":[\"Monika\"],\"date\":\"07\\/05\"},{\"names\":[\"Ingrida\"],\"date\":\"08\\/05\"},{\"names\":[\"Roland\"],\"date\":\"09\\/05\"},{\"names\":[\"Viktória\"],\"date\":\"10\\/05\"},{\"names\":[\"Blažena\"],\"date\":\"11\\/05\"},{\"names\":[\"Pankrác\"],\"date\":\"12\\/05\"},{\"names\":[\"Servác\"],\"date\":\"13\\/05\"},{\"names\":[\"Bonifác\"],\"date\":\"14\\/05\"},{\"names\":[\"Žofia\"],\"date\":\"15\\/05\"},{\"names\":[\"Svetozár\"],\"date\":\"16\\/05\"},{\"names\":[\"Gizela\"],\"date\":\"17\\/05\"},{\"names\":[\"Viola\"],\"date\":\"18\\/05\"},{\"names\":[\"Gertrúda\"],\"date\":\"19\\/05\"},{\"names\":[\"Bernard\"],\"date\":\"20\\/05\"},{\"names\":[\"Zina\"],\"date\":\"21\\/05\"},{\"names\":[\"Júlia\",\"Juliana\"],\"date\":\"22\\/05\"},{\"names\":[\"Želmíra\"],\"date\":\"23\\/05\"},{\"names\":[\"Ela\"],\"date\":\"24\\/05\"},{\"names\":[\"Urban\"],\"date\":\"25\\/05\"},{\"names\":[\"Dušan\"],\"date\":\"26\\/05\"},{\"names\":[\"Iveta\"],\"date\":\"27\\/05\"},{\"names\":[\"Viliam\"],\"date\":\"28\\/05\"},{\"names\":[\"Vilma\"],\"date\":\"29\\/05\"},{\"names\":[\"Ferdinand\"],\"date\":\"30\\/05\"},{\"names\":[\"Petronela\",\"Petrana\"],\"date\":\"31\\/05\"},{\"names\":[\"Žaneta\"],\"date\":\"01\\/06\"},{\"names\":[\"Xénia\",\"Oxana\"],\"date\":\"02\\/06\"},{\"names\":[\"Karolína\"],\"date\":\"03\\/06\"},{\"names\":[\"Lenka\"],\"date\":\"04\\/06\"},{\"names\":[\"Laura\"],\"date\":\"05\\/06\"},{\"names\":[\"Norbert\"],\"date\":\"06\\/06\"},{\"names\":[\"Róbert\"],\"date\":\"07\\/06\"},{\"names\":[\"Medard\"],\"date\":\"08\\/06\"},{\"names\":[\"Stanislava\"],\"date\":\"09\\/06\"},{\"names\":[\"Margaréta\"],\"date\":\"10\\/06\"},{\"names\":[\"Dobroslava\"],\"date\":\"11\\/06\"},{\"names\":[\"Zlatko\"],\"date\":\"12\\/06\"},{\"names\":[\"Anton\"],\"date\":\"13\\/06\"},{\"names\":[\"Vasiľ\"],\"date\":\"14\\/06\"},{\"names\":[\"Vít\"],\"date\":\"15\\/06\"},{\"names\":[\"Blanka\",\"Bianka\"],\"date\":\"16\\/06\"},{\"names\":[\"Adolf\"],\"date\":\"17\\/06\"},{\"names\":[\"Vratislav\"],\"date\":\"18\\/06\"},{\"names\":[\"Alfréd\"],\"date\":\"19\\/06\"},{\"names\":[\"Valéria\"],\"date\":\"20\\/06\"},{\"names\":[\"Alojz\"],\"date\":\"21\\/06\"},{\"names\":[\"Paulína\"],\"date\":\"22\\/06\"},{\"names\":[\"Sidónia\"],\"date\":\"23\\/06\"},{\"names\":[\"Ján\"],\"date\":\"24\\/06\"},{\"names\":[\"Olívia\",\"Tadeáš\"],\"date\":\"25\\/06\"},{\"names\":[\"Adriána\"],\"date\":\"26\\/06\"},{\"names\":[\"Ladislav\",\"Ladislava\"],\"date\":\"27\\/06\"},{\"names\":[\"Beáta\"],\"date\":\"28\\/06\"},{\"names\":[\"Petra\"],\"date\":\"29\\/06\"},{\"names\":[\"Melánia\"],\"date\":\"30\\/06\"},{\"names\":[\"Diana\"],\"date\":\"01\\/07\"},{\"names\":[\"Berta\"],\"date\":\"02\\/07\"},{\"names\":[\"Miloslav\"],\"date\":\"03\\/07\"},{\"names\":[\"Prokop\"],\"date\":\"04\\/07\"},{\"names\":[],\"date\":\"05\\/07\"},{\"names\":[\"Patrik\",\"Patrícia\"],\"date\":\"06\\/07\"},{\"names\":[\"Oliver\"],\"date\":\"07\\/07\"},{\"names\":[\"Ivan\"],\"date\":\"08\\/07\"},{\"names\":[\"Lujza\"],\"date\":\"09\\/07\"},{\"names\":[\"Amália\"],\"date\":\"10\\/07\"},{\"names\":[\"Milota\"],\"date\":\"11\\/07\"},{\"names\":[\"Nina\"],\"date\":\"12\\/07\"},{\"names\":[\"Margita\"],\"date\":\"13\\/07\"},{\"names\":[\"Kamil\"],\"date\":\"14\\/07\"},{\"names\":[\"Henrich\"],\"date\":\"15\\/07\"},{\"names\":[\"Drahomír\"],\"date\":\"16\\/07\"},{\"names\":[\"Bohuslav\"],\"date\":\"17\\/07\"},{\"names\":[\"Kamila\"],\"date\":\"18\\/07\"},{\"names\":[\"Dušana\"],\"date\":\"19\\/07\"},{\"names\":[\"Iľja\",\"Eliáš\"],\"date\":\"20\\/07\"},{\"names\":[\"Daniel\"],\"date\":\"21\\/07\"},{\"names\":[\"Magdaléna\"],\"date\":\"22\\/07\"},{\"names\":[\"Oľga\"],\"date\":\"23\\/07\"},{\"names\":[\"Vladimír\"],\"date\":\"24\\/07\"},{\"names\":[\"Jakub\"],\"date\":\"25\\/07\"},{\"names\":[\"Anna\",\"Hana\"],\"date\":\"26\\/07\"},{\"names\":[\"Božena\"],\"date\":\"27\\/07\"},{\"names\":[\"Krištof\"],\"date\":\"28\\/07\"},{\"names\":[\"Marta\"],\"date\":\"29\\/07\"},{\"names\":[\"Libuša\"],\"date\":\"30\\/07\"},{\"names\":[\"Ignác\"],\"date\":\"31\\/07\"},{\"names\":[\"Božidara\"],\"date\":\"01\\/08\"},{\"names\":[\"Gustáv\"],\"date\":\"02\\/08\"},{\"names\":[\"Jerguš\"],\"date\":\"03\\/08\"},{\"names\":[\"Dominik\",\"Dominika\"],\"date\":\"04\\/08\"},{\"names\":[\"Hortenzia\"],\"date\":\"05\\/08\"},{\"names\":[\"Jozefína\"],\"date\":\"06\\/08\"},{\"names\":[\"Štefánia\"],\"date\":\"07\\/08\"},{\"names\":[\"Oskár\"],\"date\":\"08\\/08\"},{\"names\":[\"Ľubomíra\"],\"date\":\"09\\/08\"},{\"names\":[\"Vavrinec\"],\"date\":\"10\\/08\"},{\"names\":[\"Zuzana\"],\"date\":\"11\\/08\"},{\"names\":[\"Darina\"],\"date\":\"12\\/08\"},{\"names\":[\"Ľubomír\"],\"date\":\"13\\/08\"},{\"names\":[\"Mojmír\"],\"date\":\"14\\/08\"},{\"names\":[\"Marcela\"],\"date\":\"15\\/08\"},{\"names\":[\"Leonard\"],\"date\":\"16\\/08\"},{\"names\":[\"Milica\"],\"date\":\"17\\/08\"},{\"names\":[\"Elena\",\"Helena\"],\"date\":\"18\\/08\"},{\"names\":[\"Lýdia\"],\"date\":\"19\\/08\"},{\"names\":[\"Anabela\"],\"date\":\"20\\/08\"},{\"names\":[\"Jana\"],\"date\":\"21\\/08\"},{\"names\":[\"Tichomír\"],\"date\":\"22\\/08\"},{\"names\":[\"Filip\"],\"date\":\"23\\/08\"},{\"names\":[\"Bartolomej\"],\"date\":\"24\\/08\"},{\"names\":[\"Ľudovít\"],\"date\":\"25\\/08\"},{\"names\":[\"Samuel\"],\"date\":\"26\\/08\"},{\"names\":[\"Silvia\"],\"date\":\"27\\/08\"},{\"names\":[\"Augustín\"],\"date\":\"28\\/08\"},{\"names\":[\"Nikola\",\"Nikolaj\"],\"date\":\"29\\/08\"},{\"names\":[\"Ružena\"],\"date\":\"30\\/08\"},{\"names\":[\"Nora\"],\"date\":\"31\\/08\"},{\"names\":[\"Drahoslava\"],\"date\":\"01\\/09\"},{\"names\":[\"Linda\"],\"date\":\"02\\/09\"},{\"names\":[\"Belo\"],\"date\":\"03\\/09\"},{\"names\":[\"Rozália\"],\"date\":\"04\\/09\"},{\"names\":[\"Regína\"],\"date\":\"05\\/09\"},{\"names\":[\"Alica\"],\"date\":\"06\\/09\"},{\"names\":[\"Marianna\"],\"date\":\"07\\/09\"},{\"names\":[\"Miriama\"],\"date\":\"08\\/09\"},{\"names\":[\"Martina\"],\"date\":\"09\\/09\"},{\"names\":[\"Oleg\"],\"date\":\"10\\/09\"},{\"names\":[\"Bystrík\"],\"date\":\"11\\/09\"},{\"names\":[\"Mária\"],\"date\":\"12\\/09\"},{\"names\":[\"Ctibor\"],\"date\":\"13\\/09\"},{\"names\":[\"Ľudomil\"],\"date\":\"14\\/09\"},{\"names\":[\"Jolana\"],\"date\":\"15\\/09\"},{\"names\":[\"Ľudmila\"],\"date\":\"16\\/09\"},{\"names\":[\"Olympia\"],\"date\":\"17\\/09\"},{\"names\":[\"Eugénia\"],\"date\":\"18\\/09\"},{\"names\":[\"Konštantín\"],\"date\":\"19\\/09\"},{\"names\":[\"Ľuboslav\",\"Ľuboslava\"],\"date\":\"20\\/09\"},{\"names\":[\"Matúš\"],\"date\":\"21\\/09\"},{\"names\":[\"Móric\"],\"date\":\"22\\/09\"},{\"names\":[\"Zdenka\"],\"date\":\"23\\/09\"},{\"names\":[\"Ľuboš\",\"Ľubor\"],\"date\":\"24\\/09\"},{\"names\":[\"Vladislav\"],\"date\":\"25\\/09\"},{\"names\":[\"Edita\"],\"date\":\"26\\/09\"},{\"names\":[\"Cyprián\"],\"date\":\"27\\/09\"},{\"names\":[\"Václav\"],\"date\":\"28\\/09\"},{\"names\":[\"Michal\",\"Michaela\"],\"date\":\"29\\/09\"},{\"names\":[\"Jarolím\"],\"date\":\"30\\/09\"},{\"names\":[\"Arnold\"],\"date\":\"01\\/10\"},{\"names\":[\"Levoslav\"],\"date\":\"02\\/10\"},{\"names\":[\"Stela\"],\"date\":\"03\\/10\"},{\"names\":[\"František\"],\"date\":\"04\\/10\"},{\"names\":[\"Viera\"],\"date\":\"05\\/10\"},{\"names\":[\"Natália\"],\"date\":\"06\\/10\"},{\"names\":[\"Eliška\"],\"date\":\"07\\/10\"},{\"names\":[\"Brigita\"],\"date\":\"08\\/10\"},{\"names\":[\"Dionýz\"],\"date\":\"09\\/10\"},{\"names\":[\"Slavomíra\"],\"date\":\"10\\/10\"},{\"names\":[\"Valentína\"],\"date\":\"11\\/10\"},{\"names\":[\"Maximilián\"],\"date\":\"12\\/10\"},{\"names\":[\"Koloman\"],\"date\":\"13\\/10\"},{\"names\":[\"Boris\"],\"date\":\"14\\/10\"},{\"names\":[\"Terézia\"],\"date\":\"15\\/10\"},{\"names\":[\"Vladimíra\"],\"date\":\"16\\/10\"},{\"names\":[\"Hedviga\"],\"date\":\"17\\/10\"},{\"names\":[\"Lukáš\"],\"date\":\"18\\/10\"},{\"names\":[\"Kristián\"],\"date\":\"19\\/10\"},{\"names\":[\"Vendelín\"],\"date\":\"20\\/10\"},{\"names\":[\"Uršuľa\"],\"date\":\"21\\/10\"},{\"names\":[\"Sergej\"],\"date\":\"22\\/10\"},{\"names\":[\"Alojzia\"],\"date\":\"23\\/10\"},{\"names\":[\"Kvetoslava\"],\"date\":\"24\\/10\"},{\"names\":[\"Aurel\"],\"date\":\"25\\/10\"},{\"names\":[\"Demeter\"],\"date\":\"26\\/10\"},{\"names\":[\"Sabína\"],\"date\":\"27\\/10\"},{\"names\":[\"Dobromila\"],\"date\":\"28\\/10\"},{\"names\":[\"Klára\"],\"date\":\"29\\/10\"},{\"names\":[\"Šimon\",\"Simona\"],\"date\":\"30\\/10\"},{\"names\":[\"Aurélia\"],\"date\":\"31\\/10\"},{\"names\":[\"Denisa\",\"Denis\"],\"date\":\"01\\/11\"},{\"names\":[\"Hubert\"],\"date\":\"03\\/11\"},{\"names\":[\"Karol\"],\"date\":\"04\\/11\"},{\"names\":[\"Imrich\"],\"date\":\"05\\/11\"},{\"names\":[\"Renáta\"],\"date\":\"06\\/11\"},{\"names\":[\"René\"],\"date\":\"07\\/11\"},{\"names\":[\"Bohumír\"],\"date\":\"08\\/11\"},{\"names\":[\"Teodor\"],\"date\":\"09\\/11\"},{\"names\":[\"Tibor\"],\"date\":\"10\\/11\"},{\"names\":[\"Martin\",\"Maroš\"],\"date\":\"11\\/11\"},{\"names\":[\"Svätopluk\"],\"date\":\"12\\/11\"},{\"names\":[\"Stanislav\"],\"date\":\"13\\/11\"},{\"names\":[\"Irma\"],\"date\":\"14\\/11\"},{\"names\":[\"Leopold\"],\"date\":\"15\\/11\"},{\"names\":[\"Agnesa\"],\"date\":\"16\\/11\"},{\"names\":[\"Klaudia\"],\"date\":\"17\\/11\"},{\"names\":[\"Eugen\"],\"date\":\"18\\/11\"},{\"names\":[\"Alžbeta\"],\"date\":\"19\\/11\"},{\"names\":[\"Félix\"],\"date\":\"20\\/11\"},{\"names\":[\"Elvíra\"],\"date\":\"21\\/11\"},{\"names\":[\"Cecília\"],\"date\":\"22\\/11\"},{\"names\":[\"Klement\"],\"date\":\"23\\/11\"},{\"names\":[\"Emília\"],\"date\":\"24\\/11\"},{\"names\":[\"Katarína\"],\"date\":\"25\\/11\"},{\"names\":[\"Kornel\"],\"date\":\"26\\/11\"},{\"names\":[\"Milan\"],\"date\":\"27\\/11\"},{\"names\":[\"Henrieta\"],\"date\":\"28\\/11\"},{\"names\":[\"Vratko\"],\"date\":\"29\\/11\"},{\"names\":[\"Ondrej\",\"Andrej\"],\"date\":\"30\\/11\"},{\"names\":[\"Edmund\"],\"date\":\"01\\/12\"},{\"names\":[\"Bibiána\"],\"date\":\"02\\/12\"},{\"names\":[\"Oldrich\"],\"date\":\"03\\/12\"},{\"names\":[\"Barbora\",\"Barbara\"],\"date\":\"04\\/12\"},{\"names\":[\"Oto\"],\"date\":\"05\\/12\"},{\"names\":[\"Mikuláš\"],\"date\":\"06\\/12\"},{\"names\":[\"Ambróz\"],\"date\":\"07\\/12\"},{\"names\":[\"Marína\"],\"date\":\"08\\/12\"},{\"names\":[\"Izabela\"],\"date\":\"09\\/12\"},{\"names\":[\"Radúz\"],\"date\":\"10\\/12\"},{\"names\":[\"Hilda\"],\"date\":\"11\\/12\"},{\"names\":[\"Otília\"],\"date\":\"12\\/12\"},{\"names\":[\"Lucia\"],\"date\":\"13\\/12\"},{\"names\":[\"Branislava\",\"Bronislava\"],\"date\":\"14\\/12\"},{\"names\":[\"Ivica\"],\"date\":\"15\\/12\"},{\"names\":[\"Albína\"],\"date\":\"16\\/12\"},{\"names\":[\"Kornélia\"],\"date\":\"17\\/12\"},{\"names\":[\"Sláva\",\"Slávka\"],\"date\":\"18\\/12\"},{\"names\":[\"Judita\"],\"date\":\"19\\/12\"},{\"names\":[\"Dagmara\"],\"date\":\"20\\/12\"},{\"names\":[\"Bohdan\"],\"date\":\"21\\/12\"},{\"names\":[\"Adela\"],\"date\":\"22\\/12\"},{\"names\":[\"Nadežda\"],\"date\":\"23\\/12\"},{\"names\":[],\"date\":\"24\\/12\"},{\"names\":[],\"date\":\"25\\/12\"},{\"names\":[\"Štefan\"],\"date\":\"26\\/12\"},{\"names\":[\"Filoména\"],\"date\":\"27\\/12\"},{\"names\":[\"Ivana\",\"Ivona\"],\"date\":\"28\\/12\"},{\"names\":[\"Milada\"],\"date\":\"29\\/12\"},{\"names\":[\"Dávid\"],\"date\":\"30\\/12\"},{\"names\":[\"Silvester\"],\"date\":\"31\\/12\"}]}\n"
  },
  {
    "path": "android_mobile/src/main/res/transition/changebounds.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<transitionSet xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:duration=\"@android:integer/config_shortAnimTime\">\n  <changeBounds />\n</transitionSet>\n"
  },
  {
    "path": "android_mobile/src/main/res/transition/explode.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<transitionSet xmlns:android=\"http://schemas.android.com/apk/res/android\">\n  <explode\n    android:duration=\"@android:integer/config_longAnimTime\"\n    android:interpolator=\"@android:interpolator/bounce\" />\n</transitionSet>\n"
  },
  {
    "path": "android_mobile/src/main/res/transition/fade_and_changebounds.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<transitionSet xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:duration=\"@android:integer/config_shortAnimTime\">\n  <changeBounds />\n  <fade />\n</transitionSet>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/add_event-resources.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <string name=\"add_event_store_button_add_label\">@string/add</string>\n  <string name=\"add_birthday_contact_added\">@string/contact_added</string>\n  <string name=\"add_birthday_failed_to_add_contact\">@string/failed_to_add_contact</string>\n  <string name=\"add_event_contact_updated\">@string/contact_updated</string>\n  <string name=\"add_event_failed_to_update_contact\">@string/failed_to_update_contact</string>\n  <string name=\"addbirthday_autocomplete_hint\">@string/Contact_name</string>\n  <string name=\"birthday_picker_dialog_title\">@string/Birthday_date</string>\n  <string name=\"birthday_picker_dialog_positive\">@string/set</string>\n  <string name=\"add_birthday_include_year_label\">@string/include_year</string>\n  <string name=\"add_event_title\">@string/Add_event</string>\n  <string name=\"add_event_pick_image_title\">@string/Change_photo</string>\n  <string name=\"add_event_remove_photo\">@string/Remove_photo</string>\n  <string name=\"add_event_take_photo\">@string/Take_new_photo</string>\n  <string name=\"add_event_pick_from_files\">@string/Pick_existing_photo</string>\n  <string name=\"add_event_discard_changes_title\">@string/Discard_changes</string>\n  <string name=\"add_event_discard_changes_accept\">@string/Discard</string>\n\n\n  <dimen name=\"add_birthday_row_height\">64dp</dimen>\n  <dimen name=\"add_birthday_row_width\">64dp</dimen>\n  <dimen name=\"add_birthday_avatar_starting_width\">0dp</dimen>\n  <dimen name=\"add_birthday_avatar_starting_height\">0dp</dimen>\n  <dimen name=\"add_birthday_avatar_actual_width\">48dp</dimen>\n  <dimen name=\"add_birthday_avatar_actual_height\">48dp</dimen>\n  <dimen name=\"add_event_image_height\">58dp</dimen>\n  <dimen name=\"add_event_image_width\">58dp</dimen>\n  <dimen name=\"add_event_margin_horizontal\">4dp</dimen>\n\n  <dimen name=\"add_event_camera_button_height\">190dp</dimen>\n  <dimen name=\"add_event_avatar_height\">240dp</dimen>\n  <dimen name=\"add_event_image_option_vertical\">16dp</dimen>\n\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/admob.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <string name=\"admob_list_size\"\n    translatable=\"false\">360x132</string>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/animations_dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <dimen name=\"hero_background_height\">80dp</dimen>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/arrays.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\"\n  tools:ignore=\"MissingTranslation\">\n\n\n  <string-array name=\"ratings\">\n    <item>@string/rate_1_stars</item>\n    <item>@string/rate_2_stars</item>\n    <item>@string/rate_3_stars</item>\n    <item>@string/rate_4_stars</item>\n    <item>@string/rate_5_stars</item>\n  </string-array>\n  <string-array name=\"support_options\">\n    <item>@string/donate</item>\n    <item>@string/like_page</item>\n    <item>@string/translate</item>\n    <item>@string/rate_app</item>\n  </string-array>\n\n</resources>\n\n\n"
  },
  {
    "path": "android_mobile/src/main/res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n  <declare-styleable name=\"ColorImageView\">\n    <attr name=\"isCircle\"\n      format=\"boolean\" />\n    <attr name=\"letterSize\"\n      format=\"dimension\" />\n  </declare-styleable>\n\n  <declare-styleable name=\"TitledTextView\">\n    <attr name=\"eventTitleColor\"\n      format=\"color\" />\n    <attr name=\"eventTitle\"\n      format=\"string\" />\n  </declare-styleable>\n\n  <declare-styleable name=\"MementoCardView\">\n    <attr name=\"cardBackgroundColor\"\n      format=\"color\" />\n  </declare-styleable>\n\n  <declare-styleable name=\"ForegroundLinearLayout\">\n    <attr name=\"foreground\" />\n    <attr name=\"foregroundInsidePadding\" />\n    <attr name=\"foregroundGravity\" />\n  </declare-styleable>\n\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/available_themes.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\"\n  tools:ignore=\"MissingTranslation\">\n\n  <style name=\"Theme.Memento.BloodyCherry\"\n    parent=\"@style/Theme.Memento.Light.DarkToolbar\">\n    <item name=\"colorPrimary\">@color/primary_red</item>\n    <item name=\"colorPrimaryDark\">@color/primary_dark_red</item>\n    <item name=\"colorSecondary\">#F15454</item>\n    <item name=\"colorAccent\">#F1B554</item>\n  </style>\n\n  <style name=\"Theme.Memento.Monochrome\"\n    parent=\"@style/Theme.Memento.Light.LightToolbar\">\n    <item name=\"colorPrimary\">#FAFAFA</item>\n    <item name=\"colorPrimaryDark\">#EEEEEE</item>\n    <item name=\"colorSecondary\">#424242</item>\n    <item name=\"colorAccent\">#424242</item>\n    <item name=\"primaryTextColorInverse\">@color/black_light</item>\n  </style>\n\n  <style name=\"Theme.Memento.Eggplant\"\n    parent=\"@style/Theme.Memento.Light.DarkToolbar\">\n    <item name=\"colorPrimary\">#4CAF50</item>\n    <item name=\"colorPrimaryDark\">#43A047</item>\n    <item name=\"colorSecondary\">#C8E6C9</item>\n    <item name=\"colorAccent\">#AA00FF</item>\n  </style>\n\n  <style name=\"Theme.Memento.NavyBlue\"\n    parent=\"@style/Theme.Memento.Light.DarkToolbar\">\n    <item name=\"colorPrimary\">#3F51B5</item>\n    <item name=\"colorPrimaryDark\">#1A237E</item>\n    <item name=\"colorSecondary\">#C5CAE9</item>\n    <item name=\"colorAccent\">#FF4081</item>\n  </style>\n\n  <style name=\"Theme.Memento.Amber\"\n    parent=\"@style/Theme.Memento.Light.DarkToolbar\">\n    <item name=\"colorPrimary\">#FFB300</item>\n    <item name=\"colorPrimaryDark\">#FF8F00</item>\n    <item name=\"colorSecondary\">#FFD54F</item>\n    <item name=\"colorAccent\">#D50000</item>\n    <item name=\"primaryTextColor\">@color/black_light</item>\n    <item name=\"primaryTextColorInverse\">@android:color/white</item>\n  </style>\n\n  <style name=\"Theme.Memento.GlossPink\"\n    parent=\"@style/Theme.Memento.Light.DarkToolbar\">\n    <item name=\"colorPrimary\">#F06292</item>\n    <item name=\"colorPrimaryDark\">#EC407A</item>\n    <item name=\"colorSecondary\">#F8BBD0</item>\n    <item name=\"colorAccent\">#AB47BC</item>\n  </style>\n\n\n  <style name=\"Theme.Memento.Systemo\"\n    parent=\"@style/Theme.Memento.Light.DarkToolbar\">\n    <item name=\"colorPrimaryDark\">@android:color/black</item>\n    <item name=\"colorPrimary\">#ff212121</item>\n    <item name=\"colorAccent\">#009688</item>\n    <item name=\"colorSecondary\">#80CBC4</item>\n  </style>\n\n  <style name=\"Theme.Memento.Modern\"\n    parent=\"@style/Theme.Memento.Light.DarkToolbar\">\n    <item name=\"colorPrimary\">#C3195D</item>\n    <item name=\"colorPrimaryDark\">#680747</item>\n    <item name=\"colorSecondary\">#C3195D</item>\n    <item name=\"colorAccent\">#F70776</item>\n  </style>\n\n\n  <attr name=\"useDarkIcons\"\n    format=\"boolean\" />\n  <attr name=\"colorSecondary\"\n    format=\"color\" />\n  <attr name=\"toolbarTheme\"\n    format=\"reference\" />\n\n  <string name=\"theme_BloodyCherry\">Bloody Cherry</string>\n  <string name=\"theme_NavyBlue\">Navy Blue</string>\n  <string name=\"theme_Monochrome\">Monochrome</string>\n  <string name=\"theme_GlossPink\">Gloss Pink</string>\n  <string name=\"theme_Eggplant\">Eggplant</string>\n  <string name=\"theme_Systemo\">Systemo</string>\n  <string name=\"theme_Amber\">Amber</string>\n\n\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/bankholidays_preferences-resources.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <string name=\"bankholidays_preferences_title\">@string/Display_Bankholidays</string>\n  <string name=\"bankholidays_preferences_language_title\">@string/Bankholidays_Country</string>\n  <string name=\"bankholidays_preferences_only_greek_supported_message\">@string/Bankholidays_are_currently_supported_only_for_Greek</string>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/bithday_picker-styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n  <style name=\"BirthdayPicker\"></style>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/bools.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <bool name=\"isGreekLocaleSelected\">false</bool>\n  <bool name=\"preHolo\">true</bool>\n  <bool name=\"hasHolo\">false</bool>\n  <bool name=\"isLargeScreen\">false</bool>\n  <bool name=\"isNamedaySupported\">false</bool>\n  <bool name=\"isBankholidaysSupported\">false</bool>\n\n  <bool name=\"isLandscape\">false</bool>\n\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/bottom_sheet-resources.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <integer name=\"bottom_sheet_span_count\">3</integer>\n\n  <dimen name=\"bottom_sheet_layout_width\">0dp</dimen>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/card-resources.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <dimen name=\"card_margin\">16dp</dimen>\n  <dimen name=\"cardpaddings\">12sp</dimen>\n  <dimen name=\"card_padding_horizontal\">8dp</dimen>\n  <dimen name=\"card_spacing_between\">8dp</dimen>\n\n  <dimen name=\"card_stack_padding_vertical\">8dp</dimen>\n  <dimen name=\"card_content_padding\">16dp</dimen>\n\n  <dimen name=\"card_header_text_size\">24sp</dimen>\n  <dimen name=\"card_header_text_size_medium\">18sp</dimen>\n  <dimen name=\"card_header_text_size_small\">14sp</dimen>\n\n  <dimen name=\"card_text_size_body_smaller\">14sp</dimen>\n  <dimen name=\"card_text_size_body\">16sp</dimen>\n\n\n  <dimen name=\"card_spacing\">16dp</dimen>\n  <dimen name=\"card_contact_avatar_size\">135dp</dimen>\n  <dimen name=\"card_padding_from_screen\">8dp</dimen>\n  <dimen name=\"card_spacing_half\">8dp</dimen>\n  <dimen name=\"mini_card_content_padding\">16dp</dimen>\n  <dimen name=\"minicard_text_size_header\">18sp</dimen>\n  <dimen name=\"card_text_size_action\">14sp</dimen>\n  <dimen name=\"card_action_horizontal_margin\">4dp</dimen>\n  <dimen name=\"card_corner_radius\">2dp</dimen>\n\n\n  <style name=\"Card\">\n    <item name=\"android:textSize\">@dimen/card_text_size_body</item>\n    <item name=\"android:textColor\">@color/card_text</item>\n  </style>\n\n  <style name=\"Card.Header\"\n    parent=\"Card\">\n    <item name=\"android:textSize\">@dimen/card_header_text_size</item>\n  </style>\n\n  <style name=\"Card.Text\"\n    parent=\"Card\">\n    <item name=\"android:textSize\">18sp</item>\n  </style>\n\n  <style name=\"Card.Subtitle\"\n    parent=\"Card\">\n    <item name=\"android:textSize\">@dimen/card_text_size_body_smaller</item>\n  </style>\n\n  <style name=\"Card.Text.Action\"\n    parent=\"Base.Widget.AppCompat.Button.Borderless.Colored\">\n    <item name=\"android:capitalize\">characters</item>\n  </style>\n\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"dark_text\">#414141</color>\n</resources>"
  },
  {
    "path": "android_mobile/src/main/res/values/colors_dayslight.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"dayslight_color\">#c61d30</color>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/colors_support.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <color name=\"support_pink\">#FF80AB</color>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/contact_cards-resources.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n  <dimen name=\"contact_cards_actionbutton_size\">48dp</dimen>\n\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/contact_permission-resources.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n  <string name=\"contact_permission_message_request\">@string/Memento_requires_your_permission_to_read_your_contacts_in_order_to_display_when_they_celebrate</string>\n  <string name=\"contact_permission_fact\">@string/Fact_Some_people_give_free_cake_to_those_who_wish_them_Happy_Birthday._Use_Memento_to_keep_track_of_potential_cake_givers</string>\n  <string name=\"contact_permission_button_label\">@string/Grant_permission</string>\n\n\n  <dimen name=\"contact_permission_arrow_horizontal_margin\">12dp</dimen>\n\n  <style name=\"ContactPermission.GrantPermission\"\n    parent=\"CardAction\">\n\n  </style>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/date_details-resources.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <string name=\"date_details_no_events\">@string/No_events_on_this_date</string>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/debug_keys.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\"\n  tools:ignore=\"MissingTranslation\">\n  <string name=\"key_debug_refresh_widget\">key_debug_refresh_widget</string>\n  <string name=\"key_debug_configure_widgets\">key_debug_configure_widgets</string>\n  <string name=\"key_debug_refresh_db\">key_debug_refresh_db</string>\n  <string name=\"pref_dailyreminder_debug\">pref_dailyreminder_debug</string>\n  <string name=\"key_debug_daily_reminder\">key_debug_daily_reminder</string>\n  <string name=\"key_debug_daily_reminder_date\">key_debug_daily_reminder_date</string>\n  <string name=\"key_debug_daily_reminder_date_enable\">key_debug_daily_reminder_date_enable</string>\n  <string name=\"key_debug_daily_reminder_date_fake_day\">key_debug_daily_reminder_date_fake_day</string>\n  <string name=\"key_debug_daily_reminder_date_fake_month\">key_debug_daily_reminder_date_fake_month</string>\n  <string name=\"key_debug_daily_reminder_date_fake_year\">key_debug_daily_reminder_date_fake_year</string>\n  <string name=\"key_debug_start_calendar\">key_debug_start_calendar</string>\n  <string name=\"key_debug_trigger_wear_service\">key_debug_trigger_wear_service</string>\n  <string name=\"key_debug_reset_donations\">key_debug_reset_donations</string>\n  <string name=\"key_debug_trigger_support\">key_debug_trigger_support</string>\n  <string name=\"key_debug_facebook\">key_debug_facebook</string>\n  <string name=\"key_debug_facebook_fetch_friends\">key_debug_facebook_fetch_friends</string>\n  <string name=\"key_debug_open_contact\">key_debug_open_contact</string>\n  <string name=\"key_debug_trigger_daily_reminder_notification_one\">key_debug_trigger_daily_reminder_notification</string>\n  <string name=\"key_debug_trigger_daily_reminder_notification_many\">key_debug_trigger_daily_reminder_notification_many</string>\n  <string name=\"key_debug_trigger_namedays_notification\">key_debug_trigger_namedays_notification</string>\n  <string name=\"key_debug_trigger_bank_holiday\">key_debug_trigger_bank_holiday</string>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/dimens-contact_details.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <dimen name=\"contact_details_text_size\">24sp</dimen>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/dimens.xml",
    "content": "<resources>\n\n  <!-- Default screen margins, per the Android Design guidelines. -->\n  <dimen name=\"activity_horizontal_margin\">8dp</dimen>\n  <dimen name=\"activity_vertical_margin\">8dp</dimen>\n  <dimen name=\"padding\">16dp</dimen>\n  <dimen name=\"padding_tight\">8dp</dimen>\n\n  <dimen name=\"title_textsize\">22sp</dimen>\n  <dimen name=\"row_textsize\">18sp</dimen>\n\n  <dimen name=\"avatar_size\">64dp</dimen>\n  <dimen name=\"avatar_size_min\">32dp</dimen>\n\n\n  <item name=\"landscape_weight\"\n    format=\"float\"\n    type=\"dimen\">1\n  </item>\n\n  <dimen name=\"contactdetail_height\">250dp</dimen>\n  <dimen name=\"widgetHeight\">48dp</dimen>\n  <dimen name=\"widget_margin\">0dp</dimen>\n\n  <dimen name=\"margin_top_empty_view\">24dp</dimen>\n\n\n  <dimen name=\"navigation_min_height\">52dp</dimen>\n  <dimen name=\"navigation_image_margin\">12dp</dimen>\n  <dimen name=\"navigation_horizontal_padding\">16dp</dimen>\n  <dimen name=\"navigation_label_textSize\">22sp</dimen>\n  <dimen name=\"navigation_min_end_padding\">56dp</dimen>\n\n\n  <dimen name=\"list_padding_horizontal\">16dp</dimen>\n  <dimen name=\"circle_avatar_size\">60dp</dimen>\n\n\n  <dimen name=\"mab_height\">56dp</dimen>\n  <dimen name=\"touch_target\">48dp</dimen>\n  <dimen name=\"dialog_button_paddingHorizontal\">16dp</dimen>\n  <dimen name=\"dialog_button_minHeight\">36dp</dimen>\n\n  <dimen name=\"dialog_button_content_paddingTop\">24dp</dimen>\n  <dimen name=\"touch_target_small\">36dp</dimen>\n\n  <dimen name=\"initials_textSize\">24sp</dimen>\n\n  <dimen name=\"about_header\">14sp</dimen>\n  <dimen name=\"about_body\">14sp</dimen>\n  <dimen name=\"about_footer\">14sp</dimen>\n  <dimen name=\"paragraph\">36sp</dimen>\n\n\n  <dimen name=\"small_avatar_radius\">48dp</dimen>\n  <dimen name=\"material_icon_padding\">16dp</dimen>\n  <dimen name=\"event_row_height\">32dp</dimen>\n  <dimen name=\"widget_block_x1\">40dp</dimen>\n  <dimen name=\"widget_block_x2\">110dp</dimen>\n  <dimen name=\"widget_block_x3\">180dp</dimen>\n  <dimen name=\"widget_block_x4\">250dp</dimen>\n\n\n  <dimen name=\"mini_avatar_size\">24dp</dimen>\n  <dimen name=\"avatar_placeholder_height\">38dp</dimen>\n  <dimen name=\"size_daymarker\">56dp</dimen>\n\n  <dimen name=\"padding_month_header_vertical\">38dp</dimen>\n  <dimen name=\"padding_upcoming_vertical\">18dp</dimen>\n\n\n  <!-- design -->\n  <dimen name=\"detail_backdrop_height\">360dp</dimen>\n\n\n  <dimen name=\"list_item_avatar_size\">40dp</dimen>\n\n  <dimen name=\"fab_margin\">16dp</dimen>\n  <dimen name=\"fab_size_normal\">48dp</dimen>\n  <dimen name=\"fab_total_size\">64dp</dimen>\n  <dimen name=\"content_padding_vertical\">0dp</dimen>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/divider-res.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n  <dimen name=\"horizontal_divider_height\">1px</dimen>\n  <color name=\"divider_grey\">#33333333</color>\n\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/donate-resources.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\">\n\n  <style name=\"Donate.Text\" parent=\"None\" />\n\n  <style name=\"Theme.Donate\"\n    parent=\"Theme.Memento.Light.DarkToolbar\">\n    <item name=\"colorPrimary\">#55B2A5</item>\n    <item name=\"colorPrimaryDark\">#1C8778</item>\n    <item name=\"colorSecondary\">#F15454</item>\n    <item name=\"colorAccent\">#F1B554</item>\n    <item name=\"android:windowDrawsSystemBarBackgrounds\"\n      tools:targetApi=\"lollipop\">true\n    </item>\n  </style>\n\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/drawable.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<resources>\n    <item name=\"selectable_back\" type=\"drawable\">@drawable/selectable_background_dayslight</item>\n    <item name=\"selectable_back_no_bounds\" type=\"drawable\">@drawable/selectable_background_dayslight</item>\n\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/facebook-resources.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <string name=\"title_facebook_log_in\">@string/Facebook_Log_In</string>\n  <string name=\"title_facebook_friends_import\">@string/Import_from_Facebook</string>\n  <string name=\"facebook_hi\">@string/Hi_X</string>\n  <string name=\"facebook_more_description\">@string/Your_Friends_will_be_here_shortly_smiley</string>\n  <string name=\"facebook_error\">@string/An_error_came_up</string>\n  <string name=\"facebook_try_again\">@string/Try_again_in_a_bit</string>\n  <string name=\"facebook_send_message\">@string/message</string>\n  <string name=\"facebook_friends_update_daily\">@string/Friends_update_daily</string>\n  <string name=\"facebook_profile_fb_page\">@string/Memento_on_Facebook</string>\n  <string name=\"title_facebook_profile\">@string/Facebook_profile</string>\n\n  <dimen name=\"facebook_avatar_width\">120dp</dimen>\n  <dimen name=\"facebook_avatar_height\">120dp</dimen>\n  <dimen name=\"facebook_avatar_stroke\">2dp</dimen>\n\n  <style name=\"FacebookImport.CTAButton\" parent=\"None\">\n    <item name=\"android:textColor\">?colorAccent</item>\n    <item name=\"android:background\">@drawable/selectable_background_dayslight</item>\n  </style>\n\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/ids.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <item name=\"header_fragment\" type=\"id\"/>\n</resources>"
  },
  {
    "path": "android_mobile/src/main/res/values/integers.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n     <integer name=\"config_slide_time\">600</integer>\n    <integer name=\"grid_card_columns\">2</integer>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/main_preferences-resources.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <string name=\"main_preferences_full_name_title\">@string/Use_all_parts_of_names</string>\n  <string name=\"main_preferences_full_name_summary_on\">@string/The_app_will_lookup_namedays_for_all_names_in_a_contact_including_surname</string>\n  <string name=\"main_preferences_full_name_summary_off\">@string/The_app_will_lookup_namedays_only_in_contacts_given_names_excluding_surname</string>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/namedayscreen-resources.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n  <dimen name=\"nameday_contact_name_size\">14sp</dimen>\n  <dimen name=\"nameday_item_minheight\">60dp</dimen>\n\n  <style name=\"NamedayScreen\"></style>\n\n  <style name=\"NamedayScreen.Text\">\n    <item name=\"android:textColor\">?primaryTextColor</item>\n  </style>\n\n  <style name=\"NamedayScreen.Text.Name\">\n    <item name=\"android:textSize\">16sp</item>\n    <item name=\"android:textStyle\">bold</item>\n  </style>\n\n  <style name=\"NamedayScreen.Text.ContactName\">\n    <item name=\"android:textSize\">14sp</item>\n  </style>\n\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/no_contacts.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\"\n  tools:ignore=\"MissingTranslation\">\n  <string name=\"no_contacts_text\">@string/No_contacts_with_events_found_Tap_the_plus_to_add_some</string>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/nocontacts_styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n  <style name=\"NoContacts\" />\n\n  <style name=\"NoContacts.Text\">\n    <item name=\"android:textSize\">16sp</item>\n    <item name=\"android:fontFamily\">sans-serif-light</item>\n  </style>\n\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/people_resources.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <dimen name=\"people_import_bottom_spacing\">40dp</dimen>\n    <dimen name=\"people_inbetween_spacing\">10dp</dimen>\n</resources>"
  },
  {
    "path": "android_mobile/src/main/res/values/person-resources.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n  <style name=\"Person\" />\n\n  <style name=\"Person.Text\">\n    <item name=\"android:textSize\">15sp</item>\n  </style>\n\n  <style name=\"Person.Name\">\n    <item name=\"android:textSize\">20sp</item>\n    <item name=\"android:textColor\">?attr/primaryTextColorInverse</item>\n    <item name=\"android:fontFamily\">sans-serif-medium</item>\n  </style>\n\n  <style name=\"Person.AgeAndSign\">\n    <item name=\"android:textSize\">18sp</item>\n    <item name=\"android:textColor\">?attr/primaryTextColorInverse</item>\n  </style>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/pref_fragment_dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n/* //device/apps/common/assets/res/any/dimens.xml\n**\n** Copyright 2006, The Android Open Source Project\n**\n** Licensed under the Apache License, Version 2.0 (the \"License\");\n** you may not use this file except in compliance with the License.\n** You may obtain a copy of the License at\n**\n**     http://www.apache.org/licenses/LICENSE-2.0\n**\n** Unless required by applicable law or agreed to in writing, software\n** distributed under the License is distributed on an \"AS IS\" BASIS,\n** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n** See the License for the specific language governing permissions and\n** limitations under the License.\n*/\n-->\n<resources>\n    \n\t<!-- Preference fragment padding, bottom -->\n    <dimen name=\"preference_fragment_padding_bottom\">0dp</dimen>\n    <!-- Preference fragment padding, sides -->\n    <dimen name=\"preference_fragment_padding_side\">16dp</dimen>\n\n    <dimen name=\"preference_fragment_padding_switch\">16dp</dimen>\n\n\n    <integer name=\"preference_fragment_scrollbarStyle\">0x02000000</integer> <!-- outsideOverlay -->\n    \n</resources>"
  },
  {
    "path": "android_mobile/src/main/res/values/pref_fragment_strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n/* //device/apps/common/assets/res/any/strings.xml\n**\n** Copyright 2006, The Android Open Source Project\n**\n** Licensed under the Apache License, Version 2.0 (the \"License\");\n** you may not use this file except in compliance with the License.\n** You may obtain a copy of the License at\n**\n**     http://www.apache.org/licenses/LICENSE-2.0\n**\n** Unless required by applicable law or agreed to in writing, software\n** distributed under the License is distributed on an \"AS IS\" BASIS,\n** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n** See the License for the specific language governing permissions and\n** limitations under the License.\n*/\n-->\n<resources xmlns:tools=\"http://schemas.android.com/tools\"\n  xmlns:xliff=\"urn:oasis:names:tc:xliff:document:1.2\"\n  tools:ignore=\"MissingTranslation\">\n\n  <!--  Strings for possible PreferenceActivity Back/Next buttons -->\n  <string name=\"back_button_label\">Back</string>\n  <string name=\"next_button_label\">Next</string>\n\n  <!-- Optional button to Skip a PreferenceActivity [CHAR LIMIT=20] -->\n  <string name=\"skip_button_label\">Skip</string>\n\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/search-resources.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <string name=\"search_hint_contacts\">@string/Search_for_contacts</string>\n  <string name=\"search_hint_contacts_and_namedays\">@string/Search_for_contacts_or_namedays</string>\n  <string name=\"search_clear_title\">@string/Clear</string>\n  <color name=\"search_hint_color\">#808080</color>\n\n  <dimen name=\"search_result_card_vertical_padding\">8dp</dimen>\n  <dimen name=\"search_result_card_horizontal_padding\">8dp</dimen>\n\n\n  <style name=\"SearchResult\" />\n\n  <style name=\"SearchResult.ContactName\"\n    parent=\"Card.Text\">\n    <item name=\"android:ellipsize\">end</item>\n    <item name=\"android:lines\">1</item>\n    <item name=\"android:textColor\">?primaryTextColor</item>\n  </style>\n\n  <style name=\"SearchResult.EventLabel\">\n    <item name=\"android:fontFamily\">sans-serif-condensed</item>\n  </style>\n\n  <style name=\"SearchResult.Card\">\n    <item name=\"android:padding\">8dp</item>\n  </style>\n\n  <style name=\"SearchResult.Avatar\">\n    <item name=\"android:layout_height\">48dp</item>\n    <item name=\"android:layout_width\">48dp</item>\n    <item name=\"android:scaleType\">centerCrop</item>\n    <item name=\"isCircle\">true</item>\n  </style>\n\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/string_keys.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\"\n  tools:ignore=\"MissingTranslation\">\n  <string name=\"key_enable_namedays\">enable_disable_namedays</string>\n  <string name=\"key_version_name\">version_name</string>\n  <string name=\"key_contact_dev\">contact_dev</string>\n  <string name=\"key_daily_reminder\">daily_reminder</string>\n  <string name=\"key_daily_reminder_screen\">key_daily_reminder_screen</string>\n  <string name=\"key_daily_reminder_ringtone\">key_daily_reminder_ringtone</string>\n  <string name=\"key_daily_reminder_vibrate_enabled\">key_daily_reminder_vibrate_enabled</string>\n  <string name=\"key_daily_reminder_time\">key_daily_reminder_time</string>\n  <string name=\"key_daily_reminder_hour\">key_daily_reminder_hour</string>\n  <string name=\"key_daily_reminder_minute\">key_daily_reminder_minute</string>\n  <string name=\"key_translucent_bars\">key_translucent_bars</string>\n  <string name=\"key_notification_namedays\">key_notification_namedays</string>\n  <string name=\"key_has_played_about_anim\">key_has_played_about_anim</string>\n  <string name=\"key_nameday_lang\">key_nameday_lang</string>\n  <string name=\"key_namedays_language\">key_namedays_language</string>\n  <string name=\"pref_app\">pref_app</string>\n  <string name=\"prev_app_version\">prev_app_version</string>\n  <string name=\"key_enable_namedays_notification\">key_enable_namedays_notification</string>\n  <string name=\"key_namedays_contacts_only\">key_namedays_contacts_only</string>\n  <string name=\"key_selected_starting_page\">key_selected_starting_page</string>\n  <string name=\"pref_call_to_rate\">pref_call_to_rate</string>\n  <string name=\"key_has_user_rated\">key_has_user_rated</string>\n  <string name=\"key_rate_previous_time_asked\">key_rate_previous_time_asked</string>\n  <string name=\"key_rate_triggered\">key_rate_triggered</string>\n  <string name=\"pref_namedays\">pref_namedays</string>\n  <string name=\"key_app_theme_id\">key_app_theme_id</string>\n  <string name=\"key_daily_reminder_settings\">key_daily_reminder_settings</string>\n  <string name=\"pref_upcoming_widget_config\">pref_upcoming_widget_config</string>\n  <string name=\"key_upcoming_widget_variant\">key_upcoming_widget_variant</string>\n  <string name=\"key_upcoming_widget_opacity\">key_upcoming_widget_opacity</string>\n  <string name=\"key_enable_bank_holidays\">key_enable_bank_holidays</string>\n  <string name=\"key_bankholidays_language\">key_bankholidays_language</string>\n  <string name=\"key_namedays_full_name\">key_namedays_full_name</string>\n  <string name=\"key_has_donated\">key_has_donated</string>\n  <string name=\"key_donate_restore\">key_donate_restore</string>\n  <string name=\"pref_facebook\">pref_facebook</string>\n  <string name=\"key_facebook_user_id\">key_facebook_user_id</string>\n  <string name=\"key_facebook_user_key\">key_facebook_user_key</string>\n  <string name=\"key_facebook_user_name\">key_facebook_user_name</string>\n  <string name=\"pref_events\">pref_events</string>\n  <string name=\"key_events_are_initialised\">key_events_are_initialised</string>\n  <string name=\"key_database_version\">key_database_version</string>\n  <string name=\"key_daily_reminder_advanced_settings\">key_daily_reminder_advanced_settings</string>\n\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/styles.xml",
    "content": "<resources xmlns:android=\"http://schemas.android.com/apk/res/android\" xmlns:tools=\"http://schemas.android.com/tools\">\n\n\n    <style name=\"TextAppearance.BloodCherry.AvatarNumber\" parent=\"@android:style/TextAppearance.Large\">\n        <item name=\"android:textSize\">@dimen/title_textsize</item>\n        <item name=\"android:background\">@color/avatar_number</item>\n        <item name=\"android:textColor\">@android:color/white</item>\n    </style>\n\n    <style name=\"TextAppearance.BloodCherry.NumberPickerTitle\" parent=\"@android:style/TextAppearance.Medium\">\n\n        <item name=\"android:textStyle\">bold</item>\n    </style>\n\n    <style name=\"TextAppearance.BloodCherry.NumberPickerSummary\" parent=\"@android:style/TextAppearance.Small\"></style>\n\n\n    <style name=\"Theme.Daysspecial.DialogWhenLarge\" parent=\"@style/Theme.AppCompat.Light.DialogWhenLarge\" />\n\n\n    <style name=\"TextAppearance.BloodCherry.TextView.OnRed.Medium\" parent=\"@android:style/TextAppearance.Medium\">\n        <item name=\"android:textColor\">@color/font_on_red</item>\n\n    </style>\n\n    <style name=\"TextAppearance.BloodCherry.TextView.OnRed.Small\" parent=\"@android:style/TextAppearance.Small\">\n        <item name=\"android:textColor\">@color/font_on_red</item>\n    </style>\n\n    <style name=\"TextAppearance.BloodCherry.TextView.OnRed.Large\" parent=\"@android:style/TextAppearance.Large\">\n        <item name=\"android:textColor\">@color/font_on_red</item>\n    </style>\n\n    <style name=\"TextAppearance.BloodCherry.TextView.Medium\" parent=\"@android:style/TextAppearance.Medium\">\n        <item name=\"android:textColor\">@color/card_text</item>\n    </style>\n\n\n    <style name=\"TextAppearance.BloodCherry.TextView.Large\" parent=\"@android:style/TextAppearance.Large\">\n        <item name=\"android:textColor\">@color/card_text</item>\n    </style>\n\n    <style name=\"PromptAnimationBottom\">\n        <item name=\"android:windowEnterAnimation\">@anim/slide_in_from_below</item>\n        <item name=\"android:windowExitAnimation\">@android:anim/fade_out</item>\n    </style>\n\n    <style name=\"PromptAnimationTop\">\n        <item name=\"android:windowEnterAnimation\">@android:anim/fade_in</item>\n        <item name=\"android:windowExitAnimation\">@android:anim/fade_out</item>\n    </style>\n\n    <style name=\"DialogTheme\" parent=\"Theme.Dayslight.DialogNoTitle\" />\n\n\n    <style name=\"CardAction\">\n        <item name=\"android:background\">@drawable/selectable_background_dayslight</item>\n        <item name=\"android:textSize\">@dimen/card_text_size_action</item>\n        <item name=\"android:textColor\">?attr/colorAccent</item>\n\n    </style>\n\n\n    <style name=\"CardViewStyle\">\n        <item name=\"android:foreground\">@drawable/selectable_background_dayslight</item>\n    </style>\n\n    <style name=\"CardViewStyle.Blue\" parent=\"CardViewStyle\" />\n\n    <style name=\"CardViewStyle.Red\" parent=\"CardViewStyle\" />\n\n\n    <style name=\"SelectableBackground\">\n        <item name=\"android:background\">@drawable/selectable_background_dayslight</item>\n    </style>\n\n\n    <style name=\"TouchTarget\">\n        <item name=\"android:minHeight\">@dimen/touch_target</item>\n        <item name=\"android:background\">@drawable/selectable_background_dayslight</item>\n    </style>\n\n    <style name=\"TextAppearance.RateMeText\" parent=\"TextAppearance.AppCompat.Medium\" />\n\n    <style name=\"DaysLight.RatingBar\" parent=\"android:Widget.RatingBar\" />\n\n    <style name=\"DayCircle\" parent=\"TextAppearance.AppCompat.Inverse\">\n\n    </style>\n\n    <style name=\"DayCircle.Day\" parent=\"TextAppearance.AppCompat.Small\">\n        <item name=\"android:fontFamily\">sans-serif-light</item>\n    </style>\n\n    <style name=\"DayCircle.Date\" parent=\"TextAppearance.AppCompat.Large\" />\n\n    <style name=\"TextAppearance.InitialsView\" parent=\"TextAppearance.AppCompat\">\n        <item name=\"android:textColor\">@android:color/white</item>\n        <item name=\"android:textSize\">@dimen/initials_textSize</item>\n        <item name=\"android:fontFamily\">sans-serif-light</item>\n    </style>\n\n\n    <style name=\"Theme.Dayslight.DialogNoTitle\" parent=\"Theme.AppCompat.Light.Dialog.Alert\">\n        <item name=\"android:windowNoTitle\">true</item>\n        <item name=\"windowNoTitle\">true</item>\n    </style>\n\n    <style name=\"TextAppearance.ContactDisplayName\" parent=\"TextAppearance.AppCompat.Large.Inverse\">\n        <item name=\"android:textSize\">28sp</item>\n    </style>\n\n    <style name=\"Widget.CardContent\" parent=\"android:Widget\">\n        <item name=\"android:paddingLeft\">16dp</item>\n        <item name=\"android:paddingRight\">16dp</item>\n        <item name=\"android:paddingTop\">24dp</item>\n        <item name=\"android:paddingBottom\">24dp</item>\n        <item name=\"android:orientation\">vertical</item>\n    </style>\n\n\n    <style name=\"BirthdayPicker.Picker\">\n        <item name=\"android:layout_margin\">8dp</item>\n    </style>\n\n    <style name=\"Upcoming.MonthHeader\">\n        <item name=\"android:fontFamily\">sans-serif-condensed</item>\n    </style>\n\n    <style name=\"Widget.Memento.Toolbar\" parent=\"Widget.AppCompat.Toolbar\">\n        <item name=\"android:theme\">?attr/toolbarTheme</item>\n        <item name=\"elevation\">@dimen/toolbar_elevation</item>\n        <item name=\"android:background\">?attr/colorPrimary</item>\n    </style>\n\n    <style name=\"Divider\">\n        <item name=\"android:layout_height\">@dimen/horizontal_divider_height</item>\n        <item name=\"android:layout_width\">match_parent</item>\n    </style>\n\n    <style name=\"None\" />\n\n    <style name=\"BottomSheetDialog\" parent=\"Theme.Design.Light.BottomSheetDialog\">\n        <item name=\"bottomSheetStyle\">@style/bottomSheetStyleWrapper</item>\n    </style>\n\n    <style name=\"bottomSheetStyleWrapper\" parent=\"Widget.Design.BottomSheet.Modal\">\n        <item name=\"behavior_peekHeight\">500dp</item>\n    </style>\n\n    <style name=\"Memento.TextAppearance\" parent=\"None\" />\n\n    <style name=\"Memento.TextAppearance.ListSeparator\">\n        <item name=\"android:fontFamily\">sans-serif-medium</item>\n        <item name=\"android:gravity\">bottom|center_vertical</item>\n        <item name=\"android:minHeight\">36dp</item>\n        <item name=\"android:textColor\">?colorAccent</item>\n        <item name=\"android:textSize\">14sp</item>\n    </style>\n\n    <style name=\"Theme.Memento.Wallpaper\" parent=\"Theme.Memento.Modern\">\n        <item name=\"android:windowShowWallpaper\">true</item>\n        <item name=\"android:windowBackground\">@android:color/transparent</item>\n        <item name=\"android:colorBackgroundCacheHint\">@null</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/support-resources.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n  <style name=\"Support\" />\n\n  <style name=\"Support.HeartView\">\n    <item name=\"android:scaleType\">center</item>\n    <item name=\"android:src\">@drawable/ic_favorite_border_white_48dp</item>\n  </style>\n\n  <style name=\"Support.HeartView.Container\">\n    <item name=\"android:background\">@color/primary_red</item>\n  </style>\n\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/support-strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <string name=\"support_title\">Like the app?</string>\n  <string name=\"support_app_description\">I would really appreciate it if you can spend some minutes of your time to review the app. It means a lot to me and it motivates me to keep improving the app</string>\n  <string name=\"support_app_description_short\">Got some minutes to rate the app?</string>\n\n  <string name=\"support_app_rate_button\">@string/rate</string>\n  <string name=\"support_app_cancel_button\">No, thanks</string>\n  <string name=\"support_thanks_for_rating\">Thank you for supporting the app!</string>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/themes-strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <string name=\"theme_preference_title\">@string/Themes</string>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/themes.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\">\n\n\n  <bool name=\"lightNavigationBar\">false</bool>\n  <color name=\"navigationBarColor\">@android:color/black</color>\n\n  <style name=\"Theme.Memento.Light\"\n    parent=\"@style/Theme.AppCompat.Light.NoActionBar\">\n    <item name=\"popupTheme\">@style/ThemeOverlay.AppCompat.Light</item>\n    <item name=\"android:windowBackground\">@color/light_grey</item>\n    <item name=\"toolbarIconColor\">@color/light_toolbar_icon_color</item>\n    <item name=\"primaryTextColor\">@color/black_light</item>\n    <item name=\"primaryTextColorInverse\">@android:color/white</item>\n    <item name=\"android:windowLightStatusBar\" tools:targetApi=\"m\">?attr/useDarkIcons</item>\n    <item name=\"android:navigationBarColor\" tools:targetApi=\"lollipop\">@color/navigationBarColor</item>\n    <item name=\"android:windowLightNavigationBar\" tools:targetApi=\"27\">@bool/lightNavigationBar</item>\n  </style>\n\n  <style name=\"Theme.Memento.Light.DarkToolbar\">\n    <item name=\"useDarkIcons\">false</item>\n    <item name=\"toolbarIconColor\">@color/dark_toolbar_icon_color</item>\n    <item name=\"toolbarTheme\">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item>\n    <item name=\"primaryTextColor\">@color/card_text</item>\n    <item name=\"primaryTextColorInverse\">@android:color/white</item>\n  </style>\n\n  <style name=\"Theme.Memento.Dark\"\n    parent=\"@style/Theme.AppCompat.NoActionBar\">\n    <item name=\"popupTheme\">@style/ThemeOverlay.AppCompat.Dark</item>\n    <item name=\"useDarkIcons\">false</item>\n    <item name=\"toolbarIconColor\">@color/dark_toolbar_icon_color</item>\n  </style>\n\n\n  <style name=\"Theme.Memento.Dark.DarkToolbar\">\n    <item name=\"useDarkIcons\">false</item>\n    <item name=\"toolbarIconColor\">@color/dark_toolbar_icon_color</item>\n    <item name=\"toolbarTheme\">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item>\n    <item name=\"primaryTextColor\">@android:color/white</item>\n    <item name=\"primaryTextColorInverse\">@color/black_light</item>\n  </style>\n\n  <style name=\"Theme.Memento.Light.LightToolbar\">\n    <item name=\"useDarkIcons\">true</item>\n    <item name=\"toolbarIconColor\">@color/light_toolbar_icon_color</item>\n    <item name=\"toolbarTheme\">@style/ThemeOverlay.AppCompat.ActionBar</item>\n  </style>\n\n  <style name=\"Widget.Memento.Toolbar.Light\"\n    parent=\"ThemeOverlay.AppCompat.ActionBar\">\n    <item name=\"colorControlNormal\">#000</item>\n    <item name=\"titleTextColor\">#000</item>\n  </style>\n\n  <style name=\"Widget.Memento.Toolbar.Dark\"\n    parent=\"@style/ThemeOverlay.AppCompat.Dark.ActionBar\" />\n\n\n  <style name=\"ActionBar.Transparent.Dayslight\"\n    parent=\"@style/Widget.AppCompat.Light.ActionBar\">\n    <item name=\"background\">@drawable/ab_transparent_dayslight</item>\n    <item name=\"progressBarStyle\">@style/ProgressBar.Dayslight</item>\n  </style>\n\n  <style name=\"PopupMenu.Dayslight\"\n    parent=\"@style/Widget.AppCompat.Light.PopupMenu\">\n    <item name=\"android:popupBackground\">@drawable/menu_dropdown_panel_dayslight</item>\n  </style>\n\n  <style name=\"DropDownListView.Dayslight\"\n    parent=\"@style/Widget.AppCompat.Light.ListView.DropDown\">\n    <item name=\"android:listSelector\">@drawable/selectable_background_dayslight</item>\n  </style>\n\n  <style name=\"ActionBarTabStyle.Dayslight\"\n    parent=\"@style/Widget.AppCompat.Light.ActionBar.TabView\">\n    <item name=\"android:background\">@drawable/tab_indicator_ab_dayslight</item>\n  </style>\n\n  <style name=\"DropDownNav.Dayslight\"\n    parent=\"@style/Widget.AppCompat.Light.Spinner.DropDown.ActionBar\">\n    <item name=\"android:background\">@drawable/spinner_background_ab_dayslight</item>\n    <item name=\"android:popupBackground\">@drawable/menu_dropdown_panel_dayslight</item>\n    <item name=\"android:dropDownSelector\">@drawable/selectable_background_dayslight</item>\n  </style>\n\n  <style name=\"ProgressBar.Dayslight\"\n    parent=\"@style/Widget.AppCompat.ProgressBar.Horizontal\">\n    <item name=\"android:progressDrawable\">@drawable/progress_horizontal_dayslight</item>\n  </style>\n\n\n  <!-- this style is only referenced in a Light.DarkActionBar based theme -->\n  <style name=\"Theme.Dayslight.Widget\"\n    parent=\"@style/Theme.AppCompat\">\n    <item name=\"popupMenuStyle\">@style/PopupMenu.Dayslight</item>\n    <item name=\"dropDownListViewStyle\">@style/DropDownListView.Dayslight</item>\n  </style>\n\n  <style name=\"ProgressBarDaysLight\"\n    parent=\"android:Widget.ProgressBar.Horizontal\">\n    <item name=\"android:progressDrawable\">@drawable/dayslight_progress_horizontal_holo_light\n    </item>\n    <item name=\"android:indeterminateDrawable\">\n      @drawable/dayslight_progress_indeterminate_horizontal_holo_light\n    </item>\n    <item name=\"android:minHeight\">16dip</item>\n    <item name=\"android:maxHeight\">16dip</item>\n  </style>\n\n  <color name=\"dark_toolbar_icon_color\">#fff</color>\n  <color name=\"light_toolbar_icon_color\">#85000000</color>\n\n  <attr name=\"primaryTextColor\"\n    format=\"reference|color\" />\n  <attr name=\"primaryTextColorInverse\"\n    format=\"reference|color\" />\n  <attr name=\"toolbarIconColor\"\n    format=\"color\" />\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/today_widget_strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <string name=\"today_widget_empty\"\n    translatable=\"false\">@string/No_contacts_with_events_found</string>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/toolbar-resources.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <dimen name=\"toolbar_elevation\">4dp</dimen>\n  <dimen name=\"toolbar_minHeight\">56dp</dimen>\n  <dimen name=\"toolbar_semi_expanded_height\">64dp</dimen>\n\n\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/upcoming-resources.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"upcoming_events_bankholidays_title\">@string/Bank_holiday</string>\n    <string name=\"upcoming_events_namedays_title\">@string/namedays</string>\n    <string name=\"plus_x_more\">+%d more</string>\n    <string name=\"upcoming_select_date\">@string/Select_date</string>\n\n    <dimen name=\"upcoming_event_header_vertical_spacing\">40dp</dimen>\n    <dimen name=\"upcoming_event_vertical_spacing\">20dp</dimen>\n\n    <dimen name=\"upcoming_space_between_title_and_content\">15dp</dimen>\n    <dimen name=\"upcoming_event_padding_horizontal\">16dp</dimen>\n\n    <color name=\"upcoming_header_text_color\">#B0B0B0</color>\n    <color name=\"upcoming_header_today_text_color\">#535353</color>\n\n    <style name=\"Upcoming\" parent=\"None\" />\n\n    <style name=\"Upcoming.Toolbar\" parent=\"None\" />\n\n    <style name=\"Upcoming.Toolbar.TitleText\" parent=\"TextAppearance.Widget.AppCompat.Toolbar.Title\">\n        <item name=\"android:textSize\">16sp</item>\n        <item name=\"android:textColor\">#a0000000</item>\n    </style>\n\n    <style name=\"Upcoming.DateTitle\">\n        <item name=\"android:paddingTop\">24dp</item>\n        <item name=\"android:fontFamily\">sans-serif-condensed</item>\n        <item name=\"android:paddingBottom\">16dp</item>\n\n        <item name=\"android:paddingLeft\">@dimen/upcoming_event_padding_horizontal</item>\n        <item name=\"android:paddingRight\">@dimen/upcoming_event_padding_horizontal</item>\n\n        <item name=\"android:textSize\">@dimen/card_header_text_size_medium</item>\n    </style>\n\n    <style name=\"Upcoming.Avatar\">\n        <item name=\"letterSize\">16sp</item>\n        <item name=\"isCircle\">true</item>\n        <item name=\"android:layout_width\">52dp</item>\n        <item name=\"android:layout_height\">52dp</item>\n    </style>\n\n    <style name=\"Upcoming.Text\" parent=\"None\">\n        <item name=\"android:ellipsize\">end</item>\n        <item name=\"android:textSize\">14sp</item>\n    </style>\n\n    <style name=\"Upcoming.Text.Content\">\n        <item name=\"android:lineSpacingExtra\">10sp</item>\n        <item name=\"android:maxLines\">2</item>\n    </style>\n\n    <style name=\"Upcoming.Text.Header\">\n        <item name=\"android:fontFamily\">sans-serif-condensed</item>\n        <item name=\"android:textSize\">16sp</item>\n    </style>\n\n    <style name=\"Upcoming.TodayBackground\">\n        <item name=\"android:gravity\">center_vertical</item>\n        <item name=\"android:orientation\">horizontal</item>\n        <item name=\"android:minHeight\">@dimen/size_daymarker</item>\n    </style>\n\n    <style name=\"Upcoming.EventsText\">\n        <item name=\"android:paddingLeft\">@dimen/padding_tight</item>\n        <item name=\"android:paddingRight\">@dimen/padding_tight</item>\n        <item name=\"android:ellipsize\">end</item>\n        <item name=\"android:maxLines\">2</item>\n        <item name=\"android:textColor\">@color/card_text</item>\n        <item name=\"android:textSize\">16sp</item>\n    </style>\n\n    <style name=\"Upcoming.EventItem\">\n        <item name=\"android:paddingLeft\">@dimen/upcoming_event_padding_horizontal</item>\n        <item name=\"android:paddingRight\">@dimen/upcoming_event_padding_horizontal</item>\n    </style>\n\n    <style name=\"Upcoming.ShowMore\" parent=\"Upcoming.EventItem\">\n        <item name=\"android:background\">@drawable/selectable_background_dayslight</item>\n    </style>\n\n\n    <style name=\"Upcoming.ContactName\">\n        <item name=\"android:lines\">1</item>\n    </style>\n\n\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/upcoming_widget_dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <dimen name=\"widget_avatar_size\">64dp</dimen>\n  <dimen name=\"upcoming_widget_size\">64dp</dimen>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/upcoming_widget_preview-resources.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <dimen name=\"upcoming_widget_preview_vertical_margin\">80dp</dimen>\n\n  <string name=\"upcoming_widget_configure_save\">@string/Done</string>\n  <string name=\"upcoming_widget_dark_theme_label\">@string/Use_dark_theme</string>\n\n\n  <color name=\"upcoming_widget_light_textcolor\">@color/card_text</color>\n  <color name=\"upcoming_widget_light_background\">#FFFFFFFF</color>\n  <color name=\"upcoming_widget_dark_textcolor\">@android:color/white</color>\n  <color name=\"upcoming_widget_dark_background\">@android:color/black</color>\n\n\n  <style name=\"UpcomingWidget\" />\n\n  <style name=\"UpcomingWidget.Seekbar\">\n    <item name=\"android:max\">4</item>\n  </style>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values/widget_upcoming_events-resources.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <string name=\"widget_upcoming_title_simple\">Upcoming - Simple</string>\n  <string name=\"widget_upcoming_title_list\">Upcoming - Scrolling</string>\n\n  <dimen name=\"widget_upcoming_avatar_size\">52dp</dimen>\n  <dimen name=\"widget_upcoming_avatar_text_size\">24sp</dimen>\n  <dimen name=\"widget_upcoming_vertical_padding\">8dp</dimen>\n  <dimen name=\"widget_upcoming_horizontal_padding\">16dp</dimen>\n  <color name=\"widget_upcoming_text_color\">#515151</color>\n\n  <color name=\"widget_upcoming_avatar_background_color\">@color/main_red</color>\n  <color name=\"widget_upcoming_avatar_text_color\">@color/main_white</color>\n\n  <style name=\"Widget.Upcoming.Text\"\n    parent=\"Upcoming.Text.Content\">\n    <item name=\"android:textColor\">@color/widget_upcoming_text_color</item>\n  </style>\n\n  <style name=\"Widget.Upcoming.Header\"\n    parent=\"Upcoming.Text.Header\">\n    <item name=\"android:textColor\">@color/widget_upcoming_text_color</item>\n  </style>\n\n  <style name=\"Widget.Upcoming.TodayDate\"\n    parent=\"None\">\n    <item name=\"android:textColor\">@color/main_white</item>\n    <item name=\"android:textSize\">20sp</item>\n    <item name=\"android:paddingLeft\">@dimen/widget_upcoming_horizontal_padding</item>\n    <item name=\"android:paddingRight\">@dimen/widget_upcoming_horizontal_padding</item>\n    <item name=\"android:gravity\">center_vertical</item>\n    <item name=\"android:minHeight\">48dp</item>\n  </style>\n\n  <style name=\"Widget.Upcoming.ContactName\"\n    parent=\"Upcoming.ContactName\">\n    <item name=\"android:textColor\">@color/widget_upcoming_text_color</item>\n    <item name=\"android:lines\">1</item>\n    <item name=\"android:textSize\">18sp</item>\n    <item name=\"android:paddingLeft\">@dimen/upcoming_event_padding_horizontal</item>\n    <item name=\"android:paddingRight\">@dimen/upcoming_event_padding_horizontal</item>\n  </style>\n\n  <style name=\"Widget.Upcoming.DateTitle\"\n    parent=\"None\">\n    <item name=\"android:textColor\">@color/widget_upcoming_text_color</item>\n    <item name=\"android:fontFamily\">sans-serif-condensed</item>\n    <item name=\"android:textSize\">18sp</item>\n    <item name=\"android:paddingTop\">@dimen/widget_upcoming_vertical_padding</item>\n    <item name=\"android:paddingBottom\">@dimen/widget_upcoming_vertical_padding</item>\n    <item name=\"android:paddingLeft\">@dimen/upcoming_event_padding_horizontal</item>\n    <item name=\"android:paddingRight\">@dimen/upcoming_event_padding_horizontal</item>\n  </style>\n\n  <style name=\"Widget.Upcoming.ShowMore\"\n    parent=\"Upcoming.EventItem\">\n    <item name=\"android:background\">@drawable/selectable_background_dayslight</item>\n    <item name=\"android:textColor\">@color/widget_upcoming_text_color</item>\n  </style>\n\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values-el/bool.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <bool name=\"isGreekLocaleSelected\">true</bool>\n    <bool name=\"isNamedaySupported\">true</bool>\n    <bool name=\"isBankholidaysSupported\">true</bool>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values-el/support-strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <string name=\"support_title\">Σου αρέσει η εφαρμογή;</string>\n  <string name=\"support_app_description\">Θα το εκτιμούσα αν προσφέρεις λίγα λεπτά από τον χρόνος σου για να βαθμολογήσεις την εφαρμογή. Είναι ένας τρόπος που με παροτρύνει να βελτιώνω την εφαρμογή</string>\n  <string name=\"support_app_description_short\">Υποστήριξε την εφαρμογή βαθμολογώντας την</string>\n\n  <string name=\"support_app_rate_button\">@string/rate</string>\n  <string name=\"support_app_cancel_button\">Όχι, ευχαριστώ</string>\n  <string name=\"support_thanks_for_rating\">Ευχαριστώ για την υποστήριξη!</string>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values-it/bool.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <bool name=\"isNamedaySupported\">true</bool>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values-land/bools.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <bool name=\"isLandscape\">true</bool>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values-land/dimens.xml",
    "content": "<resources>\n\n    <item name=\"landscape_weight\" format=\"float\" type=\"dimen\">0.8</item>\n\n</resources>"
  },
  {
    "path": "android_mobile/src/main/res/values-land/integers.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <integer name=\"grid_card_columns\">3</integer>\n</resources>"
  },
  {
    "path": "android_mobile/src/main/res/values-land/toolbar-resources.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <dimen name=\"toolbar_minHeight\">48dp</dimen>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values-land-v23/themes.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <bool name=\"lightNavigationBar\">true</bool>\n  <color name=\"navigationBarColor\">@android:color/white</color>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values-large/bool.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <bool name=\"isLargeScreen\">true</bool>\n</resources>"
  },
  {
    "path": "android_mobile/src/main/res/values-sw600dp/bottom_sheet-resources.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <integer name=\"bottom_sheet_span_count\">4</integer>\n\n  <dimen name=\"bottom_sheet_layout_width\">446dp</dimen>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values-sw600dp/dimens.xml",
    "content": "<resources>\n\n    <dimen name=\"card_padding_horizontal\">24dp</dimen>\n    <dimen name=\"card_spacing_between\">16dp</dimen>\n\n</resources>"
  },
  {
    "path": "android_mobile/src/main/res/values-sw600dp/integers.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <integer name=\"grid_card_columns\">3</integer>\n</resources>"
  },
  {
    "path": "android_mobile/src/main/res/values-sw600dp/toolbar-resources.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <dimen name=\"toolbar_minHeight\">64dp</dimen>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values-sw720dp/bottom_sheet-resources.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n  <dimen name=\"bottom_sheet_layout_width\">480dp</dimen>\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values-sw720dp-land/dimens.xml",
    "content": "<resources>\n\n    <!--\n         Customize dimensions originally defined in res/values/dimens.xml (such as\n         screen margins) for sw720dp devices (e.g. 10\" tablets) in landscape here.\n    -->\n    <dimen name=\"activity_horizontal_margin\">128dp</dimen>\n\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values-v21/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n/* //device/apps/common/assets/res/any/dimens.xml\n**\n** Copyright 2006, The Android Open Source Project\n**\n** Licensed under the Apache License, Version 2.0 (the \"License\");\n** you may not use this file except in compliance with the License.\n** You may obtain a copy of the License at\n**\n**     http://www.apache.org/licenses/LICENSE-2.0\n**\n** Unless required by applicable law or agreed to in writing, software\n** distributed under the License is distributed on an \"AS IS\" BASIS,\n** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n** See the License for the specific language governing permissions and\n** limitations under the License.\n*/\n-->\n<resources>\n    \n\t<!-- Preference fragment padding, bottom -->\n    <dimen name=\"preference_fragment_padding_bottom\">0dp</dimen>\n    <!-- Preference fragment padding, sides -->\n    <dimen name=\"preference_fragment_padding_side\">0dp</dimen>\n    <dimen name=\"preference_fragment_padding_switch\">16dp</dimen>\n\n    <integer name=\"preference_fragment_scrollbarStyle\">0x02000000</integer> <!-- outsideOverlay -->\n\n  <dimen name=\"content_padding_vertical\">24dp</dimen>\n    \n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/values-v21/drawable.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <item name=\"selectable_back\" type=\"drawable\">@drawable/neutral_ripple</item>\n    <item name=\"selectable_back_no_bounds\" type=\"drawable\">@drawable/neutral_ripple_no_mask</item>\n</resources>\n\n\n\n"
  },
  {
    "path": "android_mobile/src/main/res/values-v21/styles.xml",
    "content": "<resources xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n  <style name=\"CardViewStyle\">\n    <item name=\"android:foreground\">@drawable/neutral_ripple</item>\n  </style>\n\n  <style name=\"CardViewStyle.Red\">\n    <item name=\"android:foreground\">@drawable/red_ripple</item>\n  </style>\n\n  <style name=\"CardViewStyle.Blue\">\n    <item name=\"android:foreground\">@drawable/blue_ripple</item>\n  </style>\n\n\n  <style name=\"SelectableBackground\">\n    <item name=\"android:background\">?android:selectableItemBackground</item>\n  </style>\n\n\n  <style name=\"TouchTarget\">\n    <item name=\"android:background\">@drawable/neutral_ripple</item>\n  </style>\n\n\n</resources>\n"
  },
  {
    "path": "android_mobile/src/main/res/xml/file_paths.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<paths>\n  <external-path\n    name=\"my_images\"\n    path=\"Android/data/com.alexstyl.specialdates/files/Pictures\" />\n\n</paths>\n"
  },
  {
    "path": "android_mobile/src/main/res/xml/preference_dailyreminder.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n  <CheckBoxPreference\n    android:key=\"@string/key_daily_reminder\"\n    android:title=\"@string/enable\" />\n\n  <com.alexstyl.android.preferences.widget.TimePreference\n    android:defaultValue=\"8:00\"\n    android:key=\"@string/key_daily_reminder_time\"\n    android:summary=\"@string/daily_reminder_time_summary\"\n    android:title=\"@string/set_time\" />\n\n  <com.alexstyl.specialdates.settings.ClickableRingtonePreference\n    android:key=\"@string/key_daily_reminder_ringtone\"\n    android:ringtoneType=\"notification\"\n    android:title=\"@string/Sound\" />\n\n  <CheckBoxPreference\n    android:key=\"@string/key_daily_reminder_vibrate_enabled\"\n    android:title=\"@string/vibrate\" />\n\n</PreferenceScreen>\n"
  },
  {
    "path": "android_mobile/src/main/res/xml/preference_debug.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n\n    <Preference\n        android:key=\"@string/key_debug_refresh_db\"\n        android:title=\"Refresh database\" />\n\n    <PreferenceScreen android:title=\"Daily Reminder\">\n        <Preference\n            android:key=\"@string/key_debug_daily_reminder\"\n            android:title=\"Trigger Daily Reminder\" />\n\n        <CheckBoxPreference\n            android:key=\"@string/key_debug_daily_reminder_date_enable\"\n            android:title=\"Fake date\" />\n\n        <Preference\n            android:dependency=\"@string/key_debug_daily_reminder_date_enable\"\n            android:key=\"@string/key_debug_daily_reminder_date\"\n            android:title=\"Daily Reminder Date\" />\n    </PreferenceScreen>\n\n    <Preference\n        android:key=\"@string/key_debug_start_calendar\"\n        android:title=\"Start Calendar Intent\" />\n\n    <Preference\n        android:key=\"@string/key_debug_reset_donations\"\n        android:title=\"Reset Donations\" />\n    <Preference\n        android:key=\"@string/key_debug_trigger_support\"\n        android:title=\"Trigger support dialog time\" />\n\n    <Preference\n        android:key=\"@string/key_debug_refresh_db\"\n        android:title=\"Refresh database\" />\n\n    <Preference\n        android:key=\"@string/key_debug_open_contact\"\n        android:title=\"Open Contact\" />\n\n    <PreferenceCategory android:title=\"Widgets\">\n        <Preference\n            android:key=\"@string/key_debug_refresh_widget\"\n            android:title=\"Refresh Widget\" />\n\n        <Preference\n            android:key=\"@string/key_debug_configure_widgets\"\n            android:title=\"Open Widget Screen\" />\n    </PreferenceCategory>\n\n    <PreferenceCategory android:title=\"Facebook\">\n        <Preference\n            android:key=\"@string/key_debug_facebook\"\n            android:title=\"Open Facebook Sign in\" />\n        <Preference\n            android:key=\"@string/key_debug_facebook_fetch_friends\"\n            android:title=\"Update Friends\" />\n    </PreferenceCategory>\n    <PreferenceCategory android:title=\"Wear\">\n        <Preference\n            android:key=\"@string/key_debug_trigger_wear_service\"\n            android:title=\"Trigger WearSyncService\" />\n    </PreferenceCategory>\n\n    <PreferenceCategory android:title=\"Notifications\">\n        <Preference\n            android:key=\"@string/key_debug_trigger_daily_reminder_notification_one\"\n            android:title=\"Show Daily Reminder notification for one contact\" />\n\n        <Preference\n            android:key=\"@string/key_debug_trigger_daily_reminder_notification_many\"\n            android:title=\"Show Daily Reminder notification for multiple contact\" />\n        <Preference\n            android:key=\"@string/key_debug_trigger_namedays_notification\"\n            android:title=\"Show Namedays notification\" />\n\n        <Preference\n            android:key=\"@string/key_debug_trigger_bank_holiday\"\n            android:title=\"Show Bank Holiday notification\" />\n    </PreferenceCategory>\n\n</PreferenceScreen>\n"
  },
  {
    "path": "android_mobile/src/main/res/xml/preference_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n  <Preference\n    android:key=\"@string/key_donate_restore\"\n    android:summary=\"@string/donate_restore_summary\"\n    android:title=\"@string/donate_restore_title\" />\n\n  <Preference\n    android:key=\"@string/key_app_theme_id\"\n    android:title=\"@string/theme_preference_title\" />\n\n  <Preference\n    android:key=\"@string/key_daily_reminder_settings\"\n    android:summary=\"@string/daily_reminder_summary\"\n    android:title=\"@string/daily_reminder\">\n\n    <intent\n      android:action=\"android.intent.action.VIEW\"\n      android:targetClass=\"com.alexstyl.specialdates.settings.DailyReminderActivity\"\n      android:targetPackage=\"com.alexstyl.specialdates\" />\n\n  </Preference>\n\n  <PreferenceCategory android:title=\"@string/Bank_holidays\">\n\n    <CheckBoxPreference\n      android:defaultValue=\"@bool/isBankholidaysSupported\"\n      android:key=\"@string/key_enable_bank_holidays\"\n      android:title=\"@string/bankholidays_preferences_title\" />\n\n    <Preference\n      android:dependency=\"@string/key_enable_bank_holidays\"\n      android:key=\"@string/key_bankholidays_language\"\n      android:summary=\"@string/Greek\"\n      android:title=\"@string/bankholidays_preferences_language_title\" />\n\n  </PreferenceCategory>\n\n  <PreferenceCategory android:title=\"@string/namedays\">\n    <CheckBoxPreference\n      android:defaultValue=\"@bool/isNamedaySupported\"\n      android:key=\"@string/key_enable_namedays\"\n      android:summaryOff=\"@string/display_namedays_off\"\n      android:summaryOn=\"@string/display_namedays_on\"\n      android:title=\"@string/display_namedays\" />\n\n    <com.alexstyl.specialdates.settings.NamedayListPreference\n      android:dependency=\"@string/key_enable_namedays\"\n      android:key=\"@string/key_namedays_language\"\n      android:title=\"@string/nameday_language_title\" />\n\n    <CheckBoxPreference\n      android:defaultValue=\"false\"\n      android:dependency=\"@string/key_enable_namedays\"\n      android:key=\"@string/key_namedays_contacts_only\"\n      android:summaryOff=\"@string/namedays_contacts_only_off\"\n      android:summaryOn=\"@string/namedays_contacts_only_on\"\n      android:title=\"@string/namedays_contacts_only\" />\n\n    <CheckBoxPreference\n      android:defaultValue=\"false\"\n      android:dependency=\"@string/key_enable_namedays\"\n      android:key=\"@string/key_namedays_full_name\"\n      android:summaryOff=\"@string/main_preferences_full_name_summary_off\"\n      android:summaryOn=\"@string/main_preferences_full_name_summary_on\"\n      android:title=\"@string/main_preferences_full_name_title\" />\n  </PreferenceCategory>\n\n</PreferenceScreen>\n"
  },
  {
    "path": "android_mobile/src/main/res/xml/widget_info_upcoming_events_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<appwidget-provider xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:autoAdvanceViewId=\"@+id/row_widget_text\"\n  android:initialLayout=\"@layout/widget_upcoming_events\"\n  android:minHeight=\"180dp\"\n  android:minWidth=\"180dp\"\n  android:previewImage=\"@drawable/widget_preview_upcoming_scrolling\"\n  android:resizeMode=\"horizontal|vertical\"\n  android:updatePeriodMillis=\"43200000\"\n  android:widgetCategory=\"home_screen|keyguard\" />\n\n"
  },
  {
    "path": "android_mobile/src/main/res/xml/widget_info_upcoming_events_simple.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<appwidget-provider xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:configure=\"com.alexstyl.specialdates.upcoming.widget.today.UpcomingWidgetConfigureActivity\"\n  android:initialKeyguardLayout=\"@layout/widget_today\"\n  android:initialLayout=\"@layout/widget_today\"\n  android:minHeight=\"@dimen/widgetHeight\"\n  android:minResizeHeight=\"@dimen/widgetHeight\"\n  android:minResizeWidth=\"270dp\"\n  android:minWidth=\"270dp\"\n  android:previewImage=\"@drawable/widget_preview_upcoming_simple\"\n  android:resizeMode=\"horizontal\"\n  android:updatePeriodMillis=\"43200000\"\n  android:widgetCategory=\"home_screen|keyguard\" />\n\n"
  },
  {
    "path": "android_mobile/src/main/res/xml-v26/preference_dailyreminder.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n  <CheckBoxPreference\n    android:key=\"@string/key_daily_reminder\"\n    android:title=\"@string/enable\" />\n\n  <com.alexstyl.android.preferences.widget.TimePreference\n    android:defaultValue=\"8:00\"\n    android:key=\"@string/key_daily_reminder_time\"\n    android:summary=\"@string/daily_reminder_time_summary\"\n    android:title=\"@string/set_time\" />\n\n  <Preference\n    android:key=\"@string/key_daily_reminder_advanced_settings\"\n    android:summary=\"@string/daily_reminder_advanced_settings_summary\"\n    android:title=\"@string/Advanced_notification_settings\" />\n\n</PreferenceScreen>\n"
  },
  {
    "path": "android_mobile/src/test/java/com/alexstyl/resources/JavaStrings.kt",
    "content": "package com.alexstyl.resources\n\nimport com.alexstyl.specialdates.Strings\nimport com.alexstyl.specialdates.events.namedays.NamedayLocale\nimport com.alexstyl.specialdates.events.peopleevents.EventType\nimport com.alexstyl.specialdates.events.peopleevents.StandardEventType\nimport com.alexstyl.specialdates.person.StarSign\n\nclass JavaStrings : Strings {\n    override fun contactUpdated(): String = \"contactUpdated\"\n\n    override fun contactAdded(): String = \"contactAdded\"\n\n    override fun contactAddedFailed(): String = \"contactAddedFailed\"\n\n    override fun contactUpdateFailed(): String = \"contactUpdateFailed\"\n\n    override fun dontForgetToSendWishes(): String = \"Don't forget to send your wishes!\"\n    override fun call(): String = \"Call\"\n\n    override fun sendWishes(): String = \"Send wishes\"\n\n    override fun bankholidaySubtitle(): String = \"Tap to see more events.\"\n    override fun contacts(): String = \"Contacts\"\n    override fun bankholidays(): String = \"Bank Holidays\"\n\n    override fun namedays(): String = \"Namedays\"\n\n    override fun dailyReminder(): String = \"Daily Reminder\"\n    override fun importFromFacebook(): String = \"Import from Facebook\"\n\n    override fun viewFacebookProfile(): String = \"View Facebook Friends\"\n\n    override fun postOnFacebook(): String = \"Post on Facebook\"\n\n    override fun facebook(): String = \"Facebook\"\n\n    override fun viewConversation(): String = \"View Conversations\"\n\n    override fun facebookMessenger(): String = \"Messenger\"\n\n    override fun nameOf(starSign: StarSign): String = when (starSign) {\n        StarSign.AQUARIUS -> \"Aquarius\"\n        StarSign.PISCES -> \"Pisces\"\n        StarSign.ARIES -> \"Aries\"\n        StarSign.TAURUS -> \"Taurus\"\n        StarSign.GEMINI -> \"Gemini\"\n        StarSign.CANCER -> \"Cancer\"\n        StarSign.LEO -> \"Leo\"\n        StarSign.VIRGO -> \"Virgo\"\n        StarSign.LIBRA -> \"Libra\"\n        StarSign.SCORPIO -> \"Scorpio\"\n        StarSign.SAGITTARIUS -> \"Sagittarius\"\n        StarSign.CAPRICORN -> \"Capricorn\"\n    }\n\n    override fun turnsAge(age: Int): String = \"Turns \" + age\n\n    override fun inviteFriend(): String = \"Invite Friend\"\n\n    override fun todaysNamedays(numberOfNamedays: Int): String {\n        return if (numberOfNamedays > 0) {\n            \"todays namedays\"\n        } else {\n            \"todays nameday\"\n        }\n    }\n\n    override fun donateAmount(amount: String): String = \"Donate \" + amount\n\n    override fun eventOnDate(eventLabel: String, dateLabel: String): String = eventLabel + \" on \" + dateLabel\n\n    override fun appName(): String = \"DEBUG APP\"\n\n    override fun shareText(): String = \"Share Text\"\n\n    override fun today(): String = \"today\"\n\n    override fun tomorrow(): String = \"tomorrow\"\n\n    override fun todayCelebrateTwo(nameOne: String, nameTwo: String): String = \"Today celebrate $nameOne and $nameTwo\"\n\n    override fun todayCelebrateMany(name: String, numberLeft: Int): String = \"Today celebrate $name and $numberLeft other\"\n\n    override fun nameOfEvent(event: EventType): String = when (event) {\n        StandardEventType.BIRTHDAY -> \"Birthday\"\n        StandardEventType.NAMEDAY -> \"Nameday\"\n        StandardEventType.ANNIVERSARY -> \"Anniversary\"\n        StandardEventType.OTHER -> \"Other\"\n        StandardEventType.CUSTOM -> \"Custom\"\n        else -> {\n            throw IllegalStateException(\"$event has no name\")\n        }\n    }\n\n    override fun localeName(locale: NamedayLocale): String = when (locale) {\n        NamedayLocale.GREEK -> \"Greek\"\n        NamedayLocale.ROMANIAN -> \"Romanian\"\n        NamedayLocale.RUSSIAN -> \"Russian\"\n        NamedayLocale.LATVIAN -> \"Latvian\"\n        NamedayLocale.LATVIAN_EXTENDED -> \"Latvian (Extended)\"\n        NamedayLocale.SLOVAK -> \"Slovak\"\n        NamedayLocale.ITALIAN -> \"Italian\"\n        NamedayLocale.CZECH -> \"Czech\"\n        NamedayLocale.HUNGARIAN -> \"Hungarian\"\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/test/java/com/alexstyl/specialdates/person/CompositeContactActionsProviderTest.kt",
    "content": "package com.alexstyl.specialdates.person\n\nimport android.graphics.drawable.Drawable\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.contact.DisplayName\nimport com.alexstyl.specialdates.dailyreminder.NoActions\nimport org.fest.assertions.api.Assertions.assertThat\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.BDDMockito.given\nimport org.mockito.Mockito.mock\nimport org.mockito.runners.MockitoJUnitRunner\nimport java.net.URI\n\n@RunWith(MockitoJUnitRunner::class)\nclass CompositeContactActionsProviderTest {\n\n    private var mockProviderA = mock(ContactActionsProvider::class.java)\n    private val SOURCE_A = 1\n    private var mockProviderB = mock(ContactActionsProvider::class.java)\n    private val SOURCE_B = 2\n\n    private lateinit var provider: CompositeContactActionsProvider\n\n    @Before\n    fun setup() {\n        provider = CompositeContactActionsProvider(\n                mapOf(\n                        Pair(SOURCE_A, mockProviderA),\n                        Pair(SOURCE_B, mockProviderB))\n        )\n    }\n\n    @Test\n    fun givenASpecificContact_thenReturnMessagingActionsForContactOfTheSpecificSource() {\n        val aContact = Contact(5, DisplayName.from(\"Alex\"), URI.create(\"\"), SOURCE_A)\n\n        val expectedValues = listOf(\n                ContactActionViewModel(\n                        ContactAction(\"aValeu\", \"aLabel\", {}),\n                        0, mock(Drawable::class.java)\n                )\n        )\n        given(mockProviderA.messagingActionsFor(aContact, NoActions())).willReturn(expectedValues)\n        given(mockProviderB.messagingActionsFor(aContact, NoActions())).willReturn(listOf(\n                ContactActionViewModel(\n                        ContactAction(\"bValeu\", \"bLabel\", {}),\n                        0, mock(Drawable::class.java)\n                )\n        ))\n        val actualValues = provider.messagingActionsFor(aContact, NoActions())\n\n        assertThat(actualValues).isEqualTo(expectedValues)\n    }\n\n    @Test\n    fun givenASpecificContact_thenReturnCallingActionsForContactOfTheSpecificSource() {\n        val aContact = Contact(5, DisplayName.from(\"Alex\"), URI.create(\"\"), SOURCE_A)\n\n        val expectedValues = listOf(\n                ContactActionViewModel(\n                        ContactAction(\"aValeu\", \"aLabel\", {}),\n                        0, mock(Drawable::class.java)\n                )\n        )\n        given(mockProviderA.callActionsFor(aContact, NoActions())).willReturn(expectedValues)\n        given(mockProviderB.callActionsFor(aContact, NoActions())).willReturn(listOf(\n                ContactActionViewModel(\n                        ContactAction(\"bValeu\", \"bLabel\", {}),\n                        0, mock(Drawable::class.java)\n                )\n        ))\n        val actualValues = provider.callActionsFor(aContact, NoActions())\n\n        assertThat(actualValues).isEqualTo(expectedValues)\n    }\n}\n"
  },
  {
    "path": "android_mobile/src/test/java/com/alexstyl/specialdates/person/PersonInfoViewModelFactoryTest.kt",
    "content": "package com.alexstyl.specialdates.person\n\nimport com.alexstyl.resources.JavaStrings\nimport com.alexstyl.specialdates.Optional\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.contact.DisplayName\nimport com.alexstyl.specialdates.date.ContactEvent\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.Months.JANUARY\nimport com.alexstyl.specialdates.date.Months.JULY\nimport com.alexstyl.specialdates.events.peopleevents.StandardEventType\nimport org.fest.assertions.api.Assertions.assertThat\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.runners.MockitoJUnitRunner\nimport java.net.URI\n\n@RunWith(MockitoJUnitRunner::class)\nclass PersonInfoViewModelFactoryTest {\n\n    private val strings = JavaStrings()\n    private val toViewModel = PersonDetailsViewModelFactory(strings, AgeCalculator(Date.on(30, JULY, 2017)));\n\n    @Test\n    fun whenPassingAContact_thenAlwaysReturnItsName() {\n        var resultViewModel = toViewModel(aContactCalled(\"Anna Roberts\"), null, true)\n        assertThat(resultViewModel.displayName).isEqualTo(\"Anna Roberts\")\n    }\n\n    @Test\n    fun whenPassingNoContactEvent_thenAgeAndStarSignIsEmptyString() {\n        var resultViewModel = toViewModel(aContactCalled(\"Anna Roberts\"), null, true)\n        assertThat(resultViewModel.ageAndStarSignlabel).isEqualTo(\"\")\n    }\n\n    @Test\n    fun whenPassingABirthdayWithoutYear_thenAgeAndStarSignContainsOnlyStarSign() {\n        val dateOfBirth = Date.on(1, JANUARY)\n        val contactEvent = ContactEvent(Optional.absent(), StandardEventType.BIRTHDAY, dateOfBirth, aContactCalled(\"Anna Roberts\"))\n\n        var resultViewModel = toViewModel(aContactCalled(\"Anna Roberts\"), contactEvent, true)\n        assertThat(resultViewModel.ageAndStarSignlabel).isEqualTo(\"Capricorn ♑\")\n    }\n\n    @Test\n    fun whenPassingABirthdayWithYear_thenAgeAndStarSignContainsBothAgeAndStarSign() {\n        val dateOfBirth = Date.on(1, JANUARY, 1990)\n        val contactEvent = ContactEvent(Optional.absent(), StandardEventType.BIRTHDAY, dateOfBirth, aContactCalled(\"Anna Roberts\"))\n\n        var resultViewModel = toViewModel(aContactCalled(\"Anna Roberts\"), contactEvent, true)\n        assertThat(resultViewModel.ageAndStarSignlabel).isEqualTo(\"27, Capricorn ♑\")\n    }\n\n\n    fun aContactCalled(peter: String): Contact {\n        return Contact(-1, DisplayName.from(peter), URI.create(\"https://www.alexstyl.com/image.jpg\"), 1)\n    }\n\n}\n"
  },
  {
    "path": "android_wear/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "android_wear/build.gradle",
    "content": "apply plugin: 'com.android.application'\napply from: '../versions.gradle'\n\nrepositories {\n    jcenter()\n    mavenCentral()\n    google()\n    maven {\n        url 'http://dl.bintray.com/novoda/maven'\n    }\n    maven { url 'https://maven.fabric.io/public' }\n}\n\n\nandroid {\n    compileSdkVersion androidCompileSdkVersion\n    buildToolsVersion androidBuildToolsVersion\n\n    defaultConfig {\n        applicationId \"com.alexstyl.specialdates\"\n        minSdkVersion 21\n        targetSdkVersion 27\n        versionCode androidVersionCode\n        versionName androidVersionName\n    }\n    buildTypes {\n        release {\n            shrinkResources true\n            minifyEnabled true\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n        debug {\n            minifyEnabled false\n        }\n    }\n    lintOptions {\n        abortOnError false\n    }\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    implementation project(':android_common')\n    implementation 'com.google.android.support:wearable:2.0.0-alpha2'\n    implementation \"com.google.android.gms:play-services-wearable:$play_services_version\"\n    implementation 'com.novoda:notils:2.2.15'\n}\n"
  },
  {
    "path": "android_wear/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /Users/daniele/Downloads/sdk/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n"
  },
  {
    "path": "android_wear/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  package=\"com.alexstyl.specialdates\">\n\n  <uses-feature android:name=\"android.hardware.type.watch\" />\n\n  <application\n    android:allowBackup=\"true\"\n    android:icon=\"@mipmap/ic_launcher\"\n    android:label=\"@string/localised_app_name\"\n    android:supportsRtl=\"true\"\n    android:theme=\"@android:style/Theme.DeviceDefault\">\n\n    <activity\n      android:name=\".ContactEventsActivity\"\n      android:label=\"@string/localised_app_name\">\n      <intent-filter>\n        <action android:name=\"android.intent.action.MAIN\" />\n        <category android:name=\"android.intent.category.LAUNCHER\" />\n      </intent-filter>\n    </activity>\n\n    <service\n      android:name=\".ContactEventsProviderService\"\n      android:icon=\"@drawable/ic_complication_contact_event\"\n      android:label=\"@string/contact_events_complication_provider_label\">\n\n      <intent-filter>\n        <action android:name=\"android.support.wearable.complications.ACTION_COMPLICATION_UPDATE_REQUEST\" />\n      </intent-filter>\n\n      <meta-data\n        android:name=\"android.support.wearable.complications.SUPPORTED_TYPES\"\n        android:value=\"SHORT_TEXT,LONG_TEXT\" />\n\n      <meta-data\n        android:name=\"android.support.wearable.complications.UPDATE_PERIOD_SECONDS\"\n        android:value=\"0\" />\n\n    </service>\n\n    <service android:name=\".DataChangedListenerService\">\n      <intent-filter>\n        <action android:name=\"com.google.android.gms.wearable.DATA_CHANGED\" />\n\n        <data\n          android:host=\"*\"\n          android:pathPrefix=\"/next-contact-events\"\n          android:scheme=\"wear\" />\n      </intent-filter>\n    </service>\n\n  </application>\n\n</manifest>\n"
  },
  {
    "path": "android_wear/src/main/java/com/alexstyl/specialdates/ContactEventsActivity.java",
    "content": "package com.alexstyl.specialdates;\n\nimport android.app.Activity;\nimport android.app.Dialog;\nimport android.content.DialogInterface;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.support.annotation.NonNull;\nimport android.support.annotation.Nullable;\nimport android.text.format.DateUtils;\nimport android.util.Log;\nimport android.view.View;\nimport android.widget.LinearLayout;\nimport android.widget.TextView;\n\nimport com.alexstyl.specialdates.wear.SharedConstants;\nimport com.google.android.gms.common.ConnectionResult;\nimport com.google.android.gms.common.GoogleApiAvailability;\nimport com.google.android.gms.common.api.GoogleApiClient;\nimport com.google.android.gms.wearable.DataApi;\nimport com.google.android.gms.wearable.DataEvent;\nimport com.google.android.gms.wearable.DataEventBuffer;\nimport com.google.android.gms.wearable.DataItem;\nimport com.google.android.gms.wearable.DataMap;\nimport com.google.android.gms.wearable.DataMapItem;\nimport com.google.android.gms.wearable.Wearable;\nimport com.novoda.notils.string.StringUtils;\n\nimport java.util.ArrayList;\n\npublic class ContactEventsActivity extends Activity {\n\n    private static final String TAG = ContactEventsActivity.class.getSimpleName();\n\n    private TextView dateText;\n    private TextView namesText;\n    private TextView emptyText;\n    private LinearLayout eventContainer;\n\n    private GoogleApiClient googleApiClient;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_contact_events);\n\n        dateText = findViewById(R.id.contact_events_date_text);\n        namesText = findViewById(R.id.contact_events_names_text);\n        emptyText = findViewById(R.id.contact_events_empty_text);\n        eventContainer = findViewById(R.id.contact_events_event_container);\n\n        googleApiClient = new GoogleApiClient.Builder(this)\n                .addApi(Wearable.API)\n                .addConnectionCallbacks(connectionCallback)\n                .addOnConnectionFailedListener(connectionFailedListener)\n                .build();\n    }\n\n    private final GoogleApiClient.ConnectionCallbacks connectionCallback = new GoogleApiClient.ConnectionCallbacks() {\n\n        @Override\n        public void onConnected(@Nullable Bundle bundle) {\n            Wearable.DataApi.addListener(googleApiClient, dataListener);\n            WearCommunicationService wearCommunicationService = new WearCommunicationService(googleApiClient);\n            wearCommunicationService.loadDataItems(itemsLoadedCallback);\n        }\n\n        @Override\n        public void onConnectionSuspended(int i) {\n            Log.d(TAG, \"connectionSuspended: \" + i);\n        }\n    };\n\n    private final GoogleApiClient.OnConnectionFailedListener connectionFailedListener = new GoogleApiClient.OnConnectionFailedListener() {\n\n        private static final int CODE = 100;\n\n        @Override\n        public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {\n            Log.d(TAG, \"connectionFailed: \" + connectionResult);\n            Dialog errorDialog = GoogleApiAvailability.getInstance()\n                    .getErrorDialog(ContactEventsActivity.this, connectionResult.getErrorCode(), CODE);\n            errorDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {\n                @Override\n                public void onDismiss(DialogInterface dialogInterface) {\n                    ContactEventsActivity.this.finish();\n                }\n            });\n            errorDialog.show();\n        }\n    };\n\n    private final WearCommunicationService.Callback itemsLoadedCallback = new WearCommunicationService.Callback() {\n        @Override\n        public void onDataItemsLoaded(DataItem item) {\n            displayDataItem(item);\n        }\n\n        @Override\n        public void onNoDataItemsAvailable() {\n            showEmptyItems();\n        }\n    };\n\n    private void showEmptyItems() {\n        eventContainer.setVisibility(View.GONE);\n        emptyText.setVisibility(View.VISIBLE);\n    }\n\n    private final DataApi.DataListener dataListener = new DataApi.DataListener() {\n        @Override\n        public void onDataChanged(DataEventBuffer dataEventBuffer) {\n            for (DataEvent event : dataEventBuffer) {\n                if (event.getType() == DataEvent.TYPE_CHANGED) {\n                    DataItem item = event.getDataItem();\n                    if (uriIsSupported(item.getUri())) {\n                        displayDataItem(item);\n                    }\n                }\n            }\n        }\n    };\n\n    private boolean uriIsSupported(Uri uri) {\n        return uri.getPath().equals(SharedConstants.NEXT_CONTACT_EVENTS_PATH);\n    }\n\n    private void displayDataItem(DataItem item) {\n        DataMap dataMap = DataMapItem.fromDataItem(item).getDataMap();\n        long date = dataMap.getLong(SharedConstants.KEY_DATE);\n        CharSequence dateString = formatDate(date);\n        ArrayList<String> namesList = dataMap.getStringArrayList(SharedConstants.KEY_CONTACTS_NAMES);\n\n        dateText.setText(dateString);\n        namesText.setText(StringUtils.join(namesList, \"\\n\"));\n        emptyText.setVisibility(View.GONE);\n        eventContainer.setVisibility(View.VISIBLE);\n    }\n\n    private CharSequence formatDate(long date) {\n        return DateUtils.getRelativeTimeSpanString(\n                date,\n                System.currentTimeMillis(),\n                DateUtils.DAY_IN_MILLIS,\n                0\n        );\n    }\n\n    @Override\n    protected void onResume() {\n        super.onResume();\n        googleApiClient.connect();\n    }\n\n    @Override\n    protected void onPause() {\n        super.onPause();\n        Wearable.DataApi.removeListener(googleApiClient, dataListener);\n        googleApiClient.disconnect();\n    }\n}\n"
  },
  {
    "path": "android_wear/src/main/java/com/alexstyl/specialdates/ContactEventsProviderService.java",
    "content": "package com.alexstyl.specialdates;\n\nimport android.annotation.TargetApi;\nimport android.app.PendingIntent;\nimport android.content.Intent;\nimport android.graphics.drawable.Icon;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.wearable.complications.ComplicationData;\nimport android.support.wearable.complications.ComplicationManager;\nimport android.support.wearable.complications.ComplicationProviderService;\nimport android.support.wearable.complications.ComplicationText;\nimport android.text.format.DateUtils;\nimport android.util.Log;\n\nimport com.alexstyl.specialdates.wear.SharedConstants;\nimport com.google.android.gms.common.api.GoogleApiClient;\nimport com.google.android.gms.wearable.DataItem;\nimport com.google.android.gms.wearable.DataMap;\nimport com.google.android.gms.wearable.DataMapItem;\nimport com.google.android.gms.wearable.Wearable;\nimport com.novoda.notils.string.StringUtils;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\n\npublic class ContactEventsProviderService extends ComplicationProviderService {\n\n    private static final String TAG = ContactEventsProviderService.class.getSimpleName();\n    private static final int CONTACT_EVENTS_ACTIVITY_REQUEST_CODE = 100;\n    private static final int NO_DATE_AVAILABLE = -1;\n    private static final String NO_DATE_PLACEHOLDER = \"-\";\n\n    private WearCommunicationService wearCommunicationService;\n\n    @Override\n    public void onComplicationUpdate(final int complicationId, final int dataType, final ComplicationManager complicationManager) {\n\n        GoogleApiClient.ConnectionCallbacks connectionCallbacks = new GoogleApiClient.ConnectionCallbacks() {\n            @Override\n            public void onConnected(@Nullable Bundle bundle) {\n                wearCommunicationService.loadDataItems(new WearCommunicationService.Callback() {\n                    @Override\n                    public void onDataItemsLoaded(DataItem item) {\n                        ComplicationData complicationData = createComplicationData(item, dataType);\n\n                        if (complicationData != null) {\n                            complicationManager.updateComplicationData(complicationId, complicationData);\n                        }\n                    }\n\n                    @Override\n                    public void onNoDataItemsAvailable() {\n                        ComplicationData emptyComplicationData = createComplicationData(dataType, NO_DATE_AVAILABLE, Collections.<String>emptyList());\n                        complicationManager.updateComplicationData(complicationId, emptyComplicationData);\n                    }\n                });\n            }\n\n            @Override\n            public void onConnectionSuspended(int i) {\n                // no-op\n            }\n        };\n\n        GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this)\n                .addApi(Wearable.API)\n                .addConnectionCallbacks(connectionCallbacks)\n                .build();\n\n        wearCommunicationService = new WearCommunicationService(googleApiClient);\n\n        googleApiClient.connect();\n    }\n\n    private ComplicationData createComplicationData(DataItem item, int dataType) {\n        DataMap dataMap = DataMapItem.fromDataItem(item).getDataMap();\n        long date = dataMap.getLong(SharedConstants.KEY_DATE);\n        ArrayList<String> namesList = dataMap.getStringArrayList(SharedConstants.KEY_CONTACTS_NAMES);\n\n        return createComplicationData(dataType, date, namesList);\n    }\n\n    @TargetApi(Build.VERSION_CODES.M)\n    @Nullable\n    private ComplicationData createComplicationData(int dataType, long date, List<String> namesList) {\n        ComplicationData complicationData = null;\n        switch (dataType) {\n            case ComplicationData.TYPE_SHORT_TEXT:\n                complicationData = new ComplicationData.Builder(ComplicationData.TYPE_SHORT_TEXT)\n                        .setShortText(ComplicationText.plainText(formatShortDate(date)))\n                        .setIcon(Icon.createWithResource(getApplicationContext(), R.drawable.ic_complication_contact_event))\n                        .setTapAction(createContactEventsActivityIntent())\n                        .build();\n                break;\n            case ComplicationData.TYPE_LONG_TEXT:\n                complicationData = new ComplicationData.Builder(ComplicationData.TYPE_LONG_TEXT)\n                        .setLongTitle(ComplicationText.plainText(formatLongDate(date)))\n                        .setLongText(ComplicationText.plainText(StringUtils.join(namesList, \", \")))\n                        .setIcon(Icon.createWithResource(getApplicationContext(), R.drawable.ic_complication_contact_event))\n                        .setTapAction(createContactEventsActivityIntent())\n                        .build();\n                break;\n            default:\n                Log.w(TAG, \"Unexpected complication type \" + dataType);\n                break;\n        }\n        return complicationData;\n    }\n\n    private CharSequence formatShortDate(long date) {\n        if (date == NO_DATE_AVAILABLE) {\n            return NO_DATE_PLACEHOLDER;\n        }\n        return DateUtils.getRelativeTimeSpanString(\n                date,\n                System.currentTimeMillis(),\n                DateUtils.DAY_IN_MILLIS,\n                DateUtils.FORMAT_NO_YEAR | DateUtils.FORMAT_ABBREV_ALL\n        );\n    }\n\n    private CharSequence formatLongDate(long date) {\n        if (date == NO_DATE_AVAILABLE) {\n            return NO_DATE_PLACEHOLDER;\n        }\n        return DateUtils.getRelativeTimeSpanString(\n                date,\n                System.currentTimeMillis(),\n                DateUtils.DAY_IN_MILLIS,\n                0\n        );\n    }\n\n    private PendingIntent createContactEventsActivityIntent() {\n        Intent intent = new Intent(this, ContactEventsActivity.class);\n        return PendingIntent.getActivity(this, CONTACT_EVENTS_ACTIVITY_REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT);\n    }\n\n}\n"
  },
  {
    "path": "android_wear/src/main/java/com/alexstyl/specialdates/DataChangedListenerService.java",
    "content": "package com.alexstyl.specialdates;\n\nimport android.content.ComponentName;\nimport android.support.wearable.complications.ProviderUpdateRequester;\n\nimport com.google.android.gms.wearable.DataEventBuffer;\nimport com.google.android.gms.wearable.WearableListenerService;\n\npublic class DataChangedListenerService extends WearableListenerService {\n\n    @Override\n    public void onDataChanged(DataEventBuffer dataEventBuffer) {\n        super.onDataChanged(dataEventBuffer);\n\n        ComponentName providerComponentName = new ComponentName(this, ContactEventsProviderService.class);\n        ProviderUpdateRequester providerUpdateRequester = new ProviderUpdateRequester(this, providerComponentName);\n        providerUpdateRequester.requestUpdateAll();\n    }\n}\n"
  },
  {
    "path": "android_wear/src/main/java/com/alexstyl/specialdates/WearCommunicationService.java",
    "content": "package com.alexstyl.specialdates;\n\nimport android.net.Uri;\nimport android.support.annotation.NonNull;\n\nimport com.alexstyl.specialdates.wear.SharedConstants;\nimport com.google.android.gms.common.api.GoogleApiClient;\nimport com.google.android.gms.common.api.PendingResult;\nimport com.google.android.gms.common.api.ResultCallback;\nimport com.google.android.gms.wearable.DataItem;\nimport com.google.android.gms.wearable.DataItemBuffer;\nimport com.google.android.gms.wearable.Wearable;\n\nclass WearCommunicationService {\n\n    private final GoogleApiClient googleApiClient;\n\n    WearCommunicationService(GoogleApiClient googleApiClient) {\n        this.googleApiClient = googleApiClient;\n    }\n\n    void loadDataItems(final Callback callback) {\n        PendingResult<DataItemBuffer> result = Wearable.DataApi.getDataItems(googleApiClient);\n        result.setResultCallback(new ResultCallback<DataItemBuffer>() {\n            @Override\n            public void onResult(@NonNull DataItemBuffer dataItems) {\n                boolean found = false;\n                for (DataItem item : dataItems) {\n                    if (uriIsUnsupported(item.getUri())) {\n                        continue;\n                    }\n                    callback.onDataItemsLoaded(item);\n                    found = true;\n                }\n                if (!found) {\n                    callback.onNoDataItemsAvailable();\n                }\n            }\n        });\n    }\n\n    private boolean uriIsUnsupported(Uri uri) {\n        return !uri.getPath().equals(SharedConstants.NEXT_CONTACT_EVENTS_PATH);\n    }\n\n    interface Callback {\n\n        void onDataItemsLoaded(DataItem item);\n\n        void onNoDataItemsAvailable();\n\n    }\n}\n"
  },
  {
    "path": "android_wear/src/main/res/layout/activity_contact_events.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  xmlns:tools=\"http://schemas.android.com/tools\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"match_parent\"\n  tools:context=\"com.alexstyl.specialdates.ContactEventsActivity\"\n  tools:deviceIds=\"wear_round\">\n\n  <LinearLayout\n    android:id=\"@+id/contact_events_event_container\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_centerInParent=\"true\"\n    android:gravity=\"center\"\n    android:orientation=\"vertical\">\n\n    <TextView\n      android:id=\"@+id/contact_events_date_text\"\n      style=\"@style/ContactEvents.Label.Date\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\" />\n\n    <TextView\n      android:id=\"@+id/contact_events_names_text\"\n      style=\"@style/ContactEvents.Label.Names\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:layout_marginTop=\"16dp\" />\n  </LinearLayout>\n\n  <TextView\n    android:id=\"@+id/contact_events_empty_text\"\n    style=\"@style/ContactEvents.Label\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_centerInParent=\"true\"\n    android:text=\"@string/contact_events_empty\"\n    android:visibility=\"gone\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "android_wear/src/main/res/values/contact_events-resource.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n  <string name=\"contact_events_empty\">@string/No_contacts_events_found</string>\n  <string name=\"contact_events_complication_provider_label\">@string/Contact_events</string>\n\n  <style name=\"ContactEvents\" />\n\n  <style name=\"ContactEvents.Label\">\n    <item name=\"android:fontFamily\">sans-serif</item>\n    <item name=\"android:gravity\">center</item>\n  </style>\n\n  <style name=\"ContactEvents.Label.Date\">\n    <item name=\"android:textStyle\">italic</item>\n    <item name=\"android:drawableTop\">@drawable/ic_complication_contact_event</item>\n    <item name=\"android:drawablePadding\">8dp</item>\n  </style>\n\n  <style name=\"ContactEvents.Label.Names\">\n    <item name=\"android:lineSpacingMultiplier\">1.2</item>\n  </style>\n\n</resources>\n"
  },
  {
    "path": "android_wear/src/main/res/values/strings.xml",
    "content": "<resources>\n  <string name=\"No_contacts_events_found\">No contacts events found</string>\n  <string name=\"Contact_events\">Contact Events</string>\n</resources>\n"
  },
  {
    "path": "build.gradle",
    "content": "apply from: 'secret.gradle'\n\nbuildscript {\n    repositories {\n        jcenter()\n        maven { url 'https://maven.fabric.io/public' }\n        google()\n    }\n\n    apply from: 'versions.gradle'\n\n    dependencies {\n        classpath 'com.novoda:gradle-static-analysis-plugin:0.4.1'\n        classpath 'com.android.tools.build:gradle:3.1.3'\n        classpath 'com.google.gms:google-services:3.0.0'\n        classpath 'io.fabric.tools:gradle:1.21.6'\n        classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\n        classpath \"org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version\"\n    }\n}\n\nsubprojects {\n    buildscript {\n        repositories {\n            jcenter()\n            maven { url 'https://maven.fabric.io/public' }\n        }\n    }\n\n    repositories {\n        google()\n        jcenter()\n        mavenCentral()\n        maven {\n            url 'http://dl.bintray.com/novoda/maven'\n        }\n        maven { url 'https://maven.fabric.io/public' }\n    }\n\n    apply from: \"$rootProject.rootDir.path/team-props/static-analysis.gradle\"\n}\n\napply from: 'team-props/android-code-quality.gradle'\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Thu Dec 28 20:59:09 GMT 2017\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-4.4-all.zip"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\n# Default value: -Xmx10248m -XX:MaxPermSize=256m\n# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\norg.gradle.parallel=true\norg.gradle.daemon=true\norg.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8\norg.gradle.configureondemand=true\n"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:init\r\n@rem Get command-line arguments, handling Windowz variants\r\n\r\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\r\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\r\n\r\n:win9xME_args\r\n@rem Slurp the command line arguments.\r\nset CMD_LINE_ARGS=\r\nset _SKIP=2\r\n\r\n:win9xME_args_slurp\r\nif \"x%~1\" == \"x\" goto execute\r\n\r\nset CMD_LINE_ARGS=%*\r\ngoto execute\r\n\r\n:4NT_args\r\n@rem Get arguments from the 4NT Shell from JP Software\r\nset CMD_LINE_ARGS=%$\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "memento/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "memento/build.gradle",
    "content": "apply plugin: 'java'\napply plugin: 'kotlin'\n\nsourceCompatibility = JavaVersion.VERSION_1_7\ntargetCompatibility = JavaVersion.VERSION_1_7\n\ndef logger = new com.android.build.gradle.internal.LoggerWrapper(project.logger)\ndef sdkHandler = new com.android.build.gradle.internal.SdkHandler(project, logger)\nfor (File file : sdkHandler.sdkLoader.repositories) {\n    project.repositories.maven {\n        url = file.toURI()\n    }\n}\n\nrepositories {\n    jcenter()\n    mavenCentral()\n    google()\n    maven {\n        url 'http://dl.bintray.com/novoda/maven'\n    }\n    maven { url 'https://maven.fabric.io/public' }\n}\n\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    implementation \"com.android.support:support-annotations:$android_support_version\"\n    implementation 'joda-time:joda-time:2.9.9:no-tzdb'\n\n    implementation 'io.reactivex.rxjava2:rxjava:2.1.0'\n    implementation 'io.reactivex.rxjava2:rxkotlin:2.1.0'\n\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version\"\n    implementation 'org.json:json:20171018'\n\n\n    testImplementation 'junit:junit:4.12'\n    testImplementation 'org.easytesting:fest-assert-core:2.0M10'\n    testImplementation 'org.mockito:mockito-core:1.10.19'\n    testImplementation 'joda-time:joda-time:2.9.4'\n}\n\nkotlin {\n    experimental {\n        coroutines \"enable\"\n    }\n}\n"
  },
  {
    "path": "memento/config.yml",
    "content": ""
  },
  {
    "path": "memento/src/main/java/android/LruCache.java",
    "content": "package android;\n\nimport java.util.LinkedHashMap;\nimport java.util.Map;\n\n/**\n * Static library version of {@link android.util.LruCache}. Used to write apps\n * that run on API levels prior to 12. When running on API level 12 or above,\n * this implementation is still used; it does not try to switch to the\n * framework's implementation. See the framework SDK documentation for a class\n * overview.\n */\npublic class LruCache<K, V> {\n    private final LinkedHashMap<K, V> map;\n\n    /**\n     * Size of this cache in units. Not necessarily the number of elements.\n     */\n    private int size;\n    private int maxSize;\n\n    private int putCount;\n    private int createCount;\n    private int evictionCount;\n    private int hitCount;\n    private int missCount;\n\n    /**\n     * @param maxSize for caches that do not override {@link #sizeOf}, this is\n     *                the maximum number of entries in the cache. For all other caches,\n     *                this is the maximum sum of the sizes of the entries in this cache.\n     */\n    public LruCache(int maxSize) {\n        if (maxSize <= 0) {\n            throw new IllegalArgumentException(\"maxSize <= 0\");\n        }\n        this.maxSize = maxSize;\n        this.map = new LinkedHashMap<K, V>(0, 0.75f, true);\n    }\n\n    /**\n     * Sets the size of the cache.\n     *\n     * @param maxSize The new maximum size.\n     */\n    public void resize(int maxSize) {\n        if (maxSize <= 0) {\n            throw new IllegalArgumentException(\"maxSize <= 0\");\n        }\n\n        synchronized (this) {\n            this.maxSize = maxSize;\n        }\n        trimToSize(maxSize);\n    }\n\n    /**\n     * Returns the value for {@code key} if it exists in the cache or can be\n     * created by {@code #create}. If a value was returned, it is moved to the\n     * head of the queue. This returns null if a value is not cached and cannot\n     * be created.\n     */\n    public final V get(K key) {\n        if (key == null) {\n            throw new NullPointerException(\"key == null\");\n        }\n\n        V mapValue;\n        synchronized (this) {\n            mapValue = map.get(key);\n            if (mapValue != null) {\n                hitCount++;\n                return mapValue;\n            }\n            missCount++;\n        }\n\n        /*\n         * Attempt to create a value. This may take a long time, and the map\n         * may be different when create() returns. If a conflicting value was\n         * added to the map while create() was working, we leave that value in\n         * the map and release the created value.\n         */\n\n        V createdValue = create(key);\n        if (createdValue == null) {\n            return null;\n        }\n\n        synchronized (this) {\n            createCount++;\n            mapValue = map.put(key, createdValue);\n\n            if (mapValue != null) {\n                // There was a conflict so undo that last put\n                map.put(key, mapValue);\n            } else {\n                size += safeSizeOf(key, createdValue);\n            }\n        }\n\n        if (mapValue != null) {\n            entryRemoved(false, key, createdValue, mapValue);\n            return mapValue;\n        } else {\n            trimToSize(maxSize);\n            return createdValue;\n        }\n    }\n\n    /**\n     * Caches {@code value} for {@code key}. The value is moved to the head of\n     * the queue.\n     *\n     * @return the previous value mapped by {@code key}.\n     */\n    public final V put(K key, V value) {\n        if (key == null || value == null) {\n            throw new NullPointerException(\"key == null || value == null\");\n        }\n\n        V previous;\n        synchronized (this) {\n            putCount++;\n            size += safeSizeOf(key, value);\n            previous = map.put(key, value);\n            if (previous != null) {\n                size -= safeSizeOf(key, previous);\n            }\n        }\n\n        if (previous != null) {\n            entryRemoved(false, key, previous, value);\n        }\n\n        trimToSize(maxSize);\n        return previous;\n    }\n\n    /**\n     * Remove the eldest entries until the total of remaining entries is at or\n     * below the requested size.\n     *\n     * @param maxSize the maximum size of the cache before returning. May be -1\n     *                to evict even 0-sized elements.\n     */\n    public void trimToSize(int maxSize) {\n        while (true) {\n            K key;\n            V value;\n            synchronized (this) {\n                if (size < 0 || (map.isEmpty() && size != 0)) {\n                    throw new IllegalStateException(getClass().getName()\n                                                            + \".sizeOf() is reporting inconsistent results!\");\n                }\n\n                if (size <= maxSize || map.isEmpty()) {\n                    break;\n                }\n\n                Map.Entry<K, V> toEvict = map.entrySet().iterator().next();\n                key = toEvict.getKey();\n                value = toEvict.getValue();\n                map.remove(key);\n                size -= safeSizeOf(key, value);\n                evictionCount++;\n            }\n\n            entryRemoved(true, key, value, null);\n        }\n    }\n\n    /**\n     * Removes the entry for {@code key} if it exists.\n     *\n     * @return the previous value mapped by {@code key}.\n     */\n    public final V remove(K key) {\n        if (key == null) {\n            throw new NullPointerException(\"key == null\");\n        }\n\n        V previous;\n        synchronized (this) {\n            previous = map.remove(key);\n            if (previous != null) {\n                size -= safeSizeOf(key, previous);\n            }\n        }\n\n        if (previous != null) {\n            entryRemoved(false, key, previous, null);\n        }\n\n        return previous;\n    }\n\n    /**\n     * Called for entries that have been evicted or removed. This method is\n     * invoked when a value is evicted to make space, removed by a call to\n     * {@link #remove}, or replaced by a call to {@link #put}. The default\n     * implementation does nothing.\n     * <p>\n     * <p>The method is called without synchronization: other threads may\n     * access the cache while this method is executing.\n     *\n     * @param evicted  true if the entry is being removed to make space, false\n     *                 if the removal was caused by a {@link #put} or {@link #remove}.\n     * @param newValue the new value for {@code key}, if it exists. If non-null,\n     *                 this removal was caused by a {@link #put}. Otherwise it was caused by\n     *                 an eviction or a {@link #remove}.\n     */\n    protected void entryRemoved(boolean evicted, K key, V oldValue, V newValue) {\n    }\n\n    /**\n     * Called after a cache miss to compute a value for the corresponding key.\n     * Returns the computed value or null if no value can be computed. The\n     * default implementation returns null.\n     * <p>\n     * <p>The method is called without synchronization: other threads may\n     * access the cache while this method is executing.\n     * <p>\n     * <p>If a value for {@code key} exists in the cache when this method\n     * returns, the created value will be released with {@link #entryRemoved}\n     * and discarded. This can occur when multiple threads request the same key\n     * at the same time (causing multiple values to be created), or when one\n     * thread calls {@link #put} while another is creating a value for the same\n     * key.\n     */\n    protected V create(K key) {\n        return null;\n    }\n\n    private int safeSizeOf(K key, V value) {\n        int result = sizeOf(key, value);\n        if (result < 0) {\n            throw new IllegalStateException(\"Negative size: \" + key + \"=\" + value);\n        }\n        return result;\n    }\n\n    /**\n     * Returns the size of the entry for {@code key} and {@code value} in\n     * user-defined units.  The default implementation returns 1 so that size\n     * is the number of entries and max size is the maximum number of entries.\n     * <p>\n     * <p>An entry's size must not change while it is in the cache.\n     */\n    protected int sizeOf(K key, V value) {\n        return 1;\n    }\n\n    /**\n     * Clear the cache, calling {@link #entryRemoved} on each removed entry.\n     */\n    public final void evictAll() {\n        trimToSize(-1); // -1 will evict 0-sized elements\n    }\n\n    /**\n     * For caches that do not override {@link #sizeOf}, this returns the number\n     * of entries in the cache. For all other caches, this returns the sum of\n     * the sizes of the entries in this cache.\n     */\n    public synchronized final int size() {\n        return size;\n    }\n\n    /**\n     * For caches that do not override {@link #sizeOf}, this returns the maximum\n     * number of entries in the cache. For all other caches, this returns the\n     * maximum sum of the sizes of the entries in this cache.\n     */\n    public synchronized final int maxSize() {\n        return maxSize;\n    }\n\n    /**\n     * Returns the number of times {@link #get} returned a value that was\n     * already present in the cache.\n     */\n    public synchronized final int hitCount() {\n        return hitCount;\n    }\n\n    /**\n     * Returns the number of times {@link #get} returned null or required a new\n     * value to be created.\n     */\n    public synchronized final int missCount() {\n        return missCount;\n    }\n\n    /**\n     * Returns the number of times {@link #create(Object)} returned a value.\n     */\n    public synchronized final int createCount() {\n        return createCount;\n    }\n\n    /**\n     * Returns the number of times {@link #put} was called.\n     */\n    public synchronized final int putCount() {\n        return putCount;\n    }\n\n    /**\n     * Returns the number of values that have been evicted.\n     */\n    public synchronized final int evictionCount() {\n        return evictionCount;\n    }\n\n    /**\n     * Returns a copy of the current contents of the cache, ordered from least\n     * recently accessed to most recently accessed.\n     */\n    public synchronized final Map<K, V> snapshot() {\n        return new LinkedHashMap<K, V>(map);\n    }\n\n    @Override\n    public synchronized final String toString() {\n        int accesses = hitCount + missCount;\n        int hitPercent = accesses != 0 ? (100 * hitCount / accesses) : 0;\n        return String.format(\"LruCache[maxSize=%d,hits=%d,misses=%d,hitRate=%d%%]\",\n                             maxSize, hitCount, missCount, hitPercent\n        );\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/Logger.kt",
    "content": "package com.alexstyl\n\n\ninterface Logger {\n    fun debug(message: String)\n    fun warning(message: String)\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/gsc/Index.java",
    "content": "package com.alexstyl.gsc;\n\n@Deprecated\npublic class Index {\n\n    private static final int NOT_STARTED = -1;\n    private static final int ENDED = -2;\n\n    private int index = NOT_STARTED;\n    private int length;\n\n    public Index(int length) {\n        this.length = length;\n        if (length == 0) {\n            index = ENDED;\n        }\n\n    }\n\n    public boolean hasEnded() {\n        return index == ENDED;\n    }\n\n    public int intValue() {\n        return index;\n    }\n\n    public void stepUp() {\n        if (hasEnded()) {\n            throw new IllegalStateException(\"Tried to step up even when Index has ended\");\n        }\n        ++index;\n\n    }\n\n    public void stepDown() {\n        if (hasNotStarted()) {\n            throw new IllegalStateException(\"Tried to step down even when Index has not started\");\n\n        }\n        --index;\n    }\n\n    public boolean hasNotStarted() {\n        return index == NOT_STARTED;\n    }\n\n    public void end() {\n        index = ENDED;\n    }\n\n    public void setTo(int position) {\n        index = position;\n        if (index > this.length) {\n            this.end();\n        } else if (index < 0) {\n            index = NOT_STARTED;\n        }\n\n    }\n\n    @Override\n    public String toString() {\n        return hasNotStarted() ? \"NOT STARTED\" : (index == ENDED ? \"ENDED\" : String.valueOf(index));\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/gsc/Sound.kt",
    "content": "package com.alexstyl.gsc\n\n\n/**\n * This class holds all different sounds a single symbol can be associated with.</br>\n * <p>H can be associated with the sound X and the sound I</p>\n */\ndata class Sound(private val soundSymbols: List<Char>) {\n    fun soundsLike(other: Sound): Boolean {\n        soundSymbols.forEach { thisSymbol ->\n            other.soundSymbols.forEach { otherSymbol ->\n                if (thisSymbol == otherSymbol) {\n                    return true\n                }\n            }\n        }\n        return false\n    }\n\n\n    operator fun plus(other: Sound): Sound = Sound(this.soundSymbols + other.soundSymbols)\n\n    companion object {\n        /**\n         * Combines a series of different sounds into one.\n         */\n        fun flatten(sounds: Iterable<Sound>): Sound {\n            val fold = sounds.fold<Sound, List<Char>>(emptyList(), { list, name ->\n                list + name.soundSymbols\n            })\n            return Sound(fold)\n        }\n\n    }\n}\n\nfun sound(char: Char) = Sound(listOf(char))\nfun sound(chars: String): Sound {\n    val sounds = chars.split(',')\n    return sound(CharArray(sounds.size, { sounds[it].single() }))\n}\n\nfun sound(soundSymbols: CharArray) = Sound(soundSymbols.toList())\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/gsc/SoundComparer.kt",
    "content": "package com.alexstyl.gsc\n\nclass SoundComparer {\n    companion object {\n        private val soundRules = SoundRules.INSTANCE\n\n        fun soundTheSame(first: String, second: String) = soundRules.compare(first, second, false)\n\n        fun startsWith(fullWord: String, startsWith: String) = soundRules.compare(fullWord, startsWith, true)\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/gsc/SoundRules.kt",
    "content": "package com.alexstyl.gsc\n\nimport kotlin.coroutines.experimental.buildIterator\n\n\n/**\n * Holds all rules based on which we make the comparisons.\n */\nclass SoundRules private constructor() {\n    /**\n     * A dictionary to hold all double character sounds like 'TS' and 'PS'.\n     */\n    private val doubleSounds = HashMap<String, Sound>()\n    /**\n     * A dictionary to hold all single symbol sounds like 'A' and 'S'\n     */\n    private val singleSounds = HashMap<Char, Sound>()\n    /**\n     * A dictionary to provide an easy way to change Greek accented vowels to\n     * their non accented form.\n     */\n    private val accentCapitals = HashMap<Char, Char>()\n\n    /**\n     * A string which contains all chars appearing as the first character of a\n     * double character sound.\n     * ex. AI, OI , AY, EI => \"AOE\"\n     */\n    private var startOfDouble = \"\"\n\n    // Define all possible sound symbols which can be found in the Greek language.\n\n    private val ALPHA = 'Α'\n    private val SIGMA = 'Σ'\n    private val DELTA = 'Δ'\n    private val DI = 'D'\n    private val FI = 'Φ'\n    private val GAMMA = 'Γ'\n    private val GKOU = 'G'\n    private val HI = 'Χ'\n    private val JI = 'J'\n    private val KAPPA = 'Κ'\n    private val LAMBDA = 'Λ'\n    private val ZITA = 'Ζ'\n    private val XI = 'Ξ'\n    private val PSI = 'Ψ'\n    private val BETA = 'Β'\n    private val NI = 'Ν'\n    private val MI = 'Μ'\n    private val PI = 'Π'\n    private val OMIKRON = 'Ο'\n    private val IOTA = 'Ι'\n    private val THITA = 'Θ'\n    private val RO = 'Ρ'\n    private val EPSILON = 'Ε'\n    private val TAU = 'Τ'\n    private val BI = '~'\n    private val OY = '!'\n    private val EPSILON_YPSILON = '$'\n    private val ALPHA_YPSILONOY = '#'\n\n    init {\n        this.initialize()\n    }\n\n    private fun initialize() {\n\n        /// chars and CSV are implicitly converted to Sounds\n        /// Associate all letters to their sound\n\n        /// English double sounds\n        doubleSounds.put(\"TH\", sound(THITA))\n        doubleSounds.put(\"PS\", sound(PSI))\n        doubleSounds.put(\"PH\", sound(FI))\n        doubleSounds.put(\"KS\", sound(XI))\n        doubleSounds.put(\"CH\", sound(HI))\n        doubleSounds.put(\"GG\", sound(GKOU))\n        doubleSounds.put(\"OY\", sound(OY))\n        doubleSounds.put(\"OU\", sound(OY))\n        doubleSounds.put(\"TZ\", sound(JI))\n        doubleSounds.put(\"MP\", sound(BI))\n        doubleSounds.put(\"AI\", sound(EPSILON))\n        doubleSounds.put(\"EY\", sound(EPSILON_YPSILON))\n        doubleSounds.put(\"EF\", sound(EPSILON_YPSILON))\n        doubleSounds.put(\"AF\", sound(ALPHA_YPSILONOY))\n        doubleSounds.put(\"AY\", sound(ALPHA_YPSILONOY))\n        doubleSounds.put(\"AU\", sound(ALPHA_YPSILONOY))\n        doubleSounds.put(\"EI\", sound(IOTA))\n        doubleSounds.put(\"OI\", sound(IOTA))\n\n        /// Greek double sounds\n        doubleSounds.put(\"ΓΓ\", sound(GKOU))\n        doubleSounds.put(\"ΑΙ\", sound(EPSILON))\n        doubleSounds.put(\"ΓΚ\", sound(GKOU))\n        doubleSounds.put(\"ΤΖ\", sound(JI))\n        doubleSounds.put(\"ΟΥ\", sound(OY))\n        doubleSounds.put(\"ΜΠ\", sound(BI))\n        doubleSounds.put(\"ΕΥ\", sound(EPSILON_YPSILON))\n        doubleSounds.put(\"ΕΦ\", sound(EPSILON_YPSILON))\n        doubleSounds.put(\"ΑΦ\", sound(ALPHA_YPSILONOY))\n        doubleSounds.put(\"ΑΥ\", sound(ALPHA_YPSILONOY))\n        doubleSounds.put(\"ΟΙ\", sound(IOTA))\n        doubleSounds.put(\"ΕΙ\", sound(IOTA))\n        doubleSounds.put(\"ΚΣ\", sound(XI))\n        doubleSounds.put(\"ΠΣ\", sound(PSI))\n\n        /// English Sounds\n        this.singleSounds.put('Q', sound(KAPPA))\n        this.singleSounds.put('8', sound(THITA))\n        this.singleSounds.put('9', sound(THITA))\n        this.singleSounds.put('3', sound(EPSILON))\n        this.singleSounds.put('4', sound(ALPHA))\n        this.singleSounds.put('0', sound(OMIKRON))\n        this.singleSounds.put('W', sound(OMIKRON))\n        this.singleSounds.put('O', sound(OMIKRON))\n        this.singleSounds.put('E', sound(EPSILON + \",\" + IOTA))\n        this.singleSounds.put('R', sound(RO))\n        this.singleSounds.put('T', sound(TAU))\n        this.singleSounds.put('Y', sound(IOTA + \",\" + GAMMA))\n        this.singleSounds.put('U', sound(IOTA + \",\" + OY))\n        this.singleSounds.put('I', sound(IOTA))\n        this.singleSounds.put('P', sound(PI))\n        this.singleSounds.put('A', sound(ALPHA))\n        this.singleSounds.put('S', sound(SIGMA))\n        this.singleSounds.put('D', sound(DELTA + \",\" + DI))\n        this.singleSounds.put('F', sound(FI))\n        this.singleSounds.put('G', sound(GKOU + \",\" + GAMMA))\n        this.singleSounds.put('H', sound(IOTA + \",\" + HI))\n        this.singleSounds.put('J', sound(JI))\n        this.singleSounds.put('K', sound(KAPPA))\n        this.singleSounds.put('L', sound(LAMBDA))\n        this.singleSounds.put('Z', sound(ZITA))\n        this.singleSounds.put('X', sound(HI + \",\" + XI))\n        this.singleSounds.put('C', sound(KAPPA + \",\" + SIGMA))\n        this.singleSounds.put('V', sound(BETA))\n        this.singleSounds.put('B', sound(BETA + \",\" + BI))\n        this.singleSounds.put('N', sound(NI))\n        this.singleSounds.put('M', sound(MI))\n\n        /// Greek letters\n        this.singleSounds.put('Γ', sound(GAMMA))\n        this.singleSounds.put('Ω', sound(OMIKRON))\n        this.singleSounds.put('Η', sound(IOTA))\n        this.singleSounds.put('Ι', sound(IOTA))\n        this.singleSounds.put('Υ', sound(IOTA))\n        this.singleSounds.put('Η', sound(IOTA))\n        this.singleSounds.put('ς', sound(SIGMA))\n        this.singleSounds.put('Ξ', sound(XI))\n\n        this.accentCapitals.put('Ά', ALPHA)\n        this.accentCapitals.put('Ί', IOTA)\n        this.accentCapitals.put('Ό', OMIKRON)\n        this.accentCapitals.put('Ύ', IOTA)\n        this.accentCapitals.put('Ή', IOTA)\n        this.accentCapitals.put('Έ', EPSILON)\n        this.accentCapitals.put('Ώ', OMIKRON)\n        this.accentCapitals.put('Ί', IOTA)\n        this.accentCapitals.put('Ϊ', IOTA)\n        this.accentCapitals.put('\\u0390', IOTA) // small iota with dyalitika and tonos does not have a upper case counter part\n\n        /// Find all characters which may start a double symbol sound\n        val str = StringBuilder()\n        val var2 = this.doubleSounds.keys.iterator()\n\n        while (var2.hasNext()) {\n            val charA = var2.next()[0].toString()\n            if (!str.toString().contains(charA)) {\n                str.append(charA)\n            }\n        }\n\n        this.startOfDouble = str.toString()\n    }\n\n    /**\n     * Compare the two given string and determines if they sound the same.\n     */\n    fun compare(first: String, second: String, startsWith: Boolean): Boolean {\n        val enumerator2 = getNextSound(second, startsWith).iterator()\n\n        getNextSound(first, startsWith).forEach { sound1 ->\n            if (enumerator2.hasNext()) {\n                sound1 as Sound\n                val sound2 = enumerator2.next() as Sound\n\n                if (!sound1.soundsLike(sound2)) {\n                    /// Found a non matching sound thus\n                    /// we are sure the two words don't sound the same\n                    return false\n                }\n            } else {\n                /// The first word sounds exactly as second up until now.\n                /// Return true if we check that first starts with second\n                /// Return false if first and second must sound the same.\n                return startsWith\n            }\n        }\n\n        /// Special case where first is a substring of second\n        /// We need to make sure that both string have reached their end.\n        if (enumerator2.hasNext()) {\n            return false\n        }\n        return true\n\n    }\n\n    /**\n     * The core function of the library.\n     * Returns the next sound of the string.\n     *\n     */\n    fun getNextSound(string: String, retrieveAll: Boolean) = buildIterator {\n        /// Used to indicate the beginning of a double char sound\n        var doubleSoundPending = false\n\n        /// Store the first char of a double symbol sound\n        var previousCharacter = 0.toChar()\n\n\n        val stringUpper = string.toUpperCase()\n        stringUpper.forEach { c ->\n            var character = c\n\n            /// Remove the acute accent from the character if present\n            if (accentCapitals.containsKey(character)) {\n                character = accentCapitals[character]!!\n            }\n            /// We have a pending double sound.\n            /// Check if the previousCharacter followed up by character is a\n            /// doubleSymbol Sound\n            if (doubleSoundPending) {\n                doubleSoundPending = false\n\n                /// Create the key and check if it exists as a double symbol sounds\n                val key = (previousCharacter + \"\" + character)\n\n                if (doubleSounds.containsKey(key)) {\n                    yield(doubleSounds[key])\n                    return@forEach\n                } else {\n                    yield(getSound(previousCharacter))\n                }\n            }\n            if (startOfDouble.indexOf(character) >= 0) {\n                doubleSoundPending = true\n                previousCharacter = character\n            } else {\n                yield(getSound(character))\n            }\n        }\n\n        /// Return any pending sounds\n        if (doubleSoundPending) {\n            if (retrieveAll) {\n                yield(getAllSoundsInternal(previousCharacter))\n            } else {\n                yield(getSound(previousCharacter))\n            }\n        }\n    }\n\n    /**\n     * Get the sound of a single character\n     *\n     * @param character\n     * @return\n     */\n    private fun getSound(character: Char): Sound {\n        return if (singleSounds.containsKey(character)) {\n            singleSounds[character]!!\n        } else sound(character)\n    }\n\n\n    /**\n     * Returns all sounds which are possible starting with the given character.\n     *\n     * p => P, PS, PH\n     *\n     */\n    private fun getAllSoundsInternal(upperCharacter: Char): Sound {\n        var sound = getSound(upperCharacter)\n\n        if (startOfDouble.indexOf(upperCharacter) >= 0) {\n\n            val map = doubleSounds.filter {\n                it.key[0] == upperCharacter\n            }.map {\n                it.value\n            }\n            sound += Sound.flatten(map);\n        }\n        return sound\n    }\n\n    companion object {\n        private var sInstance: SoundRules? = null\n\n        val INSTANCE: SoundRules\n            get() {\n                if (sInstance == null) {\n                    sInstance = SoundRules()\n                }\n\n                return sInstance!!\n            }\n    }\n}\n\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/resources/Colors.kt",
    "content": "package com.alexstyl.resources\n\nimport com.alexstyl.specialdates.events.peopleevents.EventType\n\ninterface Colors {\n    fun getColorFor(eventType: EventType): Int\n    fun getTodayHeaderTextColor(): Int\n    fun getDateHeaderTextColor(): Int\n    fun getDailyReminderColor(): Int\n    fun getNamedaysColor(): Int\n    fun getBankholidaysColor(): Int\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/CrashAndErrorTracker.kt",
    "content": "package com.alexstyl.specialdates\n\nimport com.alexstyl.specialdates.events.namedays.NamedayLocale\n\ninterface CrashAndErrorTracker {\n    fun startTracking()\n\n    fun track(e: Throwable)\n\n    fun onNamedayLocaleChanged(locale: NamedayLocale)\n\n    fun updateLocaleUsed()\n\n    fun log(message: String)\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/EventsUpdateTrigger.java",
    "content": "package com.alexstyl.specialdates;\n\npublic interface EventsUpdateTrigger {\n\n    void startObserving(Callback callback);\n\n    void stopObserving();\n\n    interface Callback {\n        void onMonitorTriggered();\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/LabelSetter.java",
    "content": "package com.alexstyl.specialdates;\n\npublic interface LabelSetter {\n    void setLabel(String text);\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/Optional.kt",
    "content": "package com.alexstyl.specialdates\n\n/*\n * A simplified version of Java 8's Optional class.\n * See: https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html\n */\ndata class Optional<T>(private val `object`: T?) {\n\n\n    val isPresent: Boolean\n        get() = `object` != null\n\n    fun get(): T {\n        if (!isPresent) {\n            throw IllegalStateException(\"Optional was not present\")\n        }\n        return `object`!!\n    }\n\n    operator fun contains(`object`: T?): Boolean {\n        return if (isPresent) {\n            get() == `object`\n        } else {\n            `object` == null\n        }\n    }\n\n    override fun toString(): String {\n        return `object`?.toString() ?: \"absent\"\n    }\n\n    companion object {\n        fun <T> absent(): Optional<T> {\n            return Optional(null)\n        }\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/SoundWordComparator.java",
    "content": "package com.alexstyl.specialdates;\n\nimport com.alexstyl.gsc.SoundComparer;\n\npublic class SoundWordComparator implements WordComparator {\n\n    @Override\n    public boolean compare(String aWord, String anOtherWord) {\n        return SoundComparer.Companion.soundTheSame(aWord, anOtherWord);\n    }\n\n    @Override\n    public boolean compareUpToPoint(String aWord, String anOtherWord, int index) {\n        return SoundComparer.Companion.startsWith(aWord, anOtherWord);\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/Strings.kt",
    "content": "package com.alexstyl.specialdates\n\nimport com.alexstyl.specialdates.events.namedays.NamedayLocale\nimport com.alexstyl.specialdates.events.peopleevents.EventType\nimport com.alexstyl.specialdates.person.StarSign\n\ninterface Strings {\n    fun viewConversation(): String\n    fun dailyReminder(): String\n    fun facebookMessenger(): String\n    fun nameOf(starSign: StarSign): String\n    fun turnsAge(age: Int): String\n    fun inviteFriend(): String\n    fun todaysNamedays(numberOfNamedays: Int): String\n    fun donateAmount(amount: String): String\n    fun eventOnDate(eventLabel: String, dateLabel: String): String\n    fun appName(): String\n    fun shareText(): String\n    fun today(): String\n    fun tomorrow(): String\n    fun todayCelebrateTwo(nameOne: String, nameTwo: String): String\n    fun todayCelebrateMany(name: String, numberLeft: Int): String\n    fun nameOfEvent(event: EventType): String\n    fun postOnFacebook(): String\n    fun facebook(): String\n    fun localeName(locale: NamedayLocale): String\n    fun viewFacebookProfile(): String\n    fun importFromFacebook(): String\n    fun namedays(): String\n    fun bankholidays(): String\n    fun contacts(): String\n    fun bankholidaySubtitle(): String\n    fun call(): String\n    fun sendWishes(): String\n    fun dontForgetToSendWishes(): String\n    fun contactUpdateFailed(): String\n    fun contactUpdated(): String\n    fun contactAdded():String\n    fun contactAddedFailed(): String\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/TimeOfDay.kt",
    "content": "package com.alexstyl.specialdates\n\nimport org.joda.time.LocalTime\n\ndata class TimeOfDay(private val dateTime: LocalTime) {\n\n    constructor(hour: Int, minute: Int) : this(LocalTime(hour, minute))\n\n    val hours: Int\n        get() = dateTime.hourOfDay\n\n    val minutes: Int\n        get() = dateTime.minuteOfHour\n\n    override fun toString(): String {\n        val hour = hours\n        val str = StringBuilder()\n        if (isOneDigit(hour)) {\n            str.append(ZERO)\n        }\n        str.append(hour)\n                .append(SEPARATOR)\n        val minute = minutes\n        if (isOneDigit(minute)) {\n            str.append(ZERO)\n        }\n        str.append(minute)\n        return str.toString()\n    }\n\n    private fun isOneDigit(value: Int): Boolean {\n        return value < 10\n    }\n\n    fun toMillis(): Long {\n        return dateTime.millisOfDay.toLong()\n    }\n\n    fun isAfter(timeOfDay: TimeOfDay): Boolean {\n        return dateTime.isAfter(timeOfDay.dateTime)\n    }\n\n    companion object {\n\n        private const val ZERO = \"0\"\n        private const val SEPARATOR = \":\"\n\n        fun now(): TimeOfDay {\n            return TimeOfDay(LocalTime.now())\n        }\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/UpcomingEventsView.kt",
    "content": "package com.alexstyl.specialdates\n\ninterface UpcomingEventsView {\n    fun reloadUpcomingEventsView()\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/WordComparator.java",
    "content": "package com.alexstyl.specialdates;\n\npublic interface WordComparator {\n\n    boolean compare(String aWord, String anOtherWord);\n\n    boolean compareUpToPoint(String aWord, String anOtherWord, int index);\n\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/addevent/AddEventContactEventViewModel.kt",
    "content": "package com.alexstyl.specialdates.addevent\n\nimport android.support.annotation.DrawableRes\nimport com.alexstyl.specialdates.Optional\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.events.peopleevents.EventType\n\ndata class AddEventContactEventViewModel(val hintText: String,\n                                         val eventType: EventType,\n                                         val date: Optional<Date>,\n                                         val clearVisibility: Boolean,\n                                         @param:DrawableRes val eventIconRes: Int)\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/addevent/AddEventView.kt",
    "content": "package com.alexstyl.specialdates.addevent\n\nimport com.alexstyl.specialdates.contact.Contact\nimport java.net.URI\n\ninterface AddEventView {\n\n    fun display(uri: URI)\n    fun display(viewModels: List<AddEventContactEventViewModel>)\n    fun displayContact(contact: Contact)\n\n    fun allowImagePick()\n    fun preventImagePick()\n\n    fun allowSave()\n    fun preventSave()\n    \n    fun clearAvatar()\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/addevent/AddEventViewModelFactory.kt",
    "content": "package com.alexstyl.specialdates.addevent\n\nimport com.alexstyl.specialdates.Optional\nimport com.alexstyl.specialdates.Strings\nimport com.alexstyl.specialdates.date.ContactEvent\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.DateLabelCreator\nimport com.alexstyl.specialdates.events.peopleevents.EventType\n\nclass AddEventViewModelFactory(private val creator: DateLabelCreator,\n                               private val strings: Strings,\n                               private val eventIcons: EventIcons) {\n    companion object {\n        private val NO_DATE = Optional.absent<Date>()\n    }\n\n    fun createViewModelFor(contactEvent: ContactEvent): AddEventContactEventViewModel {\n        return createViewModelFor(contactEvent.type, contactEvent.date)\n    }\n\n    fun createViewModelFor(eventType: EventType, date: Date): AddEventContactEventViewModel {\n        val eventHint = creator.createWithYearPreferred(date)\n        val dateOptional = Optional(date)\n        val clearVisibility = true\n        return AddEventContactEventViewModel(eventHint, eventType, dateOptional, clearVisibility, eventIcons.iconOf(eventType))\n    }\n\n    fun createViewModelFor(eventType: EventType): AddEventContactEventViewModel {\n        val eventName = eventType.getEventName(strings)\n        return AddEventContactEventViewModel(eventName, eventType, NO_DATE, false, eventIcons.iconOf(eventType))\n    }\n}\n\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/addevent/AddEventsPresenter.kt",
    "content": "package com.alexstyl.specialdates.addevent\n\nimport com.alexstyl.specialdates.Optional\nimport com.alexstyl.specialdates.Strings\nimport com.alexstyl.specialdates.analytics.Analytics\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.events.Event\nimport com.alexstyl.specialdates.events.peopleevents.CustomEventType\nimport com.alexstyl.specialdates.events.peopleevents.EventType\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsProvider\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsUpdater\nimport com.alexstyl.specialdates.events.peopleevents.StandardEventType\nimport io.reactivex.Observable\nimport io.reactivex.Scheduler\nimport io.reactivex.disposables.CompositeDisposable\nimport io.reactivex.subjects.ReplaySubject\nimport java.net.URI\n\n\nclass AddEventsPresenter(private val analytics: Analytics,\n                         private val contactOperations: ContactOperations,\n                         private val messageDisplayer: MessageDisplayer,\n                         private val operationsExecutor: ContactOperationsExecutor,\n                         private val strings: Strings,\n                         private val peopleEventsProvider: PeopleEventsProvider,\n                         private val factory: AddEventViewModelFactory,\n                         private val updater: PeopleEventsUpdater,\n                         private val workScheduler: Scheduler,\n                         private val resultScheduler: Scheduler) {\n\n\n    private val saveUISubject = ReplaySubject.create<Boolean>()\n    private val eventsUISubject = ReplaySubject.create<List<AddEventContactEventViewModel>>()\n    private var startingEvents = emptyViewModels()\n\n    private val imageSubject = ReplaySubject.create<URI>()\n    private val contactSubject = ReplaySubject.create<Optional<Contact>>()\n    private val contactNameSubject = ReplaySubject.create<String>()\n\n\n    val isHoldingModifiedData: Boolean\n        get() =\n            (hasStartedWritingAName())\n                    || hasChangedEvents()\n                    || hasChangedContactImage()\n\n\n    private fun hasStartedWritingAName() = !contactSubject.hasContact() && contactNameSubject.value.isNotEmpty()\n    private fun hasChangedEvents() = contactSubject.hasContact() && (eventsUISubject.value != startingEvents)\n    private fun hasChangedContactImage() = !contactSubject.hasContact() && imageSubject.value.toString().isNotEmpty()\n\n    private fun ReplaySubject<Optional<Contact>>.hasContact(): Boolean = hasValue() && value.isPresent\n\n    private val eventViewModels: List<AddEventContactEventViewModel>\n        get() = eventsUISubject.value.toList()\n\n    private val disposable = CompositeDisposable()\n\n\n    fun startPresentingInto(view: AddEventView) {\n        disposable.addAll(\n                saveUISubject\n                        .subscribe { enable ->\n                            if (enable) {\n                                view.allowSave()\n                            } else {\n                                view.preventSave()\n                            }\n                        },\n                eventsUISubject\n                        .subscribe { viewModels ->\n                            view.display(viewModels)\n                        },\n                imageSubject.subscribe {\n                    view.display(it)\n                },\n                contactSubject\n                        .subscribe { contact ->\n                            if (contact.isPresent) {\n                                view.display(contact.get().imagePath)\n                                view.preventImagePick()\n                            } else {\n                                view.allowImagePick()\n                                view.clearAvatar()\n                            }\n                        }\n        )\n        eventsUISubject.onNext(emptyViewModels())\n        contactSubject.onNext(Optional.absent())\n        saveUISubject.onNext(false)\n        contactNameSubject.onNext(\"\")\n        imageSubject.onNext(URI.create(\"\"))\n    }\n\n    fun presentName(name: String) {\n        if (contactSubject.hasContact()) {\n            throw UnsupportedOperationException(\"Changing names of contacts is not supported\")\n        }\n        contactNameSubject.onNext(name)\n        startingEvents = emptyViewModels()\n        invalidateSave()\n    }\n\n    private fun invalidateSave() {\n        if (contactSubject.hasContact()) {\n            // for a contact, check if the events are different, and we have at least one event\n            val eventsHaveChanged = eventsUISubject.values.first() != eventsUISubject.values.last()\n            val containsEvents = eventViewModels.containsEventsWithDates()\n            saveUISubject.onNext(eventsHaveChanged && containsEvents)\n        } else {\n            // for no contact, we allow a save if we have at least one event and a name\n            saveUISubject.onNext(contactNameSubject.hasValue() && eventViewModels.containsEventsWithDates())\n        }\n    }\n\n    fun isDisplayingAvatar(): Boolean {\n        return imageSubject.hasValue() && imageSubject.value.toString().isNotEmpty()\n    }\n\n\n    private fun List<AddEventContactEventViewModel>.toEvent(): List<Event> {\n        return this.mapNotNull { viewModel ->\n            if (viewModel.date.isPresent) {\n                Event(viewModel.eventType, viewModel.date.get())\n            } else {\n                null\n            }\n        }\n    }\n\n    private fun emptyViewModels() =\n            StandardEventType.values().filter {\n                it != StandardEventType.NAMEDAY && it != StandardEventType.CUSTOM\n            }.map {\n                factory.createViewModelFor(it)\n            }\n\n    fun presentContact(contact: Contact) {\n        analytics.trackContactSelected()\n        disposable.add(\n                Observable.fromCallable { peopleEventsProvider.fetchEventsFor(contact) }\n                        .flatMapIterable { it }\n                        .filter { isNotEditableEvent(it.type) }\n                        .map { event ->\n                            factory.createViewModelFor(event)\n                        }\n                        .toList()\n                        .map { viewModels ->\n                            val contactEvents = viewModels.associateBy({ it.eventType }, { it })\n                            StandardEventType.values().forEach { eventType ->\n                                if (isNotEditableEvent(eventType) && !contactEvents.containsKey(eventType)) {\n                                    viewModels.add(factory.createViewModelFor(eventType))\n                                }\n                            }\n                            viewModels.toList()\n                        }\n                        .subscribeOn(workScheduler)\n                        .observeOn(resultScheduler)\n                        .subscribe { viewModels ->\n                            startingEvents = viewModels\n                            saveUISubject.onNext(false)\n                            eventsUISubject.onNext(viewModels)\n                            contactSubject.onNext(Optional(contact))\n                        }\n        )\n    }\n\n    private fun isNotEditableEvent(eventType: EventType) =\n            eventType != StandardEventType.NAMEDAY && eventType != StandardEventType.CUSTOM && eventType !is CustomEventType\n\n    fun onEventDatePicked(eventType: EventType, date: Date) {\n        analytics.trackEventDatePicked(eventType)\n\n        Observable.fromCallable {\n            factory.createViewModelFor(eventType, date)\n        }.map {\n            val lastElement = eventsUISubject.value.toMutableList()\n            val find = lastElement.indexOfFirst { it.eventType == eventType }\n            lastElement[find] = it\n            lastElement.toList()\n        }\n                .subscribeOn(workScheduler)\n                .observeOn(resultScheduler)\n                .subscribe { viewModels ->\n                    eventsUISubject.onNext(viewModels)\n\n                    if (viewModels != emptyViewModels()) {\n                        saveUISubject.onNext(true)\n                    }\n                }\n    }\n\n    fun removeEvent(eventType: EventType) {\n        analytics.trackEventRemoved(eventType)\n\n        Observable.fromCallable {\n            factory.createViewModelFor(eventType)\n        }.map {\n            val existingViewModels = eventsUISubject.value.toMutableList()\n            val find = existingViewModels.indexOfFirst { it.eventType == eventType }\n            existingViewModels[find] = it\n            existingViewModels.toList()\n        }\n                .subscribeOn(workScheduler)\n                .observeOn(resultScheduler)\n                .subscribe { viewModels ->\n                    eventsUISubject.onNext(viewModels)\n                    invalidateSave()\n                }\n    }\n\n\n    fun saveChanges() {\n        if (!saveUISubject.value) {\n            throw IllegalStateException(\"Tried to save changes, while it was prohibited to do so.\")\n        }\n        if (contactSubject.hasContact()) {\n            disposable.add(\n                    Observable.fromCallable {\n                        val operations = contactOperations\n                                .updateExistingContact(contactSubject.value.get())\n                                .withEvents(eventViewModels.toEvent())\n                                .build()\n                        operationsExecutor.execute(operations)\n                    }.doOnNext { result ->\n                        if (result) {\n                            updater.updateEvents()\n                                    .subscribeOn(workScheduler)\n                                    .subscribe()\n                        }\n                    }\n                            .map {\n                                if (it) {\n                                    analytics.trackContactUpdated()\n                                    strings.contactUpdated()\n                                } else {\n                                    strings.contactUpdateFailed()\n                                }\n                            }\n                            .subscribeOn(workScheduler)\n                            .observeOn(resultScheduler)\n                            .subscribe {\n                                messageDisplayer.showMessage(it)\n                            }\n            )\n        } else {\n            disposable.add(\n                    Observable.fromCallable {\n                        operationsExecutor.execute(\n                                contactOperations\n                                        .newContact(contactNameSubject.value)\n                                        .withEvents(eventViewModels.toEvent())\n                                        .withImage(imageSubject.value)\n                                        .build()\n                        )\n                    }.doOnNext { result ->\n                        if (result) {\n                            updater.updateEvents()\n                                    .subscribeOn(workScheduler)\n                                    .subscribe()\n                        }\n                    }.map {\n                        if (it) {\n                            analytics.trackContactCreated()\n                            strings.contactAdded()\n                        } else {\n                            strings.contactAddedFailed()\n                        }\n                    }\n                            .subscribeOn(workScheduler)\n                            .observeOn(resultScheduler)\n                            .subscribe {\n                                messageDisplayer.showMessage(it)\n                            }\n            )\n        }\n    }\n\n\n    fun stopPresenting() {\n        disposable.dispose()\n    }\n\n    private fun List<AddEventContactEventViewModel>.containsEventsWithDates(): Boolean {\n        return any { it.date.isPresent }\n    }\n\n    fun removeContact() {\n        if (contactSubject.hasContact()) {\n            contactSubject.onNext(Optional.absent())\n        }\n        eventsUISubject.onNext(emptyViewModels())\n    }\n\n    fun present(uri: URI) {\n        imageSubject.onNext(uri)\n    }\n}\n\n\n\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/addevent/ContactOperations.kt",
    "content": "package com.alexstyl.specialdates.addevent\n\nimport com.alexstyl.specialdates.addevent.operations.ContactOperation\nimport com.alexstyl.specialdates.addevent.operations.InsertContact\nimport com.alexstyl.specialdates.addevent.operations.InsertEvent\nimport com.alexstyl.specialdates.addevent.operations.InsertImage\nimport com.alexstyl.specialdates.addevent.operations.UpdateContact\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.events.Event\nimport java.net.URI\n\nclass ContactOperations {\n\n    fun updateExistingContact(contact: Contact): ContactOperationsBuilder {\n        return ContactOperationsBuilder(arrayListOf(UpdateContact(contact)))\n    }\n\n    fun newContact(contactName: String): ContactOperationsBuilder {\n        return ContactOperationsBuilder(arrayListOf(InsertContact(contactName)))\n    }\n\n    class ContactOperationsBuilder(private val existingOperations: List<ContactOperation>) {\n        private var events: List<Event>? = null\n        private var imageUri: URI? = null\n\n        fun withEvents(events: List<Event>): ContactOperationsBuilder {\n            this.events = events\n            return this\n        }\n\n        fun withImage(value: URI): ContactOperationsBuilder {\n            this.imageUri = value\n            return this\n        }\n\n        fun build(): List<ContactOperation> {\n            return existingOperations +\n                    (events?.map { InsertEvent(it.eventType, it.date) }\n                            ?: emptyList()) + operationFor(imageUri)\n        }\n\n        private fun operationFor(imageUri: URI?): List<ContactOperation> {\n            return if (imageUri == null || imageUri.toString().isEmpty()) {\n                emptyList()\n            } else {\n                listOf(InsertImage(imageUri))\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/addevent/ContactOperationsExecutor.kt",
    "content": "package com.alexstyl.specialdates.addevent\n\nimport com.alexstyl.specialdates.addevent.operations.ContactOperation\n\ninterface ContactOperationsExecutor {\n    fun execute(operations: List<ContactOperation>): Boolean\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/addevent/ContactsSearch.kt",
    "content": "package com.alexstyl.specialdates.addevent\n\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.contact.ContactsProvider\nimport com.alexstyl.specialdates.search.NameMatcher\n\nclass ContactsSearch(private val contactsProvider: ContactsProvider, private val nameMatcher: NameMatcher) {\n\n    fun searchForContacts(searchQuery: String, numberOfResults: Int): List<Contact> {\n        val matchedContacts = ArrayList<Contact>()\n        if (numberOfResults == 0) {\n            return matchedContacts\n        }\n        val allContacts = contactsProvider.allContacts\n        if (allContacts.isEmpty()) {\n            return matchedContacts\n        }\n        var count = 0\n        var index = 0\n        val contactSize = allContacts.size\n        do {\n            val contact = allContacts[index]\n            val displayName = contact.displayName\n            if (nameMatcher.match(displayName, searchQuery)) {\n                matchedContacts.add(contact)\n                count++\n            }\n            index++\n        } while (count < numberOfResults && index < contactSize)\n\n        return matchedContacts\n    }\n\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/addevent/EventIcons.kt",
    "content": "package com.alexstyl.specialdates.addevent\n\nimport com.alexstyl.specialdates.events.peopleevents.EventType\n\ninterface EventIcons {\n    fun iconOf(eventType: EventType): Int\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/addevent/MessageDisplayer.kt",
    "content": "package com.alexstyl.specialdates.addevent\n\ninterface MessageDisplayer {\n    fun showMessage(string: String)\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/addevent/operations/ContactOperation.kt",
    "content": "package com.alexstyl.specialdates.addevent.operations\n\ninterface ContactOperation \n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/addevent/operations/InsertContact.kt",
    "content": "package com.alexstyl.specialdates.addevent.operations\n\ndata class InsertContact(val contactName: String) : ContactOperation\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/addevent/operations/InsertEvent.kt",
    "content": "package com.alexstyl.specialdates.addevent.operations\n\nimport com.alexstyl.specialdates.addevent.operations.ContactOperation\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.events.peopleevents.EventType\n\ndata class InsertEvent(val eventType: EventType, val date: Date) : ContactOperation\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/addevent/operations/InsertImage.kt",
    "content": "package com.alexstyl.specialdates.addevent.operations\n\nimport java.net.URI\n\ndata class InsertImage(val imageUri: URI) : ContactOperation\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/addevent/operations/UpdateContact.kt",
    "content": "package com.alexstyl.specialdates.addevent.operations\n\nimport com.alexstyl.specialdates.contact.Contact\n\ndata class UpdateContact(val contact: Contact) : ContactOperation\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/analytics/Analytics.kt",
    "content": "package com.alexstyl.specialdates.analytics\n\nimport com.alexstyl.specialdates.TimeOfDay\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.donate.Donation\nimport com.alexstyl.specialdates.events.peopleevents.EventType\n\ninterface Analytics {\n\n    fun trackThemeSelected(string: String)\n\n    fun trackScreen(screen: Screen)\n\n    fun trackAddEventsCancelled()\n\n    fun trackEventAddedSuccessfully()\n\n    fun trackContactSelected()\n\n    fun trackEventDatePicked(eventType: EventType)\n\n    fun trackEventRemoved(eventType: EventType)\n\n    fun trackImageCaptured()\n\n    fun trackExistingImagePicked()\n\n    fun trackAvatarSelected()\n\n    fun trackContactUpdated()\n\n    fun trackContactCreated()\n\n    fun trackDailyReminderEnabled()\n\n    fun trackDailyReminderDisabled()\n\n    fun trackDailyReminderTimeUpdated(timeOfDay: TimeOfDay)\n\n    fun trackWidgetAdded(widget: Widget)\n\n    fun trackWidgetRemoved(widget: Widget)\n\n    fun trackDonationStarted(donation: Donation)\n\n    fun trackAppInviteRequested()\n\n    fun trackDonationRestored()\n\n    fun trackDonationPlaced(donation: Donation)\n\n    fun trackFacebookLoggedIn()\n\n    fun trackOnAvatarBounce()\n\n    fun trackFacebookLoggedOut()\n\n    fun trackVisitGithub()\n\n    fun trackContactDetailsViewed(contact: Contact)\n\n    fun trackNamedaysScreen()\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/analytics/Screen.kt",
    "content": "package com.alexstyl.specialdates.analytics\n\nenum class Screen(private val screenName: String) {\n    HOME(\"upcoming\"),\n    ADD_EVENT(\"add event\"),\n    SEARCH(\"search\"),\n    SETTINGS(\"settings\"),\n    DATE_DETAILS(\"date details\"),\n    DONATE(\"donate\"),\n    CONTACT_PERMISSION_REQUESTED(\"contact permission\"),\n    WEAR_CONTACT_EVENTS(\"wear: contacts events\"),\n    PLAY_STORE(\"playstore\"),\n    GOOGLE_PLUS_COMMUNITY(\"google plus community\"),\n    EMAIL_SUPPORT(\"email support\"),\n    FACEBOOK_PROFILE(\"facebook_profile\"),\n    FACEBOOK_LOG_IN(\"facebook_login\"),\n    FACEBOOK_PAGE(\"facebook_page_url\"),\n    NAMEDAYS(\"namedays\"),\n    PERSON(\"person\");\n\n    fun screenName(): String {\n        return screenName\n    }\n\n    override fun toString(): String {\n        return screenName\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/analytics/Widget.kt",
    "content": "package com.alexstyl.specialdates.analytics\n\nenum class Widget(val widgetName: String) {\n    UPCOMING_EVENTS_SCROLLING(\"upcoming_events_scrolling\"),\n    UPCOMING_EVENTS_SIMPLE(\"upcoming_events_simple\")\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/contact/Contact.kt",
    "content": "package com.alexstyl.specialdates.contact\n\nimport java.net.URI\n\ndata class Contact(val contactID: Long, val displayName: DisplayName, val imagePath: URI, @ContactSource val source: Int) {\n\n    override fun toString(): String = displayName.toString()\n\n    val givenName: String\n        get() = displayName.firstNames.primary\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/contact/ContactCache.kt",
    "content": "package com.alexstyl.specialdates.contact\n\nimport android.LruCache\n\n\nclass ContactCache(maxSize: Int) {\n\n    private val cache: LruCache<Long, Contact> = LruCache(maxSize)\n\n    fun addContact(contact: Contact) {\n        cache.put(keyFor(contact), contact)\n    }\n\n    fun getContact(id: Long): Contact? = cache.get(id)\n\n    fun size(): Int = cache.size()\n\n    fun evictAll() {\n        cache.evictAll()\n    }\n\n    fun addContacts(contacts: Contacts) {\n        contacts.forEach {\n            cache.put(it.contactID, it)\n        }\n    }\n\n    private fun keyFor(contact: Contact): Long = contact.contactID\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/contact/ContactNotFoundException.kt",
    "content": "package com.alexstyl.specialdates.contact\n\nclass ContactNotFoundException : Exception {\n    constructor(contactId: Long) : super(\"Could not find contact with id [$contactId]\")\n    constructor(message: String) : super(message)\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/contact/ContactSource.java",
    "content": "package com.alexstyl.specialdates.contact;\n\nimport android.support.annotation.IntDef;\n\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\n\nimport static com.alexstyl.specialdates.contact.ContactSource.SOURCE_DEVICE;\nimport static com.alexstyl.specialdates.contact.ContactSource.SOURCE_FACEBOOK;\n\n@Retention(RetentionPolicy.CLASS)\n@IntDef({SOURCE_DEVICE, SOURCE_FACEBOOK})\npublic @interface\nContactSource {\n    int SOURCE_DEVICE = 1;\n    int SOURCE_FACEBOOK = 2;\n}\n\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/contact/Contacts.kt",
    "content": "package com.alexstyl.specialdates.contact\n\nclass Contacts(val source: Int, val contacts: List<Contact>) : Iterable<Contact> {\n    override fun iterator(): Iterator<Contact> = contacts.iterator()\n\n    fun getContact(id: Long): Contact? = contacts.find { it.contactID == id }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/contact/ContactsProvider.kt",
    "content": "package com.alexstyl.specialdates.contact\n\nclass ContactsProvider(private val sources: Map<Int, ContactsProviderSource>) {\n\n    val allContacts: List<Contact>\n        get() = sources.values.fold(emptyList(), { list, source ->\n            list + source.allContacts\n        })\n\n    fun getContacts(contactIds: List<Long>, @ContactSource source: Int): Contacts {\n        return sources[source]!!.queryContacts(contactIds)\n    }\n\n    @Throws(ContactNotFoundException::class)\n    fun getContact(contactID: Long, @ContactSource source: Int): Contact {\n        return sources[source]!!.getOrCreateContact(contactID)\n    }\n\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/contact/ContactsProviderSource.kt",
    "content": "package com.alexstyl.specialdates.contact\n\ninterface ContactsProviderSource {\n\n    val allContacts: Contacts\n\n    @Throws(ContactNotFoundException::class)\n    fun getOrCreateContact(contactID: Long): Contact\n\n    fun queryContacts(contactIds: List<Long>): Contacts\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/contact/DisplayName.kt",
    "content": "package com.alexstyl.specialdates.contact\n\ndata class DisplayName(val displayName: String, val allNames: Names, val firstNames: Names, val lastName: String) {\n\n    fun hasMultipleFirstNames(): Boolean {\n        return firstNames.count > 1\n    }\n\n    override fun toString(): String {\n        return displayName\n    }\n\n    companion object {\n\n        val NO_NAME = DisplayName(\"\", Names.parse(\"\"), Names.parse(\"\"), \"\")\n        private const val SEPARATOR = \" \"\n\n        fun from(displayName: String?): DisplayName {\n            if (displayName == null || displayName.isEmpty()) {\n                return NO_NAME\n            }\n            val separatorIndex = indexOfLastSeparator(displayName)\n\n            val firstNameString = subStringUpTo(displayName, separatorIndex).trim { it <= ' ' }\n\n            val allNames = Names.parse(displayName)\n            val firstNames = Names.parse(firstNameString)\n            val lastNameString = subStringAfter(displayName, separatorIndex).trim { it <= ' ' }\n            return DisplayName(displayName, allNames, firstNames, lastNameString)\n        }\n\n        private fun indexOfLastSeparator(displayName: String): Int {\n            var lastSeparatorIndex = -1\n            var currentIndex: Int\n            do {\n                currentIndex = displayName.indexOf(SEPARATOR, lastSeparatorIndex + 1)\n                if (currentIndex != -1) {\n                    lastSeparatorIndex = currentIndex\n                }\n            } while (currentIndex != -1)\n            return lastSeparatorIndex\n        }\n\n        private fun subStringUpTo(displayName: String, stringLength: Int): String {\n            if (displayName.length < stringLength) {\n                return displayName\n            }\n            return if (stringLength == -1) {\n                displayName\n            } else displayName.substring(0, stringLength)\n        }\n\n        private fun subStringAfter(displayName: String, spaceIndex: Int): String {\n            return if (spaceIndex == -1) {\n                \"\"\n            } else displayName.substring(spaceIndex, displayName.length).trim { it <= ' ' }\n\n        }\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/contact/Names.kt",
    "content": "package com.alexstyl.specialdates.contact\n\n\ndata class Names(private val names: List<String>) : Iterable<String> {\n\n    val primary: String\n        get() = names[0]\n\n    val count: Int\n        get() = names.size\n\n    override fun iterator(): Iterator<String> = names.iterator()\n\n    operator fun get(index: Int): String = names[index]\n\n    companion object {\n\n        private val REGEX = \"[@a-zA-Zά-ώΆ-Ώα-ωΑ-Ω\\\\d]+\".toRegex()\n\n        fun parse(input: String): Names =\n                Names(REGEX.findAll(input)\n                        .map { it.value }\n                        .toList()\n                )\n\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/dailyreminder/BankHolidayNotificationViewModel.kt",
    "content": "package com.alexstyl.specialdates.dailyreminder\n\ndata class BankHolidayNotificationViewModel(val title: String, val label: String)\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/dailyreminder/ContactActionViewModel.kt",
    "content": "package com.alexstyl.specialdates.dailyreminder\n\nclass ContactActionViewModel(val id: Int, val label: String, val type: ActionType)\n\nenum class ActionType {\n    CALL,\n    SEND_WISH\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/dailyreminder/ContactEventNotificationViewModel.kt",
    "content": "package com.alexstyl.specialdates.dailyreminder\n\nimport com.alexstyl.specialdates.contact.Contact\n\ndata class ContactEventNotificationViewModel(\n        val notificationId: Int,\n        val contact: Contact,\n        val title: CharSequence,\n        val label: CharSequence,\n        val actions: List<ContactActionViewModel>) \n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/dailyreminder/DailyReminderNotifier.kt",
    "content": "package com.alexstyl.specialdates.dailyreminder\n\ninterface DailyReminderNotifier {\n    fun notifyFor(viewModel: DailyReminderViewModel)\n    fun cancelAllEvents()\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/dailyreminder/DailyReminderPresenter.kt",
    "content": "package com.alexstyl.specialdates.dailyreminder\n\nimport com.alexstyl.specialdates.CrashAndErrorTracker\nimport com.alexstyl.specialdates.Optional\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.events.bankholidays.BankHolidayProvider\nimport com.alexstyl.specialdates.events.bankholidays.BankHolidaysUserSettings\nimport com.alexstyl.specialdates.events.namedays.NamedayUserSettings\nimport com.alexstyl.specialdates.events.namedays.NamesInADate\nimport com.alexstyl.specialdates.events.namedays.calendar.resource.NamedayCalendarProvider\nimport com.alexstyl.specialdates.events.peopleevents.ContactEventsOnADate\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsProvider\nimport com.alexstyl.specialdates.permissions.MementoPermissions\nimport io.reactivex.Observable\nimport io.reactivex.disposables.Disposable\nimport io.reactivex.functions.Function3\n\nclass DailyReminderPresenter(private var permissions: MementoPermissions,\n                             private var peopleEventsProvider: PeopleEventsProvider,\n                             private var namedayPreferences: NamedayUserSettings,\n                             private var bankHolidaysUserSettings: BankHolidaysUserSettings,\n                             private var namedayCalendarProvider: NamedayCalendarProvider,\n                             private var factory: DailyReminderViewModelFactory,\n                             private var errorTracker: CrashAndErrorTracker,\n                             private var bankHolidayProvider: BankHolidayProvider) {\n\n    private var disposable: Disposable? = null\n\n    fun startPresentingInto(view: DailyReminderView) {\n        val today = Date.today()\n\n        disposable =\n                Observable.zip(\n                        contactEvents(today),\n                        namedays(today),\n                        bankholidays(today),\n                        Function3({ t1: List<ContactEventNotificationViewModel>,\n                                    t2: Optional<NamedaysNotificationViewModel>,\n                                    t3: Optional<BankHolidayNotificationViewModel> ->\n\n                            DailyReminderViewModel(factory.summaryOf(t1), t1, t2, t3)\n                        }))\n\n                        .doOnError { it ->\n                            errorTracker.track(it)\n                        }\n                        .subscribe { viewModels: DailyReminderViewModel ->\n                            view.show(viewModels)\n                        }\n    }\n\n    private fun contactEvents(date: Date) =\n            Observable.fromCallable {\n                if (permissions.canReadContacts()) {\n                    peopleEventsProvider.fetchEventsOn(date)\n                } else {\n                    ContactEventsOnADate.createFrom(date, emptyList())\n                }\n            }.map {\n                val list = arrayListOf<ContactEventNotificationViewModel>()\n                val grouped = it.events.groupBy { it.contact }\n\n                grouped.keys.forEach { contact ->\n                    val events = grouped[contact]!!\n                    list.add(factory.viewModelFor(contact, events))\n                }\n                list.toList()\n            }\n\n\n    private fun namedays(date: Date): Observable<Optional<NamedaysNotificationViewModel>> = Observable.fromCallable {\n        if (namedayPreferences.isEnabled) {\n            val namedayCalendar = namedayCalendarProvider.loadNamedayCalendarForLocale(namedayPreferences.selectedLanguage, date.year)\n            namedayCalendar.getAllNamedaysOn(date)\n        } else {\n            NamesInADate(date, ArrayList())\n        }\n    }.map {\n        if (it.getNames().isEmpty()) {\n            Optional.absent()\n        } else {\n            Optional(factory.viewModelFor(it))\n        }\n    }\n\n\n    private fun bankholidays(date: Date): Observable<Optional<BankHolidayNotificationViewModel>> = Observable.fromCallable {\n        if (bankHolidaysUserSettings.isEnabled) {\n            val calculateBankHolidayOn = bankHolidayProvider.calculateBankHolidayOn(date)\n            if (calculateBankHolidayOn != null) {\n                val viewModel = factory.viewModelFor(calculateBankHolidayOn)\n                return@fromCallable Optional(viewModel)\n            }\n        }\n        Optional.absent<BankHolidayNotificationViewModel>()\n    }\n\n    fun stopPresenting() {\n        disposable?.dispose()\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/dailyreminder/DailyReminderScheduler.kt",
    "content": "package com.alexstyl.specialdates.dailyreminder\n\nimport com.alexstyl.specialdates.TimeOfDay\n\ninterface DailyReminderScheduler {\n    fun scheduleReminderFor(timeOfDay: TimeOfDay)\n    fun cancelReminder()\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/dailyreminder/DailyReminderUserSettings.kt",
    "content": "package com.alexstyl.specialdates.dailyreminder\n\nimport com.alexstyl.specialdates.TimeOfDay\nimport java.net.URI\n\ninterface DailyReminderUserSettings {\n    fun isEnabled(): Boolean\n    fun setEnabled(isEnabled: Boolean)\n    fun getTimeSet(): TimeOfDay\n    fun getRingtone(): URI\n    fun isVibrationEnabled(): Boolean\n    fun setDailyReminderTime(time: TimeOfDay)\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/dailyreminder/DailyReminderView.kt",
    "content": "package com.alexstyl.specialdates.dailyreminder\n\ninterface DailyReminderView {\n    fun show(viewModel: DailyReminderViewModel)\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/dailyreminder/DailyReminderViewModel.kt",
    "content": "package com.alexstyl.specialdates.dailyreminder\n\nimport com.alexstyl.specialdates.Optional\n\ndata class DailyReminderViewModel(val summaryViewModel: SummaryNotificationViewModel,\n                                  val contacts: List<ContactEventNotificationViewModel>,\n                                  val namedays: Optional<NamedaysNotificationViewModel>,\n                                  val bankHoliday: Optional<BankHolidayNotificationViewModel>)\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/dailyreminder/DailyReminderViewModelFactory.kt",
    "content": "package com.alexstyl.specialdates.dailyreminder\n\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.date.ContactEvent\nimport com.alexstyl.specialdates.events.bankholidays.BankHoliday\nimport com.alexstyl.specialdates.events.namedays.NamesInADate\n\ninterface DailyReminderViewModelFactory {\n    fun viewModelFor(contact: Contact, events: List<ContactEvent>): ContactEventNotificationViewModel\n    fun summaryOf(viewModels: List<ContactEventNotificationViewModel>): SummaryNotificationViewModel // TODO is this needed? Maybe for backcompat\n\n    fun viewModelFor(namedays: NamesInADate): NamedaysNotificationViewModel\n    fun viewModelFor(bankHoliday: BankHoliday): BankHolidayNotificationViewModel\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/dailyreminder/NamedaysNotificationViewModel.kt",
    "content": "package com.alexstyl.specialdates.dailyreminder\n\nimport com.alexstyl.specialdates.date.Date\n\ndata class NamedaysNotificationViewModel(val date: Date,\n                                         val title: String,\n                                         val label: String\n\n)\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/dailyreminder/NotificationViewModel.kt",
    "content": "package com.alexstyl.specialdates.dailyreminder\n\ninterface NotificationViewModel\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/dailyreminder/SummaryNotificationViewModel.kt",
    "content": "package com.alexstyl.specialdates.dailyreminder\n\nimport java.net.URI\n\ndata class SummaryNotificationViewModel(val notificationId: Int,\n                                        val title: CharSequence,\n                                        val text: CharSequence,\n                                        val lines: List<CharSequence>,\n                                        val images: List<URI>)\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/date/ContactEvent.kt",
    "content": "package com.alexstyl.specialdates.date\n\nimport com.alexstyl.specialdates.Optional\nimport com.alexstyl.specialdates.Strings\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.events.peopleevents.EventType\nimport com.alexstyl.specialdates.events.peopleevents.StandardEventType\n\ndata class ContactEvent(val deviceEventId: Optional<Long>, val type: EventType, val date: Date, val contact: Contact) {\n\n    fun getLabel(dateWithYear: Date, strings: Strings): String {\n        if (type === StandardEventType.BIRTHDAY) {\n            if (date.hasYear()) {\n                val age = dateWithYear.year - date.year\n                if (age > 0) {\n                    return strings.turnsAge(age)\n                }\n            }\n        }\n        return type.getEventName(strings)\n    }\n    \n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/date/Date.kt",
    "content": "package com.alexstyl.specialdates.date\n\nimport com.alexstyl.specialdates.Optional\nimport org.joda.time.IllegalFieldValueException\nimport org.joda.time.LocalDate\nimport java.util.Locale\n\ndata class Date(private val localDate: LocalDate, private val yearOptional: Optional<Int>) : Comparable<Date> {\n\n    fun addDay(i: Int): Date {\n        val addedDate = localDate.plusDays(i)\n        return Date(addedDate, Optional(addedDate.year))\n    }\n\n    operator fun plus(i: Int): Date = addDay(i)\n\n    val dayOfMonth: Int get() = localDate.dayOfMonth\n\n    val month: Int @MonthInt get() = localDate.monthOfYear\n\n    val year: Int get() = yearOptional.get()\n\n\n    fun toMillis(): Long = localDate.toDate().time\n\n    fun minusDay(days: Int): Date {\n        val minusDays = localDate.minusDays(days)\n        return Date(minusDays, Optional(minusDays.year))\n    }\n\n    val dayOfWeek: Int\n        get() = localDate.dayOfWeek\n\n    fun addWeek(weeks: Int): Date = addDay(7 * weeks)\n\n    fun daysDifferenceTo(otherEvent: Date): Int {\n        val dayOfYear = localDate.dayOfYear().get()\n        val otherDayOfYear = otherEvent.localDate.dayOfYear().get()\n        val daysOfYearsDifference = (year - otherEvent.year) * 365\n        return otherDayOfYear - dayOfYear - daysOfYearsDifference\n    }\n\n    fun hasYear(): Boolean = yearOptional.isPresent\n\n    fun hasNoYear(): Boolean = !yearOptional.isPresent\n\n    val daysInCurrentMonth: Int\n            get() = localDate.dayOfMonth().maximumValue\n\n    override fun compareTo(other: Date): Int {\n        if (this.hasYear() && other.hasYear()) {\n            val yearOne = this.year\n            val yearTwo = other.year\n            if (yearOne > yearTwo) {\n                return 1\n            } else if (yearOne < yearTwo) {\n                return -1\n            }\n        }\n        if (this.month < other.month) {\n            return -1\n        } else if (this.month > other.month) {\n            return 1\n        }\n        return this.dayOfMonth - other.dayOfMonth\n    }\n\n    companion object {\n\n        var CURRENT_YEAR: Int = 0\n\n        init {\n            CURRENT_YEAR = LocalDate.now().year\n        }\n\n        fun today(): Date {\n            val localDate = LocalDate.now()\n            return Date(localDate, Optional(localDate.year))\n        }\n\n        fun on(dayOfMonth: Int, @MonthInt month: Int): Date {\n            val localDate = LocalDate(Months.NO_YEAR, month, dayOfMonth)\n            return Date(localDate, Optional.absent())\n        }\n\n        fun on(dayOfMonth: Int, @MonthInt month: Int, year: Int): Date {\n            if (year <= 0) {\n                throw IllegalArgumentException(\n                        \"Do not call DayDate.on() if no year is present. Call the respective method without the year argument instead\")\n            }\n            try {\n                val localDate = LocalDate(year, month, dayOfMonth)\n                return Date(localDate, Optional(year))\n            } catch (a: IllegalFieldValueException) {\n                throw IllegalArgumentException(String.format(Locale.US, \"%d/%d/%d is invalid\", dayOfMonth, month, year))\n            }\n\n        }\n\n        fun startOfYear(year: Int): Date = Date.on(1, Months.JANUARY, year)\n        fun endOfYear(currentYear: Int): Date = Date.on(31, Months.DECEMBER, currentYear)\n    }\n\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/date/DateAndTime.kt",
    "content": "package com.alexstyl.specialdates.date\n\nimport com.alexstyl.specialdates.TimeOfDay\n\ndata class DateAndTime(private val date: Date, private val timeOfDay: TimeOfDay) {\n\n    fun toMilis(): Long {\n        return date.toMillis() + timeOfDay.toMillis()\n    }\n\n    fun addDay(i: Int): DateAndTime {\n        return DateAndTime(date.addDay(i), timeOfDay)\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/date/DateComparator.java",
    "content": "package com.alexstyl.specialdates.date;\n\nimport java.io.Serializable;\nimport java.util.Comparator;\n\npublic enum DateComparator implements Comparator<Date>, Serializable {\n    INSTANCE;\n\n    @Override\n    public int compare(Date left, Date right) {\n        if (left.hasYear() && right.hasYear()) {\n            int yearOne = left.getYear();\n            int yearTwo = right.getYear();\n            if (yearOne > yearTwo) {\n                return 1;\n            } else if (yearOne < yearTwo) {\n                return -1;\n            }\n        }\n        if (left.getMonth() < right.getMonth()) {\n            return -1;\n        } else if (left.getMonth() > right.getMonth()) {\n            return 1;\n        }\n        return left.getDayOfMonth() - right.getDayOfMonth();\n    }\n\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/date/DateLabelCreator.kt",
    "content": "package com.alexstyl.specialdates.date\n\ninterface DateLabelCreator {\n    /**\n     * Returns the label of this date. If the Date does not include a year, this will fail silently, returning a label without any years\n     */\n    fun createWithYearPreferred(date: Date): String\n\n    fun createLabelWithoutYear(date: Date): String\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/date/DateParseException.kt",
    "content": "package com.alexstyl.specialdates.date\n\nclass DateParseException(message: String) : Exception(message)\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/date/DateParser.kt",
    "content": "package com.alexstyl.specialdates.date\n\nimport com.alexstyl.specialdates.CrashAndErrorTracker\nimport org.joda.time.format.DateTimeFormat\nimport java.util.Locale\n\nclass DateParser(private val errorTracker: CrashAndErrorTracker) {\n\n\n    @Throws(DateParseException::class)\n    fun parse(rawDate: String?): Date {\n        return parse(rawDate, false)\n    }\n\n    @Throws(DateParseException::class)\n    fun parseWithoutYear(rawDate: String): Date {\n        return parse(rawDate, true)\n    }\n\n    @Throws(DateParseException::class)\n    private fun parse(rawDate: String?, removeYear: Boolean): Date {\n        for (locale in LOCALES) {\n            for (format in SUPPORTED_FORMATS) {\n                val formatter = DateTimeFormat.forPattern(format)\n                        .withLocale(locale)\n                        .withDefaultYear(Months.NO_YEAR)\n                try {\n                    val parsedDate = formatter.parseLocalDate(rawDate)\n                    val dayOfMonth = parsedDate.dayOfMonth\n                    @MonthInt val month = parsedDate.monthOfYear\n                    val year = parsedDate.year\n\n                    return if (year == Months.NO_YEAR || removeYear) {\n                        Date.on(dayOfMonth, month)\n                    } else {\n                        Date.on(dayOfMonth, month, year)\n                    }\n\n                } catch (e: IllegalArgumentException) {\n                    if (isNotAboutInvalidFormat(e)) {\n                        errorTracker.track(e)\n                    }\n                }\n\n            }\n        }\n\n        throw DateParseException(\"Unable to parse $rawDate\")\n    }\n\n    private fun isNotAboutInvalidFormat(e: IllegalArgumentException): Boolean = e.message?.notContains(\"Invalid format\") ?: true\n\n    companion object {\n\n        private val LOCALES: Array<Locale> = arrayOf(Locale.getDefault(), Locale.US)\n\n        private val SUPPORTED_FORMATS = arrayOf(\n                \"yyyy-MM-dd\",\n                \"--MM-dd\",\n                \"MMM dd, yyyy\",\n                \"MMM dd yyyy\",\n                \"MMM dd\",\n                \"dd MMM yyyy\",\n                \"dd MMM\", // 19 Aug 1990\n                \"yyyyMMdd\", // 20110505\n                \"dd MMM yyyy\", \"d MMM yyyy\", // >>> 6 Δεκ 1980\n                \"dd/MM/yyyy\", //22/04/23\n                \"yyyy-MM-dd HH:mm:ss.SSSZ\", //ISO 8601\n                \"yyyy-MM-dd'T'HH:mm:ss.SSSZ\", \"dd-MM-yyyy\", //25-4-1950\n                \"dd/MMMM/yyyy\", // 13/Gen/1972\n                \"yyyy-MM-dd'T'HH:mm:ssZ\", // 1949-02-14T00:00:00Z\n                \"yyyyMMdd'T'HHmmssZ\")// 20151026T083936Z\n    }\n}\n\nprivate fun String.notContains(s: String): Boolean? = !contains(s)\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/date/Dates.kt",
    "content": "package com.alexstyl.specialdates.date\n\nimport java.util.*\n\ndata class Dates(private val dates: ArrayList<Date>) {\n\n\n    constructor() : this(ArrayList<Date>())\n\n    constructor(date: Date) : this(ArrayList<Date>().apply {\n        add(date)\n    })\n\n    constructor(dates: Dates) : this(ArrayList<Date>().apply {\n        addAll(dates.dates)\n    })\n\n    fun getDate(i: Int): Date = dates[i]\n\n    fun size(): Int = dates.size\n\n    fun containsNoDate(): Boolean = dates.isEmpty()\n\n    fun add(date: Date) {\n        if (dates.contains(date)) {\n            return\n        }\n        this.dates.add(date)\n    }\n\n    fun addAll(dates: Dates) {\n        this.dates.addAll(dates.dates)\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/date/MonthInt.java",
    "content": "package com.alexstyl.specialdates.date;\n\nimport android.support.annotation.IntDef;\n\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\n\n/**\n * A 1-indexed integer that represents a Month\n */\n@Retention(RetentionPolicy.CLASS)\n@IntDef({\n        Months.JANUARY,\n        Months.FEBRUARY,\n        Months.MARCH,\n        Months.APRIL,\n        Months.MAY,\n        Months.JUNE,\n        Months.JULY,\n        Months.AUGUST,\n        Months.SEPTEMBER,\n        Months.OCTOBER,\n        Months.NOVEMBER,\n        Months.DECEMBER,\n})\npublic @interface MonthInt {\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/date/Months.java",
    "content": "package com.alexstyl.specialdates.date;\n\npublic class Months {\n\n    /**\n     * A value that represents that no year has been specified.\n     */\n    /*\n     * The specific number (4) was used because it's the first positive year in JodaTime which contains the date 29 of February.\n     * We currently not allow the user to use any value for a year less than 1900 anyhow. If year 4 is selected somehow through the device database,\n     * then we are not going to treat it as a real year ¯\\_(ツ)_/¯\n     */\n    public static final int NO_YEAR = 4;\n\n    private Months() {\n        // hide this\n    }\n\n    public static final int JANUARY = 1;\n    public static final int FEBRUARY = 2;\n    public static final int MARCH = 3;\n    public static final int APRIL = 4;\n    public static final int MAY = 5;\n    public static final int JUNE = 6;\n    public static final int JULY = 7;\n    public static final int AUGUST = 8;\n    public static final int SEPTEMBER = 9;\n    public static final int OCTOBER = 10;\n    public static final int NOVEMBER = 11;\n    public static final int DECEMBER = 12;\n\n    public static final int MONDAY = 1;\n    public static final int TUESDAY = 2;\n    public static final int WEDNESDAY = 3;\n    public static final int THURSDAY = 4;\n    public static final int FRIDAY = 5;\n    public static final int SATURDAY = 6;\n    public static final int SUNDAY = 7;\n\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/date/TimePeriod.kt",
    "content": "package com.alexstyl.specialdates.date\n\ndata class TimePeriod private constructor(val startingDate: Date, val endingDate: Date) {\n\n    fun containsDate(date: Date): Boolean {\n        return DateComparator.INSTANCE.compare(startingDate, date) <= 0 && DateComparator.INSTANCE.compare(date, endingDate) <= 0\n    }\n\n    companion object {\n\n        fun between(startDate: Date, endDate: Date): TimePeriod {\n            if (DateComparator.INSTANCE.compare(startDate, endDate) > 0) {\n                throw IllegalArgumentException(\"starting Date was after end Date\")\n            }\n            return TimePeriod(startDate, endDate)\n        }\n\n        fun aYearFromNow(): TimePeriod {\n            val today = Date.today()\n            val endDate = today.addDay(364)\n            return TimePeriod.between(today, endDate)\n        }\n\n        fun aYearFrom(date: Date): TimePeriod {\n            return TimePeriod.between(date, date.addDay(364))\n        }\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/donate/DonateMonitor.kt",
    "content": "package com.alexstyl.specialdates.donate\n\n\nclass DonateMonitor {\n\n    fun onDonationUpdated() {\n        for (listener in listeners) {\n            listener.onUserDonated()\n        }\n    }\n\n    fun addListener(l: DonateMonitorListener) {\n        listeners.add(l)\n    }\n\n    fun removeListener(l: DonateMonitorListener) {\n        listeners.remove(l)\n    }\n\n    interface DonateMonitorListener {\n        fun onUserDonated()\n    }\n\n    companion object {\n        private val listeners = ArrayList<DonateMonitorListener>()\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/donate/Donation.java",
    "content": "package com.alexstyl.specialdates.donate;\n\npublic interface Donation {\n    String getAmount();\n\n    String getIdentifier();\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/donate/DonationCallbacks.java",
    "content": "package com.alexstyl.specialdates.donate;\n\npublic interface DonationCallbacks {\n    void onDonateException(String message);\n\n    void onDonationFinished(Donation donation);\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/donate/DonationService.java",
    "content": "package com.alexstyl.specialdates.donate;\n\npublic interface DonationService {\n    void setup(DonationCallbacks listener);\n\n    void placeDonation(Donation donation, int requestCode);\n\n    void dispose();\n\n    void restoreDonations();\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/Event.kt",
    "content": "package com.alexstyl.specialdates.events\n\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.events.peopleevents.EventType\n\ndata class Event(val eventType: EventType, val date: Date)\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/SettingsPresenter.kt",
    "content": "package com.alexstyl.specialdates.events\n\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsUpdater\nimport com.alexstyl.specialdates.events.peopleevents.UpcomingEventsViewRefresher\nimport io.reactivex.Scheduler\nimport io.reactivex.disposables.Disposable\nimport io.reactivex.subjects.PublishSubject\n\nclass SettingsPresenter(private val peopleEventsUpdater: PeopleEventsUpdater,\n                        private val uiRefresher: UpcomingEventsViewRefresher,\n                        private val workScheduler: Scheduler) {\n\n    private val subject = PublishSubject.create<Int>()\n    private var disposable: Disposable? = null\n\n\n    fun startMonitoring() {\n        subject\n                .observeOn(workScheduler)\n                .flatMap { peopleEventsUpdater.updateEvents() }\n                .subscribe()\n    }\n\n    fun stopMonitoring() {\n        disposable?.dispose()\n    }\n\n    fun refreshPeopleEvents() {\n        subject.onNext(1)\n    }\n\n    fun updateEventOptions() {\n        uiRefresher.refreshViews()\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/bankholidays/BankHoliday.kt",
    "content": "package com.alexstyl.specialdates.events.bankholidays\n\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.DateComparator\n\ndata class BankHoliday(val holidayName: String, val date: Date) : Comparable<BankHoliday> {\n\n    override fun toString(): String {\n        return holidayName\n    }\n\n    override fun compareTo(another: BankHoliday): Int {\n        return DateComparator.INSTANCE.compare(date, another.date)\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/bankholidays/BankHolidayProvider.kt",
    "content": "package com.alexstyl.specialdates.events.bankholidays\n\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.TimePeriod\nimport java.util.ArrayList\n\nclass BankHolidayProvider(private val bankHolidaysCalculator: GreekBankHolidaysCalculator) {\n\n    fun calculateBankHolidaysBetween(timePeriod: TimePeriod): List<BankHoliday> =\n            if (isWithinTheSameYear(timePeriod)) {\n                calculateBankHolidaysFor(timePeriod)\n            } else {\n                val allBankholidays = ArrayList<BankHoliday>()\n\n                val firstHalf = getfirstHalfOf(timePeriod)\n                val firstHalfBankHolidays = calculateBankHolidaysFor(firstHalf)\n                allBankholidays.addAll(firstHalfBankHolidays)\n\n                val secondHalf = getSecondHalfOf(timePeriod)\n                val secondHalfBankHolidays = calculateBankHolidaysFor(secondHalf)\n                allBankholidays.addAll(secondHalfBankHolidays)\n\n                allBankholidays\n            }\n\n    private fun getfirstHalfOf(timePeriod: TimePeriod): TimePeriod {\n        val startingDate = timePeriod.startingDate\n        return TimePeriod.between(\n                startingDate,\n                Date.endOfYear(startingDate.year)\n        )\n    }\n\n    private fun getSecondHalfOf(timePeriod: TimePeriod): TimePeriod {\n        val endingDate = timePeriod.endingDate\n        return TimePeriod.between(\n                Date.startOfYear(endingDate.year),\n                endingDate\n        )\n    }\n\n    private fun calculateBankHolidaysFor(timePeriod: TimePeriod): List<BankHoliday> {\n        val bankHolidays = ArrayList<BankHoliday>()\n        val year = timePeriod.startingDate.year\n        val allBankHolidays = bankHolidaysCalculator.calculateBankholidaysForYear(year)\n        for (bankHoliday in allBankHolidays) {\n            if (timePeriod.containsDate(bankHoliday.date)) {\n                bankHolidays.add(bankHoliday)\n            }\n        }\n        return bankHolidays\n    }\n\n    private fun isWithinTheSameYear(timePeriod: TimePeriod): Boolean {\n        return timePeriod.startingDate.year == timePeriod.endingDate.year\n    }\n\n    fun calculateBankHolidayOn(date: Date): BankHoliday? =\n            bankHolidaysCalculator\n                    .calculateBankholidaysForYear(date.year)\n                    .find { it.date == date }\n\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/bankholidays/BankHolidaysUserSettings.kt",
    "content": "package com.alexstyl.specialdates.events.bankholidays\n\ninterface BankHolidaysUserSettings {\n    val isEnabled: Boolean\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/bankholidays/GreekBankHolidaysCalculator.java",
    "content": "package com.alexstyl.specialdates.events.bankholidays;\n\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.events.namedays.calendar.OrthodoxEasterCalculator;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\n\nimport static com.alexstyl.specialdates.date.Months.*;\n\npublic class GreekBankHolidaysCalculator {\n    private final OrthodoxEasterCalculator easterCalculator;\n\n    public GreekBankHolidaysCalculator(OrthodoxEasterCalculator easterCalculator) {\n        this.easterCalculator = easterCalculator;\n    }\n\n    @SuppressWarnings(\"checkstyle:magicnumber\")\n    List<BankHoliday> calculateBankholidaysForYear(int year) {\n        Date easter = easterCalculator.calculateEasterForYear(year);\n\n        List<BankHoliday> bankHolidays = new ArrayList<>();\n        bankHolidays.add(new BankHoliday(\"Πρωτοχρονιά\", Date.Companion.on(1, JANUARY, year)));\n        bankHolidays.add(new BankHoliday(\"Χριστούγεννα\", Date.Companion.on(25, DECEMBER, year)));\n        bankHolidays.add(new BankHoliday(\"Θεοφάνεια\", Date.Companion.on(6, JANUARY, year)));\n        bankHolidays.add(new BankHoliday(\"Μεγάλη Παρασκευή\", easter.minusDay(2)));\n        bankHolidays.add(new BankHoliday(\"Πάσχα\", easter));\n        bankHolidays.add(new BankHoliday(\"2α Διακαινησίμου \", easter.addDay(1)));\n        bankHolidays.add(new BankHoliday(\"25η Μαρτίου (επανάσταση του 1821)\", Date.Companion.on(25, MARCH, year)));\n        bankHolidays.add(new BankHoliday(\"Κοίμηση της Θεοτόκου (Δεκαπενταύγουστος)\", Date.Companion.on(15, AUGUST, year)));\n        bankHolidays.add(new BankHoliday(\"26η Οκτωβρίου (εορτή Αγ.Δημητρίου - πολιούχου Θεσσαλονίκης)\", Date.Companion.on(26, OCTOBER, year)));\n        bankHolidays.add(new BankHoliday(\"28η Οκτωβρίου (επέτειος του ΟΧΙ)\", Date.Companion.on(28, OCTOBER, year)));\n        bankHolidays.add(new BankHoliday(\"Τσικνοπέμπτη\", easter.minusDay(59)));\n        bankHolidays.add(new BankHoliday(\"Καθαρά Δευτέρα\", easter.minusDay(48)));\n        bankHolidays.add(new BankHoliday(\"Κυριακή των Βαίων\", easter.minusDay(7)));\n        bankHolidays.add(new BankHoliday(\"Σάββατο του Λαζάρου\", easter.minusDay(8)));\n        bankHolidays.add(new BankHoliday(\"Μεγάλη Δευτέρα\", easter.minusDay(6)));\n        bankHolidays.add(new BankHoliday(\"Του Θωμά\", easter.addDay(7)));\n        bankHolidays.add(new BankHoliday(\"Πεντηκοστή\", easter.addDay(59)));\n        bankHolidays.add(new BankHoliday(\"Αγ. Πνεύματος\", easter.addDay(50)));\n        bankHolidays.add(new BankHoliday(\"Αγίων Πάντων\", easter.addDay(56)));\n        return Collections.unmodifiableList(bankHolidays);\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/database/EventTypeId.java",
    "content": "package com.alexstyl.specialdates.events.database;\n\nimport android.support.annotation.IntDef;\n\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\n\nimport static com.alexstyl.specialdates.events.database.EventTypeId.*;\n\n@Retention(RetentionPolicy.SOURCE)\n@IntDef({TYPE_BIRTHDAY, TYPE_NAMEDAY, TYPE_ANNIVERSARY, TYPE_OTHER, TYPE_CUSTOM})\npublic @interface EventTypeId {\n    int TYPE_BIRTHDAY = 0;\n    int TYPE_NAMEDAY = 1;\n    int TYPE_ANNIVERSARY = 2;\n    int TYPE_OTHER = 3;\n    int TYPE_CUSTOM = 4;\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/NameCelebrations.kt",
    "content": "package com.alexstyl.specialdates.events.namedays\n\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.Dates\n\n/**\n * A name and the list of Namedays it's celebrated\n */\ndata class NameCelebrations(val name: String, val dates: Dates) {\n\n    constructor(name: String) : this(name, Dates(Dates()))\n\n    constructor(name: String, easter: Date) : this(name, Dates(easter))\n\n    fun containsNoDate(): Boolean = dates.containsNoDate()\n\n    val isEmpty: Boolean\n        get() = dates.size() == 0\n\n    fun getDate(i: Int): Date = dates.getDate(i)\n\n    fun size(): Int = dates.size()\n\n\n    fun addDate(date: Date) {\n        this.dates.add(date)\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/NamedayBundle.java",
    "content": "package com.alexstyl.specialdates.events.namedays;\n\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.events.namedays.calendar.resource.Node;\n\nimport java.util.ArrayList;\n\npublic class NamedayBundle {\n\n    private final Node namesToDate;\n    private final NamedaysList namedaysList;\n\n    public NamedayBundle(Node namesToDate, NamedaysList dateToNames) {\n        this.namesToDate = namesToDate;\n        this.namedaysList = dateToNames;\n    }\n\n    public NameCelebrations getDatesFor(String name) {\n        NameCelebrations bundle = namesToDate.getDates(name);\n        if (bundle.containsNoDate()) {\n            return new NameCelebrations(name);\n        }\n        return new NameCelebrations(bundle.getName(), bundle.getDates());\n    }\n\n    public NamesInADate getNamedaysFor(Date date) {\n        return namedaysList.getNamedaysFor(date);\n    }\n\n    public ArrayList<String> getNames() {\n        return namedaysList.getNames();\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/NamedayDatabaseRefresher.kt",
    "content": "package com.alexstyl.specialdates.events.namedays\n\nimport com.alexstyl.specialdates.date.ContactEvent\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsPersister\nimport com.alexstyl.specialdates.events.peopleevents.PeopleDynamicNamedaysProvider\n\nclass NamedayDatabaseRefresher(private val namedayUserSettings: NamedayUserSettings,\n                               private val perister: PeopleEventsPersister,\n                               private val provider: PeopleDynamicNamedaysProvider) {\n\n    fun refreshNamedaysIfEnabled() {\n        perister.deleteAllNamedays()\n        if (namedayUserSettings.isEnabled) {\n            initialiseNamedays()\n        }\n    }\n\n    private fun initialiseNamedays() {\n        val namedays = provider.loadAllStaticNamedays()\n        storeNamedaysToDisk(namedays)\n    }\n\n    private fun storeNamedaysToDisk(namedays: List<ContactEvent>) {\n        perister.insertAnnualEvents(namedays)\n    }\n\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/NamedayLocale.java",
    "content": "package com.alexstyl.specialdates.events.namedays;\n\npublic enum NamedayLocale {\n    GREEK(\"gr\", true),\n    ROMANIAN(\"ro\", false),\n    RUSSIAN(\"ru\", false),\n    LATVIAN(\"lv\", false),\n    LATVIAN_EXTENDED(\"lv_ext\", false),\n    SLOVAK(\"sk\", false),\n    ITALIAN(\"it\", false),\n    CZECH(\"cs\", false),\n    HUNGARIAN(\"hu\", false);\n\n    private final String shortCode;\n    private final boolean soundCompared;\n\n    NamedayLocale(String shortCode, boolean soundCompared) {\n        this.shortCode = shortCode;\n        this.soundCompared = soundCompared;\n    }\n\n    public static NamedayLocale from(String displayLanguage) {\n        for (NamedayLocale locale : values()) {\n            if (locale.getCountryCode().equalsIgnoreCase(displayLanguage)) {\n                return locale;\n            }\n        }\n        throw new IllegalArgumentException(\"No NamedayLocale found for \"+ displayLanguage);\n    }\n\n    public boolean isComparedBySound() {\n        return soundCompared;\n    }\n\n    public String getCountryCode() {\n        return shortCode;\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/NamedayUserSettings.java",
    "content": "package com.alexstyl.specialdates.events.namedays;\n\npublic interface NamedayUserSettings {\n    void setSelectedLanguage(String language);\n\n    NamedayLocale getSelectedLanguage();\n\n    boolean isEnabled();\n\n    boolean isEnabledForContactsOnly();\n\n    void setEnabledForContactsOnly(boolean onlyForContacts);\n\n    boolean shouldLookupAllNames();\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/NamedaysList.java",
    "content": "package com.alexstyl.specialdates.events.namedays;\n\nimport com.alexstyl.specialdates.date.Date;\n\nimport java.text.Collator;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Set;\nimport java.util.TreeSet;\n\npublic class NamedaysList {\n\n    private final List<NamesInADate> namedays = new ArrayList<>();\n    private final Set<String> names = new TreeSet<>(Collator.getInstance());\n\n    public NamesInADate getNamedaysFor(Date date) {\n        int index = indexOf(date);\n        if (index != -1) {\n            return namedays.get(index);\n        }\n        return new NamesInADate(date, new ArrayList<String>());\n    }\n\n    public void addNameday(Date date, String name) {\n        NamesInADate names = getOrCreateNameDateFor(date);\n\n        names.addName(name);\n        this.names.add(name);\n    }\n\n    private NamesInADate getOrCreateNameDateFor(Date date) {\n        int index = indexOf(date);\n        if (index == -1) {\n            NamesInADate namesInADate = new NamesInADate(date, new ArrayList<String>());\n            namedays.add(namesInADate);\n            return namesInADate;\n        } else {\n            return namedays.get(index);\n        }\n    }\n\n    private int indexOf(Date date) {\n        for (int i = 0; i < namedays.size(); i++) {\n            NamesInADate inlistDate = namedays.get(i);\n            Date comparingDate = inlistDate.getDate();\n            if (isRecurringEvent(comparingDate) && areMatching(comparingDate, date)) {\n                return i;\n            } else if (comparingDate.equals(date)) {\n                return i;\n            }\n        }\n        return -1;\n    }\n\n    private boolean isRecurringEvent(Date date) {\n        return !date.hasYear();\n    }\n\n    private boolean areMatching(Date date, Date otherDate) {\n        return date.getDayOfMonth() == otherDate.getDayOfMonth()\n                && date.getMonth() == otherDate.getMonth();\n    }\n\n    public ArrayList<String> getNames() {\n        return new ArrayList<>(names);\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/NamesInADate.kt",
    "content": "package com.alexstyl.specialdates.events.namedays\n\nimport com.alexstyl.specialdates.date.Date\nimport java.util.ArrayList\nimport java.util.Collections\n\nclass NamesInADate(val date: Date, private val names: MutableList<String> = ArrayList()) {\n\n    fun getNames(): List<String> {\n        return Collections.unmodifiableList(names)\n    }\n\n    @Deprecated(\"Do not use this method. Prefer passing names from the constructor of the class\")\n    fun addName(name: String) {\n        names.add(name)\n    }\n\n    fun nameCount(): Int {\n        return names.size\n    }\n\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/activity/CelebratingContactViewModel.kt",
    "content": "package com.alexstyl.specialdates.events.namedays.activity\n\nimport com.alexstyl.specialdates.contact.Contact\n\ndata class CelebratingContactViewModel(val contact: Contact, val letter: String, val colorVariant: Int) : NamedayScreenViewModel {\n    override val viewType: Int\n        get() = NamedayScreenViewType.CONTACT\n    override val id: Long\n        get() = contact.contactID\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/activity/NamedayScreenViewModel.kt",
    "content": "package com.alexstyl.specialdates.events.namedays.activity\n\n\ninterface NamedayScreenViewModel {\n    @get:NamedayScreenViewType\n    val viewType: Int\n    val id: Long\n}\n\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/activity/NamedayScreenViewType.java",
    "content": "package com.alexstyl.specialdates.events.namedays.activity;\n\nimport android.support.annotation.IntDef;\n\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\n\nimport static com.alexstyl.specialdates.events.namedays.activity.NamedayScreenViewType.CONTACT;\nimport static com.alexstyl.specialdates.events.namedays.activity.NamedayScreenViewType.NAMEDAY;\n\n@Retention(RetentionPolicy.SOURCE)\n@IntDef({\n        NAMEDAY,\n        CONTACT\n})\n@interface NamedayScreenViewType {\n    int NAMEDAY = 0;\n    int CONTACT = 1;\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/activity/NamedaysInADayPresenter.kt",
    "content": "package com.alexstyl.specialdates.events.namedays.activity\n\nimport com.alexstyl.gsc.SoundComparer\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.contact.ContactsProvider\nimport com.alexstyl.specialdates.contact.DisplayName\nimport com.alexstyl.specialdates.contact.Names\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.events.namedays.NamedayUserSettings\nimport com.alexstyl.specialdates.events.namedays.calendar.NamedayCalendar\nimport io.reactivex.Observable\nimport io.reactivex.Scheduler\nimport io.reactivex.disposables.Disposable\n\nclass NamedaysInADayPresenter(private val namedayCalendar: NamedayCalendar,\n                              private val namedaysViewModelFactory: NamedaysViewModelFactory,\n                              private val contactsProvider: ContactsProvider,\n                              private val namedayUserSettings: NamedayUserSettings,\n                              private val workScheduler: Scheduler,\n                              private val resultScheduler: Scheduler) {\n\n    private var disposable: Disposable? = null\n\n    fun startPresenting(into: NamedaysOnADayView, forDate: Date) {\n        disposable =\n                Observable.fromCallable { namedayCalendar.getAllNamedaysOn(forDate) }\n                        .observeOn(workScheduler)\n                        .map { findAndCreateViewModelsOf(it.getNames()) }\n                        .observeOn(resultScheduler)\n                        .subscribe { namedaysViewModel ->\n                            into.displayNamedays(namedaysViewModel)\n                        }\n    }\n\n    fun stopPresenting() = disposable?.dispose()\n\n    private fun findAndCreateViewModelsOf(celebratingNames: List<String>): List<NamedayScreenViewModel> {\n        val allContacts = contactsProvider.allContacts\n\n        return celebratingNames.fold(listOf(), { list, celebratingName ->\n            val contactsCelebrating = allContacts.findContactsCalled(celebratingName)\n            list + namedaysViewModelFactory.viewModelsFor(celebratingName) + contactsCelebrating.map {\n                namedaysViewModelFactory.viewModelsFor(it)\n            }\n        })\n\n    }\n\n    private val DisplayName.names: Names\n        get() {\n            return if (namedayUserSettings.shouldLookupAllNames()) {\n                this.firstNames\n            } else {\n                this.firstNames\n            }\n        }\n\n\n    private fun List<Contact>.findContactsCalled(celebratingName: String): List<Contact> {\n        val list = ArrayList<Contact>()\n        this.forEach { contact ->\n            contact.displayName.names.forEach {\n                if (it.soundsLike(celebratingName)) {\n                    list.add(contact)\n                    return@forEach\n                }\n            }\n        }\n        return list\n    }\n\n    private fun String.soundsLike(celebratingName: String): Boolean = SoundComparer.soundTheSame(this, celebratingName)\n}\n\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/activity/NamedaysOnADayView.kt",
    "content": "package com.alexstyl.specialdates.events.namedays.activity\n\ninterface NamedaysOnADayView {\n    fun displayNamedays(viewModels: List<NamedayScreenViewModel>)\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/activity/NamedaysViewModel.kt",
    "content": "package com.alexstyl.specialdates.events.namedays.activity\n\ndata class NamedaysViewModel(val name: String)\n    : NamedayScreenViewModel {\n\n    override val viewType: Int\n        get() = NamedayScreenViewType.NAMEDAY\n    override val id: Long\n        get() = hashCode().toLong()\n\n\n}\n\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/activity/NamedaysViewModelFactory.kt",
    "content": "package com.alexstyl.specialdates.events.namedays.activity\n\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.ui.widget.LetterPainter\n\nclass NamedaysViewModelFactory(private val letterPainter: LetterPainter) {\n\n    fun viewModelsFor(name: String): NamedaysViewModel {\n        return NamedaysViewModel(name)\n    }\n\n    fun viewModelsFor(contact: Contact): CelebratingContactViewModel {\n        val colorVariant = letterPainter.getVariant(contact.hashCode())\n        return CelebratingContactViewModel(contact, contact.displayName.toString(), colorVariant)\n    }\n\n}\n\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/calendar/EasternNameday.java",
    "content": "package com.alexstyl.specialdates.events.namedays.calendar;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class EasternNameday {\n\n    private int date;\n    private final List<String> celebratingNames;\n\n    EasternNameday(int daysToEaster,\n                   List<String> celebratingNames) {\n        this.date = daysToEaster;\n        this.celebratingNames = celebratingNames;\n    }\n\n    public List<String> getNamesCelebrating() {\n        return new ArrayList<>(celebratingNames);\n    }\n\n    public int getDateToEaster() {\n        return date;\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/calendar/EasternNamedaysExtractor.java",
    "content": "package com.alexstyl.specialdates.events.namedays.calendar;\n\nimport android.support.annotation.NonNull;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport org.json.JSONArray;\nimport org.json.JSONException;\nimport org.json.JSONObject;\n\npublic class EasternNamedaysExtractor {\n\n    private final JSONArray specialJSON;\n\n    public EasternNamedaysExtractor(JSONArray specialJSON) {\n        this.specialJSON = specialJSON;\n    }\n\n    public List<EasternNameday> parse() {\n        return extractNamedaysAsDaysFromEaster(specialJSON);\n    }\n\n    private List<EasternNameday> extractNamedaysAsDaysFromEaster(JSONArray specialJSON) {\n        List<EasternNameday> easternNamedays = new ArrayList<>();\n        int size = specialJSON.length();\n        for (int i = 0; i < size; i++) {\n            try {\n                JSONObject nameday = (JSONObject) specialJSON.get(i);\n                JSONArray variations = nameday.getJSONArray(\"variations\");\n                if (containsNoVariations(variations)) {\n                    continue;\n                }\n\n                int date = nameday.getInt(\"toEaster\");\n                ArrayList<String> celebratingNames = getVariationsFrom(variations);\n                EasternNameday easternDate = new EasternNameday(date, celebratingNames);\n                easternNamedays.add(easternDate);\n            } catch (JSONException e) {\n                e.printStackTrace();\n            }\n        }\n        return easternNamedays;\n    }\n\n    @NonNull\n    private ArrayList<String> getVariationsFrom(JSONArray variations) throws JSONException {\n        ArrayList<String> celebratingNames = new ArrayList<>();\n        for (int j = 0; j < variations.length(); j++) {\n            String variation = variations.getString(j);\n            celebratingNames.add(variation);\n        }\n        return celebratingNames;\n    }\n\n    private boolean containsNoVariations(JSONArray variations) {\n        return variations.length() == 0;\n    }\n\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/calendar/NamedayCalendar.java",
    "content": "package com.alexstyl.specialdates.events.namedays.calendar;\n\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.date.Dates;\nimport com.alexstyl.specialdates.events.namedays.NameCelebrations;\nimport com.alexstyl.specialdates.events.namedays.NamedayBundle;\nimport com.alexstyl.specialdates.events.namedays.NamedayLocale;\nimport com.alexstyl.specialdates.events.namedays.NamesInADate;\nimport com.alexstyl.specialdates.events.namedays.calendar.resource.SpecialNamedays;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class NamedayCalendar {\n\n    private final NamedayLocale locale;\n    private final NamedayBundle namedayBundle;\n    private final SpecialNamedays strategy;\n    private final int year;\n\n    public NamedayCalendar(NamedayLocale locale, NamedayBundle namedays, SpecialNamedays strategy, int year) {\n        this.locale = locale;\n        this.namedayBundle = namedays;\n        this.strategy = strategy;\n        this.year = year;\n    }\n\n    public NameCelebrations getNormalNamedaysFor(String name) {\n        return namedayBundle.getDatesFor(name);\n    }\n\n    public NameCelebrations getSpecialNamedaysFor(String name) {\n        return strategy.getNamedaysFor(name, year);\n    }\n\n    public NamesInADate getAllNamedaysOn(Date date) {\n        List<String> names = namedayBundle.getNamedaysFor(date).getNames();\n        List<String> specialNames = strategy.getNamedayOn(date).getNames();\n        List<String> arrayList = new ArrayList<>(names.size() + specialNames.size());\n        arrayList.addAll(names);\n        arrayList.addAll(specialNames);\n        return new NamesInADate(date, arrayList);\n    }\n\n    public ArrayList<String> getAllNames() {\n        ArrayList<String> names = namedayBundle.getNames();\n        names.addAll(strategy.getAllNames());\n        return names;\n    }\n\n    public NamedayLocale getLocale() {\n        return locale;\n    }\n\n    public int getYear() {\n        return year;\n    }\n\n    public NameCelebrations getAllNamedays(String searchQuery) {\n        NameCelebrations names = namedayBundle.getDatesFor(searchQuery);\n        NameCelebrations specialNames = strategy.getNamedaysFor(searchQuery, year);\n\n        Dates dates = new Dates(names.getDates());\n        dates.addAll(specialNames.getDates());\n        String matchingName = getName(names, specialNames);\n        return new NameCelebrations(matchingName, dates);\n    }\n\n    private String getName(NameCelebrations names, NameCelebrations specialNames) {\n        if (names.getName().length() > 0) {\n            return names.getName();\n        }\n        return specialNames.getName();\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/calendar/OrthodoxEasterCalculator.java",
    "content": "package com.alexstyl.specialdates.events.namedays.calendar;\n\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.date.MonthInt;\n\npublic class OrthodoxEasterCalculator {\n\n    /**\n     * Calculates the date of the easter Sunday for the given year\n     *\n     * @see <a href=\"https://en.wikipedia.org/wiki/Computus\">Computus on Wikipedia.com</a>\n     */\n    @SuppressWarnings({\"MagicNumber\"})\n    public Date calculateEasterForYear(int year) {\n        int a = year % 4;\n        int b = year % 7;\n        int c = year % 19;\n        int d = (19 * c + 15) % 30;\n        int e = (2 * a + 4 * b - d + 34) % 7;\n        @MonthInt int month = (d + e + 114) / 31;\n        int day = ((d + e + 144) % 31) + 1;\n        day++;\n        return Date.Companion.on(day, month, year).addDay(13);\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/calendar/resource/CharacterNode.java",
    "content": "package com.alexstyl.specialdates.events.namedays.calendar.resource;\n\nimport com.alexstyl.gsc.Index;\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.date.Dates;\nimport com.alexstyl.specialdates.events.namedays.NameCelebrations;\n\nimport java.text.Collator;\nimport java.util.ArrayList;\n\npublic class CharacterNode implements Node {\n\n    private static final NameCelebrations NO_NAMEDAYS = new NameCelebrations(\"\", new Dates());\n\n    private final Character keySound;\n    private final ArrayList<CharacterNode> nodes;\n    private NameCelebrations dates; // Name & dates it is being celebrated\n\n    public CharacterNode() {\n        this(null);\n    }\n\n    private CharacterNode(Character s) {\n        this.keySound = s;\n        this.nodes = new ArrayList<>();\n    }\n\n    @Override\n    public void clear() {\n        this.nodes.clear();\n        this.dates = null;\n    }\n\n    @Override\n    public void addDate(String name, Date date) {\n        Index index = new Index(name.length());\n        if (index.hasNotStarted()) {\n            if (dates == null) {\n                dates = new NameCelebrations(name);\n            }\n        }\n        index.stepUp();\n        addDateInternal(index, name, date);\n    }\n\n    private void addDateInternal(Index index, String word, Date date) {\n        Character s = null;\n        if (!index.hasEnded()) {\n            s = word.charAt(index.intValue());\n            index.stepUp();\n            if (index.intValue() == word.length()) {\n                index.end();\n            }\n        }\n\n        if (s == null) {\n            if (dates == null) {\n                dates = new NameCelebrations(word);\n            }\n            dates.addDate(date);\n\n        } else {\n            CharacterNode theNode = null;\n            Collator collator = getCollator();\n            for (CharacterNode node : nodes) {\n                if (collator.compare(node.keySound.toString(), s.toString()) == 0) {\n                    theNode = node;\n                    break;\n                }\n            }\n            if (theNode == null) {\n                theNode = new CharacterNode(s);\n                nodes.add(theNode);\n            }\n            theNode.addDateInternal(index, word, date);\n\n        }\n\n    }\n\n    @Override\n    public NameCelebrations getDates(String name) {\n        Index index = new Index(name.length());\n        if (index.hasEnded()) {\n            return getDates();\n        } else {\n            index.stepUp();\n            return getDatesInternal(index, name);\n        }\n    }\n\n    private NameCelebrations getDatesInternal(Index index, String name) {\n        Character s = null;\n        if (!index.hasEnded()) {\n            s = name.charAt(index.intValue());\n            index.stepUp();\n            if (index.intValue() >= name.length()) {\n                index.end();\n            }\n        }\n        if (s == null) {\n            return getDates();\n        } else {\n            Collator collator = getCollator();\n            for (CharacterNode node : nodes) {\n                if (collator.compare(node.keySound.toString(), s.toString()) == 0) {\n                    int currentIndex = index.intValue();\n                    NameCelebrations e = node.getDatesInternal(index, name);\n                    if (e != null) {\n                        return e;\n                    }\n                    index.setTo(currentIndex);\n                }\n            }\n            return new NameCelebrations(name);\n        }\n\n    }\n\n    @Override\n    public String toString() {\n        StringBuilder str = new StringBuilder();\n        if (keySound != null) {\n            str.append(keySound.toString()).append(\" \");\n        }\n        if (nodes != null) {\n            str.append(nodes.size());\n        }\n        if (dates != null) {\n            str.append(\" \").append(dates);\n        }\n        return str.toString();\n    }\n\n    public static Collator getCollator() {\n        Collator collator = Collator.getInstance();\n        collator.setStrength(Collator.PRIMARY);\n        return collator;\n    }\n\n    private NameCelebrations getDates() {\n        if (dates == null) {\n            return NO_NAMEDAYS;\n        } else {\n            return dates;\n        }\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/calendar/resource/GreekNamedays.java",
    "content": "package com.alexstyl.specialdates.events.namedays.calendar.resource;\n\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.events.namedays.NameCelebrations;\nimport com.alexstyl.specialdates.events.namedays.NamedayBundle;\nimport com.alexstyl.specialdates.events.namedays.NamesInADate;\nimport com.alexstyl.specialdates.events.namedays.calendar.OrthodoxEasterCalculator;\nimport com.alexstyl.specialdates.events.namedays.calendar.EasternNameday;\nimport com.alexstyl.specialdates.events.namedays.calendar.EasternNamedaysExtractor;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport org.json.JSONArray;\n\npublic final class GreekNamedays {\n\n    private final OrthodoxEasterCalculator easterCalculator;\n\n    private final SpecialGreekNamedaysCalculator specialGreekNamedaysCalculator;\n\n    private Date easter;\n    private NamedayBundle namedays;\n\n    private GreekNamedays(OrthodoxEasterCalculator easterCalculator, SpecialGreekNamedaysCalculator specialGreekNamedaysCalculator) {\n        this.easterCalculator = easterCalculator;\n        this.specialGreekNamedaysCalculator = specialGreekNamedaysCalculator;\n    }\n\n    public static GreekNamedays from(JSONArray specialJSON, OrthodoxEasterCalculator easterCalculator) {\n        EasternNamedaysExtractor extractor = new EasternNamedaysExtractor(specialJSON);\n        List<EasternNameday> namedays = extractor.parse();\n        SpecialGreekNamedaysCalculator specialGreekNamedaysCalculator = new SpecialGreekNamedaysCalculator(namedays);\n        return new GreekNamedays(easterCalculator, specialGreekNamedaysCalculator);\n    }\n\n    NamesInADate getNamedayByDate(Date date) {\n\n        int year = date.getYear();\n        refreshNamedaysIfNeeded(year);\n\n        return namedays.getNamedaysFor(date);\n    }\n\n    private void refreshNamedaysIfNeeded(int year) {\n        if (needsToCalculateNamedaysFor(year)) {\n            calculateNamedaysForYear(year);\n        }\n    }\n\n    private boolean needsToCalculateNamedaysFor(int year) {\n        return (easter == null || namedays == null) || easter.getYear() != year;\n    }\n\n    private void calculateNamedaysForYear(int year) {\n        easter = easterCalculator.calculateEasterForYear(year);\n        namedays = specialGreekNamedaysCalculator.calculateForEasterDate(easter);\n    }\n\n    public ArrayList<String> getNames() {\n        int year = Date.Companion.today().getYear();\n        refreshNamedaysIfNeeded(year);\n        return namedays.getNames();\n    }\n\n    public NameCelebrations getNamedaysFor(String name, int year) {\n        refreshNamedaysIfNeeded(year);\n        return namedays.getDatesFor(name);\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/calendar/resource/GreekSpecialNamedays.java",
    "content": "package com.alexstyl.specialdates.events.namedays.calendar.resource;\n\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.events.namedays.NameCelebrations;\nimport com.alexstyl.specialdates.events.namedays.NamesInADate;\nimport com.alexstyl.specialdates.events.namedays.calendar.OrthodoxEasterCalculator;\n\nimport java.util.ArrayList;\n\nfinal class GreekSpecialNamedays implements SpecialNamedays {\n\n    private final GreekNamedays greekNamedays;\n\n    public static GreekSpecialNamedays from(NamedayJSON namedayJSON, OrthodoxEasterCalculator easterCalculator) {\n        GreekNamedays greekNamedays = GreekNamedays.from(namedayJSON.getSpecial(), easterCalculator);\n        return new GreekSpecialNamedays(greekNamedays);\n    }\n\n    private GreekSpecialNamedays(GreekNamedays greekNamedays) {\n        this.greekNamedays = greekNamedays;\n    }\n\n    @Override\n    public NamesInADate getNamedayOn(Date date) {\n        return greekNamedays.getNamedayByDate(date);\n    }\n\n    @Override\n    public ArrayList<String> getAllNames() {\n        return greekNamedays.getNames();\n    }\n\n    @Override\n    public NameCelebrations getNamedaysFor(String name, int year) {\n        return greekNamedays.getNamedaysFor(name, year);\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/calendar/resource/NamedayCalendarProvider.java",
    "content": "package com.alexstyl.specialdates.events.namedays.calendar.resource;\n\nimport com.alexstyl.specialdates.events.namedays.NamedayBundle;\nimport com.alexstyl.specialdates.events.namedays.NamedayLocale;\nimport com.alexstyl.specialdates.events.namedays.calendar.NamedayCalendar;\n\nimport org.json.JSONException;\n\npublic class NamedayCalendarProvider {\n\n    private static NamedayCalendar cachedCalendar;\n\n    private final SpecialNamedaysHandlerFactory factory;\n    private final NamedayJSONProvider jsonProvider;\n\n    public NamedayCalendarProvider(NamedayJSONProvider jsonProvider, SpecialNamedaysHandlerFactory factory) {\n        this.factory = factory;\n        this.jsonProvider = jsonProvider;\n    }\n\n    public NamedayCalendar loadNamedayCalendarForLocale(NamedayLocale locale, int year) {\n        if (hasRequestedSameCalendar(locale, year)) {\n            return cachedCalendar;\n        }\n        NamedayJSON namedayJSON = getNamedayJSONFor(locale);\n        SpecialNamedays specialCaseHandler = getSpecialnamedaysHandler(locale, namedayJSON);\n        NamedayBundle namedaysBundle = getNamedayBundle(locale, namedayJSON);\n        NamedayCalendar namedayCalendar = new NamedayCalendar(locale, namedaysBundle, specialCaseHandler, year);\n\n        cacheCalendar(namedayCalendar);\n\n        return namedayCalendar;\n    }\n\n    private boolean hasRequestedSameCalendar(NamedayLocale locale, int year) {\n        return cachedCalendar != null && cachedCalendar.getYear() == year && cachedCalendar.getLocale().equals(locale);\n    }\n\n    private NamedayJSON getNamedayJSONFor(NamedayLocale locale) {\n        try {\n            return jsonProvider.getNamedayJSONFor(locale);\n        } catch (JSONException e) {\n            throw new IllegalStateException(\"Could not load nameday JSON for \" + locale);\n        }\n    }\n\n    private SpecialNamedays getSpecialnamedaysHandler(NamedayLocale locale, NamedayJSON namedayJSON) {\n        return factory.createStrategyForLocale(locale, namedayJSON);\n    }\n\n    private NamedayBundle getNamedayBundle(NamedayLocale locale, NamedayJSON namedayJSON) {\n        if (locale.isComparedBySound()) {\n            return NamedayJSONParser.getNamedaysFromJSONasSounds(namedayJSON);\n        } else {\n            return NamedayJSONParser.getNamedaysFrom(namedayJSON);\n        }\n    }\n\n    private void cacheCalendar(NamedayCalendar namedayCalendar) {\n        cachedCalendar = namedayCalendar;\n    }\n\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/calendar/resource/NamedayJSON.java",
    "content": "package com.alexstyl.specialdates.events.namedays.calendar.resource;\n\nimport org.json.JSONArray;\n\nclass NamedayJSON {\n    private final JSONArray data;\n    private final JSONArray special;\n\n    NamedayJSON(JSONArray data, JSONArray special) {\n        this.data = data;\n        this.special = special;\n    }\n\n    JSONArray getData() {\n        return data;\n    }\n\n    JSONArray getSpecial() {\n        return special;\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/calendar/resource/NamedayJSONParser.java",
    "content": "package com.alexstyl.specialdates.events.namedays.calendar.resource;\n\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.date.MonthInt;\nimport com.alexstyl.specialdates.events.namedays.NamedayBundle;\nimport com.alexstyl.specialdates.events.namedays.NamedaysList;\n\nimport org.json.JSONArray;\nimport org.json.JSONException;\nimport org.json.JSONObject;\n\nfinal class NamedayJSONParser {\n\n    private NamedayJSONParser() {\n        // hide this\n    }\n\n    static NamedayBundle getNamedaysFromJSONasSounds(NamedayJSON json) {\n        return createBundleWith(json, new SoundNode());\n    }\n\n    static NamedayBundle getNamedaysFrom(NamedayJSON json) {\n        return createBundleWith(json, new CharacterNode());\n    }\n\n    private static NamedayBundle createBundleWith(NamedayJSON locale, Node namesToDate) {\n        NamedaysList dateToNames = new NamedaysList();\n\n        JSONArray data = locale.getData();\n        int size = data.length();\n        for (int i = 0; i < size; i++) {\n            try {\n                JSONObject nameday;\n\n                nameday = (JSONObject) data.get(i);\n                String dateString = nameday.getString(\"date\");\n                Date theDate = getNamedaysFrom(dateString);\n\n                JSONArray variations = nameday.getJSONArray(\"names\");\n                int numberOfVariations = variations.length();\n                for (int varCount = 0; varCount < numberOfVariations; varCount++) {\n                    String variation = variations.getString(varCount);\n\n                    namesToDate.addDate(variation, theDate);\n                    dateToNames.addNameday(theDate, variation);\n\n                }\n            } catch (JSONException e) {\n                e.printStackTrace();\n            }\n        }\n\n        return new NamedayBundle(namesToDate, dateToNames);\n    }\n\n    private static Date getNamedaysFrom(String date) {\n        int slashIndex = date.indexOf(\"/\");\n        if (slashIndex == -1) {\n            throw new IllegalArgumentException(\"Unable to get Namedays From \" + date);\n        }\n        int dayOfMonth = Integer.parseInt(date.substring(0, slashIndex));\n        @MonthInt int month = Integer.parseInt(date.substring(slashIndex + 1));\n        return Date.Companion.on(dayOfMonth, month);\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/calendar/resource/NamedayJSONProvider.java",
    "content": "package com.alexstyl.specialdates.events.namedays.calendar.resource;\n\nimport com.alexstyl.specialdates.events.namedays.NamedayLocale;\n\nimport org.json.JSONArray;\nimport org.json.JSONException;\nimport org.json.JSONObject;\n\npublic class NamedayJSONProvider {\n\n    private static final JSONArray EMPTY = new JSONArray();\n\n    private final NamedayJSONResourceLoader loader;\n\n    public NamedayJSONProvider(NamedayJSONResourceLoader loader) {\n        this.loader = loader;\n    }\n\n    NamedayJSON getNamedayJSONFor(NamedayLocale locale) throws JSONException {\n        JSONObject json = loader.loadJSON(locale);\n        JSONArray data = json.getJSONArray(\"data\");\n        JSONArray special = getSpecialOf(json);\n        return new NamedayJSON(data, special);\n    }\n\n    private JSONArray getSpecialOf(JSONObject json) throws JSONException {\n        if (json.has(\"special\")) {\n            return json.getJSONArray(\"special\");\n        }\n        return EMPTY;\n    }\n\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/calendar/resource/NamedayJSONResourceLoader.kt",
    "content": "package com.alexstyl.specialdates.events.namedays.calendar.resource\n\nimport com.alexstyl.specialdates.events.namedays.NamedayLocale\n\nimport org.json.JSONException\nimport org.json.JSONObject\n\ninterface NamedayJSONResourceLoader {\n    @Throws(JSONException::class)\n    fun loadJSON(locale: NamedayLocale): JSONObject\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/calendar/resource/Node.java",
    "content": "package com.alexstyl.specialdates.events.namedays.calendar.resource;\n\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.events.namedays.NameCelebrations;\n\npublic interface Node {\n\n    void addDate(String name, Date date);\n\n    NameCelebrations getDates(String name);\n\n    void clear();\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/calendar/resource/RomanianEasterSpecialCalculator.kt",
    "content": "package com.alexstyl.specialdates.events.namedays.calendar.resource\n\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.Months.SUNDAY\nimport com.alexstyl.specialdates.events.namedays.calendar.OrthodoxEasterCalculator\n\nclass RomanianEasterSpecialCalculator(private val easterCalculator: OrthodoxEasterCalculator) {\n\n    fun calculateSpecialRomanianDayForYear(year: Int): Date {\n        var easter = easterCalculator.calculateEasterForYear(year)\n        while (easter.dayOfWeek != SUNDAY) {\n            easter = easter.addDay(-1)\n        }\n        return easter.addWeek(-1)\n    }\n\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/calendar/resource/RomanianNamedays.kt",
    "content": "package com.alexstyl.specialdates.events.namedays.calendar.resource\n\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.events.namedays.NameCelebrations\nimport com.alexstyl.specialdates.events.namedays.NamedayBundle\nimport com.alexstyl.specialdates.events.namedays.NamedaysList\nimport com.alexstyl.specialdates.events.namedays.NamesInADate\n\ndata class RomanianNamedays(private val calculator: RomanianEasterSpecialCalculator, private val names: List<String>) {\n\n    private var namedays: NamedayBundle? = null\n    private var romanianDate: Date? = null\n\n    val allNames: ArrayList<String>\n        get() = ArrayList(names)\n\n    fun getNamedaysFor(date: Date): NamesInADate {\n        calculateEasterIfNecessary(date.year)\n        return if (romanianDate == date) {\n            namedays!!.getNamedaysFor(date)\n        } else NamesInADate(date)\n    }\n\n    fun getNamedaysFor(name: String, year: Int): NameCelebrations {\n        calculateEasterIfNecessary(year)\n        return namedays!!.getDatesFor(name)\n    }\n\n    private fun calculateEasterIfNecessary(year: Int) {\n        if (romanianDate == null || romanianDate!!.year != year) {\n            romanianDate = calculator.calculateSpecialRomanianDayForYear(year)\n\n            val dateToNames = NamedaysList()\n            val namesToDate = CharacterNode()\n            for (name in names) {\n                dateToNames.addNameday(romanianDate, name)\n                namesToDate.addDate(name, romanianDate)\n            }\n\n            namedays = NamedayBundle(namesToDate, dateToNames)\n        }\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/calendar/resource/RomanianSpecialNamedays.java",
    "content": "package com.alexstyl.specialdates.events.namedays.calendar.resource;\n\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.events.namedays.NameCelebrations;\nimport com.alexstyl.specialdates.events.namedays.NamesInADate;\nimport com.alexstyl.specialdates.events.namedays.calendar.EasternNameday;\nimport com.alexstyl.specialdates.events.namedays.calendar.EasternNamedaysExtractor;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nfinal class RomanianSpecialNamedays implements SpecialNamedays {\n\n    private final RomanianNamedays namedays;\n\n    public static SpecialNamedays from(NamedayJSON namedayJSON, RomanianEasterSpecialCalculator romanianEasterCalculator) {\n        EasternNamedaysExtractor extractor = new EasternNamedaysExtractor(namedayJSON.getSpecial());\n        List<EasternNameday> easternNamedays = extractor.parse();\n        ArrayList<String> names = namesOf(easternNamedays);\n        RomanianNamedays namedays = new RomanianNamedays(romanianEasterCalculator, names);\n        return new RomanianSpecialNamedays(namedays);\n    }\n\n    private static ArrayList<String> namesOf(List<EasternNameday> easternNamedays) {\n        ArrayList<String> names = new ArrayList<>();\n        for (EasternNameday easternNameday : easternNamedays) {\n            names.addAll(easternNameday.getNamesCelebrating());\n        }\n        return names;\n    }\n\n    private RomanianSpecialNamedays(RomanianNamedays namedays) {\n        this.namedays = namedays;\n    }\n\n    @Override\n    public List<String> getAllNames() {\n        return namedays.getAllNames();\n    }\n\n    @Override\n    public NamesInADate getNamedayOn(Date date) {\n        return namedays.getNamedaysFor(date);\n    }\n\n    @Override\n    public NameCelebrations getNamedaysFor(String name, int year) {\n        return namedays.getNamedaysFor(name, year);\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/calendar/resource/SoundNode.kt",
    "content": "package com.alexstyl.specialdates.events.namedays.calendar.resource\n\nimport com.alexstyl.gsc.Sound\nimport com.alexstyl.gsc.SoundRules\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.events.namedays.NameCelebrations\n\n\nclass SoundNode private constructor(private val keySound: Sound?) : Node {\n    private val nodes = ArrayList<SoundNode>() // a b c d\n    private var dates: NameCelebrations? = null // Name\n\n    constructor() : this(null)\n\n\n    /**\n     * Clears the current node, by removing the NamedateBundle associated to this Node\n     * and the links to all the other nodes from this one.\n     */\n    override fun clear() {\n        nodes.clear()\n        dates = null\n    }\n\n    /**\n     * Adds the given date for the given word\n     */\n    override fun addDate(word: String, date: Date) {\n        val nextSounds = SoundRules.INSTANCE.getNextSound(word, false)\n        addDate(word, date, nextSounds)\n    }\n\n    private fun addDate(word: String, date: Date, iterator: Iterator<Sound?>) {\n        if (!iterator.hasNext()) {\n            if (dates == null) {\n                dates = NameCelebrations(word)\n            }\n            dates!!.addDate(date)\n        } else {\n            var theNode: SoundNode? = null\n            iterator.forEach { s ->\n                nodes.forEach { node ->\n                    if (node.keySound!!.soundsLike(s!!)) {\n                        theNode = node\n                        return@forEach\n                    }\n                }\n                if (theNode == null) {\n                    theNode = SoundNode(s)\n                    nodes.add(theNode!!)\n                }\n                theNode!!.addDate(word, date, iterator)\n            }\n        }\n    }\n\n    override fun getDates(name: String): NameCelebrations? = getDates(name, SoundRules.INSTANCE.getNextSound(name, false))\n\n    private fun getDates(name: String, iterator: Iterator<Sound?>): NameCelebrations? {\n        if (!iterator.hasNext()) {\n            return getNameCelebrations(name)\n        } else {\n            iterator.forEach { s ->\n                nodes.forEach { node ->\n                    if (node.keySound!!.soundsLike(s!!)) {\n                        val nameCelebrations = node.getDates(name, iterator)\n                        if (nameCelebrations != null) {\n                            return nameCelebrations\n                        }\n                    }\n                }\n            }\n            return NameCelebrations(name)\n        }\n    }\n\n    private fun getNameCelebrations(name: String): NameCelebrations {\n        return if (dates == null) {\n            NameCelebrations(name)\n        } else {\n            dates!!\n        }\n    }\n\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/calendar/resource/SpecialGreekNamedaysCalculator.java",
    "content": "package com.alexstyl.specialdates.events.namedays.calendar.resource;\n\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.date.DateComparator;\nimport com.alexstyl.specialdates.date.Months;\nimport com.alexstyl.specialdates.date.MonthInt;\nimport com.alexstyl.specialdates.events.namedays.NamedayBundle;\nimport com.alexstyl.specialdates.events.namedays.NamedaysList;\nimport com.alexstyl.specialdates.events.namedays.calendar.EasternNameday;\n\nimport java.util.Arrays;\nimport java.util.Calendar;\nimport java.util.List;\n\nclass SpecialGreekNamedaysCalculator {\n\n    private static final DateComparator COMPARATOR = DateComparator.INSTANCE;\n    private static final List<String> PROPATORWN = Arrays.asList(\n            \"Ααρών\",\n            \"Αβραάμ\",\n            \"Αδάμ\",\n            \"Αδαμάντιος\",\n            \"Διαμαντής\",\n            \"Αδαμαντία\",\n            \"Διαμαντούλα\",\n            \"Διαμάντω\",\n            \"Δαβίδ\",\n            \"Δαυίδ\",\n            \"Δανάη\",\n            \"Δανιήλ\",\n            \"Δεβόρα\",\n            \"Εσθήρ\",\n            \"Εύα\",\n            \"Ισαάκ\",\n            \"Ιώβ\",\n            \"Νώε\",\n            \"Ραχήλ\",\n            \"Ρεβέκκα\",\n            \"Ρουμπίνη\",\n            \"Σάρα\",\n            \"Μελχισεδέ\"\n    );\n    private static final String CLOE = \"Χλόη\";\n\n    private static final List<String> MARKOS_ALTS = Arrays.asList(\n            \"Μάρκος\",\n            \"Μαρκής\",\n            \"Μαρκία\",\n            \"Μαρκούλης\",\n            \"Μαρκούλ\"\n    );\n\n    private final List<EasternNameday> easternNamedays;\n\n    SpecialGreekNamedaysCalculator(List<EasternNameday> easternNamedays) {\n        this.easternNamedays = easternNamedays;\n    }\n\n    NamedayBundle calculateForEasterDate(Date easter) {\n        Node node = new SoundNode();\n        NamedaysList namedaysList = new NamedaysList();\n\n        for (EasternNameday easternNameday : easternNamedays) {\n            int daysUntilEaster = easternNameday.getDateToEaster();\n            Date date = easter.addDay(daysUntilEaster);\n\n            for (String name : easternNameday.getNamesCelebrating()) {\n                node.addDate(name, date);\n                namedaysList.addNameday(date, name);\n            }\n        }\n        appendSpecialScenarios(easter, node, namedaysList);\n        return new NamedayBundle(node, namedaysList);\n    }\n\n    private void appendSpecialScenarios(Date easter, Node node, NamedaysList namedaysList) {\n        addSpecialPropatorwn(node, namedaysList);\n        addSpecialMarkos(node, namedaysList, easter);\n        addSpecialGiwrgos(node, namedaysList, easter);\n        addSpecialChloe(node, namedaysList);\n    }\n\n    @SuppressWarnings({\"MagicNumber\"})\n    private void addSpecialPropatorwn(Node node, NamedaysList namedaysList) {\n        Calendar calendar = Calendar.getInstance();\n        calendar.set(Calendar.MONTH, Calendar.DECEMBER);\n        calendar.set(Calendar.DAY_OF_MONTH, 11);\n        while (calendar.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) {\n            calendar.add(Calendar.DAY_OF_MONTH, 1);\n        }\n\n        Date date = createDayDateFrom(calendar);\n        for (String variation : PROPATORWN) {\n            node.addDate(variation, date);\n            namedaysList.addNameday(date, variation);\n        }\n    }\n\n    @SuppressWarnings({\"MagicNumber\"})\n    private void addSpecialMarkos(Node node, NamedaysList namedaysList, Date easter) {\n        int year = Date.Companion.today().getYear();\n        Date date = Date.Companion.on(23, Months.APRIL, year);\n        if (COMPARATOR.compare(easter, date) > 0) {\n            date = date.addDay(2);\n        } else {\n            date = Date.Companion.on(25, Months.APRIL, year);\n        }\n\n        for (String variation : MARKOS_ALTS) {\n            node.addDate(variation, date);\n            namedaysList.addNameday(date, variation);\n        }\n    }\n\n    private static final List<String> GEORGE_ALTS = Arrays.asList(\n            \"Γεώργιος\",\n            \"Γεωργής\",\n            \"Γιώργος\",\n            \"Γκόγκος\",\n            \"Γιώργης\",\n            \"Γιωργίτσης\",\n            \"Γεωργία\",\n            \"Γιωργία\",\n            \"Γεωργούλα\",\n            \"Γιωργίτσα\",\n            \"Γίτσα\"\n    );\n\n    @SuppressWarnings({\"MagicNumber\"})\n    private void addSpecialGiwrgos(Node node, NamedaysList namedaysList, Date easter) {\n        Date date = Date.Companion.on(23, Months.APRIL, Date.Companion.today().getYear());\n\n        Date actualDate;\n        if (COMPARATOR.compare(easter, date) > 0) {\n            actualDate = easter.addDay(1);\n        } else {\n            actualDate = date;\n        }\n\n        for (String variation : GEORGE_ALTS) {\n            node.addDate(variation, actualDate);\n            namedaysList.addNameday(actualDate, variation);\n        }\n    }\n\n    @SuppressWarnings({\"MagicNumber\"})\n    private void addSpecialChloe(Node node, NamedaysList namedaysList) {\n        Calendar cal = Calendar.getInstance();\n        cal.set(Calendar.MONTH, Calendar.FEBRUARY);\n        cal.set(Calendar.DAY_OF_MONTH, 13);\n\n        while (cal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) {\n            cal.add(Calendar.DAY_OF_MONTH, 1);\n        }\n        Date date = createDayDateFrom(cal);\n\n        String variation = CLOE;\n        node.addDate(variation, date);\n        namedaysList.addNameday(date, variation);\n    }\n\n    private static Date createDayDateFrom(Calendar calendar) {\n        @MonthInt int month = calendar.get(Calendar.MONTH);\n        return Date.Companion.on(calendar.get(Calendar.DAY_OF_MONTH), month, calendar.get(Calendar.YEAR));\n    }\n\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/calendar/resource/SpecialNamedays.java",
    "content": "package com.alexstyl.specialdates.events.namedays.calendar.resource;\n\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.events.namedays.NameCelebrations;\nimport com.alexstyl.specialdates.events.namedays.NamesInADate;\n\nimport java.util.List;\n\npublic interface SpecialNamedays {\n\n    NamesInADate getNamedayOn(Date date);\n\n    NameCelebrations getNamedaysFor(String name, int year);\n\n    List<String> getAllNames();\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/namedays/calendar/resource/SpecialNamedaysHandlerFactory.java",
    "content": "package com.alexstyl.specialdates.events.namedays.calendar.resource;\n\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.events.namedays.NameCelebrations;\nimport com.alexstyl.specialdates.events.namedays.NamedayLocale;\nimport com.alexstyl.specialdates.events.namedays.NamesInADate;\nimport com.alexstyl.specialdates.events.namedays.calendar.OrthodoxEasterCalculator;\n\nimport java.util.Collections;\nimport java.util.List;\n\npublic final class SpecialNamedaysHandlerFactory {\n    private final OrthodoxEasterCalculator orthodoxEasterCalculator;\n    private final RomanianEasterSpecialCalculator romanianEasterCalculator;\n\n    public SpecialNamedaysHandlerFactory(OrthodoxEasterCalculator orthodoxEasterCalculator,\n                                         RomanianEasterSpecialCalculator romanianEasterCalculator) {\n        this.orthodoxEasterCalculator = orthodoxEasterCalculator;\n        this.romanianEasterCalculator = romanianEasterCalculator;\n    }\n\n    SpecialNamedays createStrategyForLocale(NamedayLocale locale, NamedayJSON namedayJSON) {\n        if (isGreekLocale(locale)) {\n            return GreekSpecialNamedays.from(namedayJSON, orthodoxEasterCalculator);\n        } else if (isRomanian(locale)) {\n            return RomanianSpecialNamedays.from(namedayJSON, romanianEasterCalculator);\n        }\n        return NO_SPECIAL_NAMEDAYS;\n    }\n\n    private boolean isRomanian(NamedayLocale locale) {\n        return locale == NamedayLocale.ROMANIAN;\n    }\n\n    private boolean isGreekLocale(NamedayLocale locale) {\n        return locale == NamedayLocale.GREEK;\n    }\n\n    private static final SpecialNamedays NO_SPECIAL_NAMEDAYS = new SpecialNamedays() {\n        @Override\n        public NamesInADate getNamedayOn(Date date) {\n            return new NamesInADate(date, Collections.<String>emptyList());\n        }\n\n        @Override\n        public NameCelebrations getNamedaysFor(String name, int year) {\n            return new NameCelebrations(name);\n        }\n\n        @Override\n        public List<String> getAllNames() {\n            return Collections.emptyList();\n        }\n    };\n\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/peopleevents/ClosestEventsComparator.java",
    "content": "package com.alexstyl.specialdates.events.peopleevents;\n\nimport com.alexstyl.specialdates.Optional;\nimport com.alexstyl.specialdates.date.DateComparator;\nimport com.alexstyl.specialdates.events.peopleevents.ContactEventsOnADate;\n\nimport java.io.Serializable;\nimport java.util.Comparator;\n\nfinal class ClosestEventsComparator implements Comparator<Optional<ContactEventsOnADate>>, Serializable {\n\n    private final DateComparator dateComparator = DateComparator.INSTANCE;\n\n    @Override\n    public int compare(Optional<ContactEventsOnADate> optionalA, Optional<ContactEventsOnADate> optionalB) {\n        if (!optionalA.isPresent() && !optionalB.isPresent()) {\n            return 0;\n        }\n        if (optionalA.isPresent() && !optionalB.isPresent()) {\n            return -1;\n        } else if (!optionalA.isPresent() && optionalB.isPresent()) {\n            return 1;\n        } else {\n            ContactEventsOnADate eventsA = optionalA.get();\n            ContactEventsOnADate eventsB = optionalB.get();\n            return dateComparator.compare(eventsA.getDate(), eventsB.getDate());\n        }\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/peopleevents/CompositePeopleEventsProvider.kt",
    "content": "package com.alexstyl.specialdates.events.peopleevents\n\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.date.ContactEvent\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.TimePeriod\n\n\nclass CompositePeopleEventsProvider(private var providers: List<PeopleEventsProvider>)\n    : PeopleEventsProvider {\n\n    override fun fetchEventsOn(date: Date): ContactEventsOnADate {\n        val empty = ContactEventsOnADate.createFrom(date, emptyList())\n\n        return providers.fold(empty, { contactEvents, provider ->\n            contactEvents + provider.fetchEventsOn(date)\n        })\n    }\n\n    override fun fetchEventsBetween(timePeriod: TimePeriod): List<ContactEvent> =\n            providers.fold(emptyList(), { list, provider ->\n                list + provider.fetchEventsBetween(timePeriod)\n            })\n\n    override fun fetchEventsFor(contact: Contact): List<ContactEvent> =\n            providers.fold(emptyList(), { list, provider ->\n                list + provider.fetchEventsFor(contact)\n            })\n\n\n    override fun findClosestEventDateOnOrAfter(date: Date): Date? {\n        date.ensureHasYear()\n\n        return providers.mapNotNull {\n            it.findClosestEventDateOnOrAfter(date)\n        }.min()\n    }\n\n    private fun Date.ensureHasYear() {\n        if (!this.hasYear()) {\n            throw IllegalArgumentException(\"Date must contain year\")\n        }\n    }\n}\n\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/peopleevents/ContactEventsOnADate.kt",
    "content": "package com.alexstyl.specialdates.events.peopleevents\n\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.date.ContactEvent\nimport com.alexstyl.specialdates.date.Date\n\ndata class ContactEventsOnADate(val date: Date, val events: List<ContactEvent>, val contacts: List<Contact>) {\n\n    companion object {\n\n        fun createFrom(date: Date, contactEvent: List<ContactEvent>): ContactEventsOnADate {\n            val contacts = getContactsIn(contactEvent)\n            return ContactEventsOnADate(date, contactEvent, contacts)\n        }\n\n        private fun getContactsIn(events: List<ContactEvent>): List<Contact> {\n            val contacts = ArrayList<Contact>()\n            for ((_, _, _, contact) in events) {\n                if (!contacts.contains(contact)) {\n                    contacts.add(contact)\n                }\n            }\n\n            return contacts.toList()\n        }\n    }\n\n    operator fun plus(otherEvents: ContactEventsOnADate): ContactEventsOnADate {\n        if (date != otherEvents.date) {\n            throw UnsupportedOperationException(\"Can only add ${javaClass.simpleName} of the same date\")\n        }\n        return ContactEventsOnADate(date, events + otherEvents.events, contacts + otherEvents.contacts)\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/peopleevents/CustomEventType.kt",
    "content": "package com.alexstyl.specialdates.events.peopleevents\n\nimport com.alexstyl.specialdates.Strings\n\nimport com.alexstyl.specialdates.events.database.EventTypeId.TYPE_CUSTOM\n\nclass CustomEventType(private val name: String) : EventType {\n\n    override fun getEventName(strings: Strings): String = name\n\n    override val id: Int\n        get() = TYPE_CUSTOM\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/peopleevents/EventType.kt",
    "content": "package com.alexstyl.specialdates.events.peopleevents\n\nimport com.alexstyl.specialdates.Strings\nimport com.alexstyl.specialdates.events.database.EventTypeId\n\ninterface EventType {\n\n    fun getEventName(strings: Strings): String\n\n    @get:EventTypeId\n    val id: Int\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/peopleevents/NoEventsFoundException.kt",
    "content": "package com.alexstyl.specialdates.events.peopleevents\n\nclass NoEventsFoundException(message: String) : Exception(message)\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/peopleevents/PeopleDynamicNamedaysProvider.kt",
    "content": "package com.alexstyl.specialdates.events.peopleevents\n\nimport com.alexstyl.specialdates.Optional\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.contact.ContactsProvider\nimport com.alexstyl.specialdates.date.ContactEvent\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.DateComparator\nimport com.alexstyl.specialdates.date.TimePeriod\nimport com.alexstyl.specialdates.events.namedays.NameCelebrations\nimport com.alexstyl.specialdates.events.namedays.NamedayUserSettings\nimport com.alexstyl.specialdates.events.namedays.calendar.NamedayCalendar\nimport com.alexstyl.specialdates.events.namedays.calendar.resource.NamedayCalendarProvider\n\nopen class PeopleDynamicNamedaysProvider(\n        private val settings: NamedayUserSettings,\n        private val namedayCalendarProvider: NamedayCalendarProvider,\n        private val contactsProvider: ContactsProvider) : PeopleEventsProvider {\n\n    private val namedayCalendar: NamedayCalendar\n        get() {\n            val locale = settings.selectedLanguage\n            return namedayCalendarProvider.loadNamedayCalendarForLocale(locale, Date.CURRENT_YEAR)\n        }\n\n    override fun fetchEventsOn(date: Date): ContactEventsOnADate {\n        val contactEvents = fetchEventsBetween(TimePeriod.between(date, date))\n        return ContactEventsOnADate.createFrom(date, contactEvents)\n    }\n\n    override fun fetchEventsBetween(timePeriod: TimePeriod): List<ContactEvent> {\n        if (!settings.isEnabled) {\n            return emptyList()\n        }\n        val namedayEvents = ArrayList<ContactEvent>()\n        for (contact in contactsProvider.allContacts) {\n            for (firstName in contact.displayName.firstNames) {\n                val nameDays = getSpecialNamedaysOf(firstName)\n                if (nameDays.containsNoDate()) {\n                    continue\n                }\n\n                val namedaysCount = nameDays.size()\n                for (i in 0 until namedaysCount) {\n                    val date = nameDays.getDate(i)\n                    if (timePeriod.containsDate(date)) {\n                        val nameday = ContactEvent(Optional(contact.contactID), StandardEventType.NAMEDAY, date, contact)\n                        namedayEvents.add(nameday)\n                    }\n                }\n            }\n        }\n        return namedayEvents.toList()\n    }\n\n    override fun fetchEventsFor(contact: Contact): List<ContactEvent> {\n        if (!settings.isEnabled) {\n            return emptyList()\n        }\n        val namedays = ArrayList<ContactEvent>()\n        for (name in contact.displayName.allNames) {\n            val (_, specialDates) = getSpecialNamedaysOf(name)\n            for (i in 0 until specialDates.size()) {\n                val date = specialDates.getDate(i)\n                val deviceEventId = Optional(contact.contactID)\n                val contactEvent = ContactEvent(deviceEventId, StandardEventType.NAMEDAY, date, contact)\n                namedays.add(contactEvent)\n            }\n        }\n        return namedays\n    }\n\n    override fun findClosestEventDateOnOrAfter(date: Date): Date? {\n        if (!settings.isEnabled) {\n            return null\n        }\n        val timePeriod = TimePeriod.between(date, Date.endOfYear(date.year))\n        val contactEvents = ArrayList(fetchEventsBetween(timePeriod))\n        contactEvents.sortWith(Comparator { (_, _, date1), (_, _, date2) -> DATE_COMPARATOR.compare(date1, date2) })\n\n        for ((_, _, contactEventDate) in contactEvents) {\n            if (DATE_COMPARATOR.compare(contactEventDate, date) >= 0) {\n                return contactEventDate\n            }\n        }\n        return null\n    }\n\n    fun loadAllStaticNamedays(): List<ContactEvent> {\n        if (!settings.isEnabled) {\n            return emptyList()\n        }\n        val namedayEvents = ArrayList<ContactEvent>()\n        val contacts = contactsProvider.allContacts\n        for (contact in contacts) {\n            val displayName = contact.displayName\n            val namedays = HashSet<Date>()\n            for (firstName in displayName.firstNames) {\n                val nameDays = getNamedaysOf(firstName)\n                if (nameDays.containsNoDate()) {\n                    continue\n                }\n                val namedaysCount = nameDays.size()\n                for (i in 0 until namedaysCount) {\n                    val date = nameDays.getDate(i)\n                    if (namedays.contains(date)) {\n                        continue\n                    }\n                    val event = ContactEvent(Optional(contact.contactID), StandardEventType.NAMEDAY, date, contact)\n                    namedayEvents.add(event)\n                    namedays.add(date)\n                }\n            }\n        }\n\n        return namedayEvents\n    }\n\n    private fun getNamedaysOf(given: String): NameCelebrations {\n        val namedayCalendar = namedayCalendar\n        return namedayCalendar.getNormalNamedaysFor(given)\n    }\n\n    private fun getSpecialNamedaysOf(firstName: String): NameCelebrations {\n        val namedayCalendar = namedayCalendar\n        return namedayCalendar.getSpecialNamedaysFor(firstName)\n    }\n\n    companion object {\n\n        private val DATE_COMPARATOR = DateComparator.INSTANCE\n    }\n\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/peopleevents/PeopleEventsPersister.kt",
    "content": "package com.alexstyl.specialdates.events.peopleevents\n\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.contact.ContactSource\nimport com.alexstyl.specialdates.date.ContactEvent\n\ninterface PeopleEventsPersister {\n    fun deleteAllNamedays()\n\n    fun deleteAllEventsOfSource(@ContactSource source: Int)\n\n    fun deleteAllDeviceEvents()\n\n    fun markContactAsVisible(contact: Contact)\n\n    fun markContactAsHidden(contact: Contact)\n\n    fun getVisibilityFor(contact: Contact): Boolean\n    \n    fun insertAnnualEvents(events: List<ContactEvent>)\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/peopleevents/PeopleEventsProvider.kt",
    "content": "package com.alexstyl.specialdates.events.peopleevents\n\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.date.ContactEvent\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.TimePeriod\n\ninterface PeopleEventsProvider {\n    fun fetchEventsOn(date: Date): ContactEventsOnADate\n\n    fun fetchEventsBetween(timePeriod: TimePeriod): List<ContactEvent>\n\n    fun fetchEventsFor(contact: Contact): List<ContactEvent>\n\n    fun findClosestEventDateOnOrAfter(date: Date): Date?\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/peopleevents/PeopleEventsRepository.kt",
    "content": "package com.alexstyl.specialdates.events.peopleevents\n\nimport com.alexstyl.specialdates.date.ContactEvent\n\ninterface PeopleEventsRepository {\n    fun fetchPeopleWithEvents(): List<ContactEvent>\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/peopleevents/PeopleEventsStaticEventsRefresher.kt",
    "content": "package com.alexstyl.specialdates.events.peopleevents\n\nclass PeopleEventsStaticEventsRefresher(\n        private val peopleEventsRepository: PeopleEventsRepository,\n        private val persister: PeopleEventsPersister) {\n\n    fun rebuildEvents() {\n        persister.deleteAllDeviceEvents()\n        val contacts = peopleEventsRepository.fetchPeopleWithEvents()\n        persister.insertAnnualEvents(contacts)\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/peopleevents/PeopleEventsUpdater.kt",
    "content": "package com.alexstyl.specialdates.events.peopleevents\n\nimport com.alexstyl.specialdates.events.namedays.NamedayDatabaseRefresher\nimport io.reactivex.Observable\nimport io.reactivex.Scheduler\n\nopen class PeopleEventsUpdater(private val peopleEventsStaticEventsRefresher: PeopleEventsStaticEventsRefresher,\n                               private val namedayDatabaseRefresher: NamedayDatabaseRefresher,\n                               private val viewRefresher: UpcomingEventsViewRefresher,\n                               private val peopleSettings: UpcomingEventsSettings,\n                               private val workScheduler: Scheduler,\n                               private val resultScheduler: Scheduler) {\n\n    open fun updateEvents() = Observable.fromCallable {\n        peopleEventsStaticEventsRefresher.rebuildEvents()\n        namedayDatabaseRefresher.refreshNamedaysIfEnabled()\n        peopleSettings.markEventsAsInitialised()\n    }.map {\n        viewRefresher.refreshViews()\n    }\n            .subscribeOn(workScheduler)\n            .observeOn(resultScheduler)!!\n\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/peopleevents/ShortDateLabelCreator.java",
    "content": "package com.alexstyl.specialdates.events.peopleevents;\n\nimport com.alexstyl.specialdates.date.Date;\n\n/**\n * Creates date labels in a YYYY-MM-DD fashion. This class should be used to describe a date for non-user facing components, such as database entries.\n */\npublic class ShortDateLabelCreator {\n\n    private static final int TEN = 10;\n    private static final String SEPARATOR = \"-\";\n    private static final String ZERO = \"0\";\n\n    public String createLabelWithYearPreferredFor(Date date) {\n        StringBuilder str = new StringBuilder();\n        addYear(date, str);\n        str.append(SEPARATOR);\n        addMonth(date, str);\n        str.append(SEPARATOR);\n        addDayOfMonth(date, str);\n        return str.toString();\n    }\n\n    public String createLabelWithNoYearFor(Date date) {\n        StringBuilder str = new StringBuilder();\n        addMonth(date, str);\n        str.append(SEPARATOR);\n        addDayOfMonth(date, str);\n        return str.toString();\n    }\n\n    private void addYear(Date date, StringBuilder str) {\n        if (date.hasYear()) {\n            str.append(date.getYear());\n        } else {\n            str.append(SEPARATOR);\n        }\n    }\n\n    private void addMonth(Date date, StringBuilder str) {\n        boolean isSingleDigit = isSingleDigit(date.getMonth());\n        if (isSingleDigit) {\n            str.append(ZERO);\n        }\n        str.append(date.getMonth());\n    }\n\n    private void addDayOfMonth(Date date, StringBuilder str) {\n        boolean isSingleDigit = isSingleDigit(date.getDayOfMonth());\n        if (isSingleDigit) {\n            str.append(ZERO);\n        }\n        str.append(date.getDayOfMonth());\n    }\n\n    private boolean isSingleDigit(int number) {\n        return number < TEN;\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/peopleevents/StandardEventType.java",
    "content": "package com.alexstyl.specialdates.events.peopleevents;\n\nimport android.support.annotation.NonNull;\n\nimport com.alexstyl.specialdates.Strings;\nimport com.alexstyl.specialdates.events.database.EventTypeId;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic enum StandardEventType implements EventType {\n    BIRTHDAY(EventTypeId.TYPE_BIRTHDAY),\n    NAMEDAY(EventTypeId.TYPE_NAMEDAY),\n    ANNIVERSARY(EventTypeId.TYPE_ANNIVERSARY),\n    OTHER(EventTypeId.TYPE_OTHER),\n    CUSTOM(EventTypeId.TYPE_CUSTOM);\n\n    @EventTypeId\n    private final int eventTypeId;\n\n    StandardEventType(@EventTypeId int eventTypeId) {\n        this.eventTypeId = eventTypeId;\n    }\n\n    private static final Map<Integer, StandardEventType> MAP;\n\n    static {\n        MAP = new HashMap<>();\n        for (StandardEventType eventType : values()) {\n            MAP.put(eventType.eventTypeId, eventType);\n        }\n    }\n\n    public static StandardEventType fromId(@EventTypeId int eventTypeId) {\n        if (MAP.containsKey(eventTypeId)) {\n            return MAP.get(eventTypeId);\n        }\n        throw new IllegalArgumentException(\"No event type with eventTypeId \" + eventTypeId);\n    }\n\n    @Override\n    public String getEventName(@NonNull Strings strings) {\n        return strings.nameOfEvent(this);\n    }\n\n    @EventTypeId\n    public int getId() {\n        return eventTypeId;\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/peopleevents/UpcomingEventsSettings.kt",
    "content": "package com.alexstyl.specialdates.events.peopleevents\n\ninterface UpcomingEventsSettings {\n    fun hasBeenInitialised(): Boolean\n    fun markEventsAsInitialised()\n    fun reset()\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/events/peopleevents/UpcomingEventsViewRefresher.kt",
    "content": "package com.alexstyl.specialdates.events.peopleevents\n\nimport com.alexstyl.specialdates.UpcomingEventsView\n\nclass UpcomingEventsViewRefresher(private val views: MutableSet<UpcomingEventsView>) {\n\n    fun refreshViews() {\n        for (view in views) {\n            view.reloadUpcomingEventsView()\n        }\n    }\n\n    fun addEventsView(view: UpcomingEventsView) {\n        this.views.add(view)\n    }\n\n    fun removeView(view: UpcomingEventsView) {\n        this.views.remove(view)\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/facebook/FacebookImagePath.kt",
    "content": "package com.alexstyl.specialdates.facebook\n\nimport java.net.URI\n\nobject FacebookImagePath {\n\n    private const val SIZE = 700\n    private const val IMG_URL = \"https://graph.facebook.com/%s/picture?width=$SIZE&height=$SIZE\"\n\n    fun forUid(uid: Long): URI {\n        return URI.create(String.format(IMG_URL, uid))\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/facebook/FacebookUserSettings.kt",
    "content": "package com.alexstyl.specialdates.facebook\n\ninterface FacebookUserSettings {\n\n    val isLoggedIn: Boolean\n    \n    fun store(userCredentials: UserCredentials)\n\n    fun retrieveCredentials(): UserCredentials\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/facebook/UserCredentials.java",
    "content": "package com.alexstyl.specialdates.facebook;\n\npublic class UserCredentials {\n\n    public static final UserCredentials ANNONYMOUS = new UserCredentials(-1, \"\", \"\");\n\n    private final long userID;\n    private final String key;\n    private final String name;\n\n    public UserCredentials(long userID, String key, String name) {\n        this.userID = userID;\n        this.key = key;\n        this.name = name;\n    }\n\n    public long getUid() {\n        return userID;\n\n    }\n\n    public String getKey() {\n        return key;\n\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    @Override\n    public boolean equals(Object o) {\n        if (this == o) {\n            return true;\n        }\n        if (o == null || getClass() != o.getClass()) {\n            return false;\n        }\n\n        UserCredentials that = (UserCredentials) o;\n\n        if (userID != that.userID) {\n            return false;\n        }\n        if (!key.equals(that.key)) {\n            return false;\n        }\n        return name.equals(that.name);\n\n    }\n\n    @Override\n    public int hashCode() {\n        int result = (int) (userID ^ (userID >>> 32));\n        result = 31 * result + key.hashCode();\n        result = 31 * result + name.hashCode();\n        return result;\n    }\n\n    public boolean isAnnonymous() {\n        return equals(ANNONYMOUS);\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/facebook/friendimport/CalendarFetcherException.java",
    "content": "package com.alexstyl.specialdates.facebook.friendimport;\n\nclass CalendarFetcherException extends Exception {\n    CalendarFetcherException(Exception e) {\n        super(e);\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/facebook/friendimport/CalendarLoader.java",
    "content": "package com.alexstyl.specialdates.facebook.friendimport;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.net.URL;\n\ninterface CalendarLoader {\n    InputStream loadFrom(URL url) throws IOException;\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/facebook/friendimport/ContactEventSerialiser.java",
    "content": "package com.alexstyl.specialdates.facebook.friendimport;\n\nimport com.alexstyl.specialdates.CrashAndErrorTracker;\nimport com.alexstyl.specialdates.date.ContactEvent;\n\nimport java.io.BufferedReader;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nclass ContactEventSerialiser {\n\n    private static final String EVENT_END = \"END:VEVENT\";\n    private static final String EVENT_START = \"BEGIN:VEVENT\";\n    private static final String EVENT_DATE = \"DTSTART\";\n    private static final String EVENT_SUMMARY = \"SUMMARY\";\n    private static final String EVENT_UID = \"UID\";\n\n    private final FacebookContactFactory factory;\n    private final CrashAndErrorTracker tracker;\n\n    ContactEventSerialiser(FacebookContactFactory factory, CrashAndErrorTracker tracker) {\n        this.factory = factory;\n        this.tracker = tracker;\n    }\n\n    List<ContactEvent> createEventsFrom(InputStream inputStream) throws IOException {\n        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, \"UTF-8\"));\n        String line;\n        List<ContactEvent> contactEvents = new ArrayList<>();\n        Map<String, String> map = null;\n        while ((line = reader.readLine()) != null) {\n            if (EVENT_START.equals(line)) {\n                map = new HashMap<>();\n            } else if (EVENT_END.equals(line)) {\n                try {\n                    ContactEvent contactEvent = factory.createContactFrom(map);\n                    contactEvents.add(contactEvent);\n                } catch (InvalidFacebookContactException ex) {\n                    tracker.track(ex);\n                }\n            } else if (line.startsWith(EVENT_DATE)) {\n                parse(line, map, EVENT_DATE);\n            } else if (line.startsWith(EVENT_SUMMARY)) {\n                parse(line, map, EVENT_SUMMARY);\n            } else if (line.startsWith(EVENT_UID)) {\n                parse(line, map, EVENT_UID);\n            }\n        }\n        return contactEvents;\n    }\n\n    private void parse(String line, Map<String, String> map, String value) {\n        String substr = line.substring(value.length() + 1, line.length());\n        map.put(value, substr);\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/facebook/friendimport/FacebookBirthdaysProvider.java",
    "content": "package com.alexstyl.specialdates.facebook.friendimport;\n\nimport com.alexstyl.specialdates.date.ContactEvent;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.net.URL;\nimport java.util.List;\n\nclass FacebookBirthdaysProvider {\n\n    private final CalendarLoader calendarLoader;\n    private final ContactEventSerialiser serialiser;\n\n    FacebookBirthdaysProvider(CalendarLoader calendarLoader, ContactEventSerialiser serialiser) {\n        this.calendarLoader = calendarLoader;\n        this.serialiser = serialiser;\n    }\n\n    List<ContactEvent> fetchCalendarFrom(URL url) throws CalendarFetcherException {\n        InputStream inputStream = null;\n        try {\n            inputStream = calendarLoader.loadFrom(url);\n            return serialiser.createEventsFrom(inputStream);\n        } catch (IOException e) {\n            throw new CalendarFetcherException(e);\n        } finally {\n            if (inputStream != null) {\n                try {\n                    inputStream.close();\n                } catch (IOException e) {\n                    e.printStackTrace();\n                }\n            }\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/facebook/friendimport/FacebookCalendarLoader.java",
    "content": "package com.alexstyl.specialdates.facebook.friendimport;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.net.URL;\n\nclass FacebookCalendarLoader implements CalendarLoader {\n    @Override\n    public InputStream loadFrom(URL url) throws IOException {\n        return url.openStream();\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/facebook/friendimport/FacebookContactFactory.java",
    "content": "package com.alexstyl.specialdates.facebook.friendimport;\n\nimport com.alexstyl.specialdates.Optional;\nimport com.alexstyl.specialdates.contact.Contact;\nimport com.alexstyl.specialdates.contact.DisplayName;\nimport com.alexstyl.specialdates.date.ContactEvent;\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.date.DateParseException;\nimport com.alexstyl.specialdates.events.peopleevents.StandardEventType;\nimport com.alexstyl.specialdates.facebook.FacebookImagePath;\nimport com.alexstyl.specialdates.date.DateParser;\n\nimport java.net.URI;\nimport java.util.Map;\n\nimport static com.alexstyl.specialdates.contact.ContactSource.SOURCE_FACEBOOK;\n\nclass FacebookContactFactory {\n\n    private final DateParser parser;\n\n    FacebookContactFactory(DateParser parser) {\n        this.parser = parser;\n    }\n\n    ContactEvent createContactFrom(Map<String, String> map) throws InvalidFacebookContactException {\n        try {\n            Date date = dateFrom(map);\n            DisplayName name = nameFrom(map);\n            long uid = idOf(map);\n            URI imagePath = FacebookImagePath.INSTANCE.forUid(uid);\n            return new ContactEvent(Optional.Companion.<Long>absent(), StandardEventType.BIRTHDAY, date, new Contact(uid, name, imagePath, SOURCE_FACEBOOK));\n        } catch (DateParseException | IndexOutOfBoundsException ex) {\n            throw new InvalidFacebookContactException(ex);\n        }\n    }\n\n    private Date dateFrom(Map<String, String> map) throws DateParseException {\n        String dateString = getOrThrow(map, \"DTSTART\");\n        return parser.parseWithoutYear(dateString);\n    }\n\n    private DisplayName nameFrom(Map<String, String> map) {\n        String summary = getOrThrow(map, \"SUMMARY\");\n        int endOfName = summary.indexOf(\"'s birthday\");\n        return DisplayName.Companion.from(summary.substring(0, endOfName));\n    }\n\n    private long idOf(Map<String, String> map) {\n        String uid = getOrThrow(map, \"UID\");\n        int facebookMail = uid.indexOf(\"@facebook.com\");\n        return Long.parseLong(uid.substring(1, facebookMail));\n    }\n\n    private static String getOrThrow(Map<String, String> map, String key) {\n        if (map.containsKey(key)) {\n            return map.get(key);\n        }\n        throw new IllegalArgumentException(\"Map did not contain \" + key);\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/facebook/friendimport/InvalidFacebookContactException.java",
    "content": "package com.alexstyl.specialdates.facebook.friendimport;\n\nclass InvalidFacebookContactException extends Exception {\n    InvalidFacebookContactException(Throwable cause) {\n        super(cause);\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/people/FacebookImportViewModel.kt",
    "content": "package com.alexstyl.specialdates.people\n\ndata class FacebookImportViewModel(val label: String) : PeopleRowViewModel\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/people/NoContactsViewModel.kt",
    "content": "package com.alexstyl.specialdates.people\n\nclass NoContactsViewModel : PeopleRowViewModel {\n\n    override fun equals(other: Any?): Boolean {\n        return other is NoContactsViewModel\n    }\n\n    override fun hashCode(): Int {\n        return javaClass.hashCode()\n    }\n\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/people/PeoplePresenter.kt",
    "content": "package com.alexstyl.specialdates.people\n\nimport com.alexstyl.specialdates.CrashAndErrorTracker\nimport com.alexstyl.specialdates.date.TimePeriod\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsProvider\nimport com.alexstyl.specialdates.permissions.MementoPermissions\nimport io.reactivex.Scheduler\nimport io.reactivex.disposables.Disposable\nimport io.reactivex.subjects.PublishSubject\n\nclass PeoplePresenter(\n        private val permissions: MementoPermissions,\n        private val peopleEventsProvider: PeopleEventsProvider,\n        private val viewModelFactory: PeopleViewModelFactory,\n        private val errorTracker: CrashAndErrorTracker,\n        private val workScheduler: Scheduler,\n        private val resultScheduler: Scheduler) {\n\n    companion object {\n        private const val TRIGGER = 1\n    }\n\n    private var disposable: Disposable? = null\n    private val subject = PublishSubject.create<Int>()\n\n    fun startPresentingInto(view: PeopleView) {\n        disposable =\n                subject\n                        .doOnSubscribe { _ ->\n                            view.showLoading()\n                        }\n                        .observeOn(workScheduler)\n                        .map { _ ->\n                            peopleEventsProvider.fetchEventsBetween(TimePeriod.aYearFromNow())\n                        }\n                        .map { contacts ->\n                            val viewModels = arrayListOf<PeopleRowViewModel>()\n                            val contactIDs = HashSet<Long>()\n\n                            viewModels.add(viewModelFactory.facebookViewModel())\n\n                            if (contacts.isEmpty()) {\n                                viewModels.add(viewModelFactory.noContactsViewModel())\n                            } else {\n                                val mutableList = contacts.toMutableList()\n                                mutableList.sortWith(compareBy(String.CASE_INSENSITIVE_ORDER, { it.contact.displayName.toString() }))\n                                mutableList.forEach { contactEvent ->\n                                    val contact = contactEvent.contact\n                                    if (!contactIDs.contains(contact.contactID)) {\n                                        viewModels.add(viewModelFactory.personViewModel(contact))\n                                        contactIDs.add(contact.contactID)\n                                    }\n                                }\n                            }\n                            viewModels\n                        }\n                        .observeOn(resultScheduler)\n                        .onErrorReturn { error ->\n                            errorTracker.track(error)\n                            arrayListOf()\n                        }\n                        .subscribe { viewModels ->\n                            view.displayPeople(viewModels)\n                        }\n\n        if (permissions.canReadAndWriteContacts()) {\n            refreshData()\n        }\n    }\n\n    fun refreshData() {\n        subject.onNext(TRIGGER)\n    }\n\n    fun stopPresenting() {\n        disposable?.dispose()\n    }\n}\n\n\n\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/people/PeopleRowViewModel.kt",
    "content": "package com.alexstyl.specialdates.people\n\ninterface PeopleRowViewModel\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/people/PeopleView.java",
    "content": "package com.alexstyl.specialdates.people;\n\nimport java.util.List;\n\npublic interface PeopleView {\n    void displayPeople(List<PeopleRowViewModel> viewModels);\n\n    void showLoading();\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/people/PeopleViewHolderListener.java",
    "content": "package com.alexstyl.specialdates.people;\n\nimport com.alexstyl.specialdates.contact.Contact;\n\npublic interface PeopleViewHolderListener {\n    void onPersonClicked(Contact contact);\n\n    void onFacebookImport();\n\n    void onAddContactClicked();\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/people/PeopleViewModelFactory.kt",
    "content": "package com.alexstyl.specialdates.people\n\nimport com.alexstyl.specialdates.Strings\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.facebook.FacebookUserSettings\n\nclass PeopleViewModelFactory(private val strings: Strings, private val facebookPreferences: FacebookUserSettings) {\n\n    fun facebookViewModel(): PeopleRowViewModel {\n        return if (facebookPreferences.isLoggedIn) {\n            FacebookImportViewModel(strings.viewFacebookProfile())\n        } else {\n            FacebookImportViewModel(strings.importFromFacebook())\n        }\n    }\n\n    fun noContactsViewModel(): PeopleRowViewModel {\n        return NoContactsViewModel()\n    }\n\n\n    fun personViewModel(contact: Contact): PeopleRowViewModel = PersonViewModel(\n            contact,\n            contact.displayName.toString(),\n            contact.imagePath,\n            contact.contactID,\n            contact.source)\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/people/PersonViewModel.kt",
    "content": "package com.alexstyl.specialdates.people\n\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.contact.ContactSource\nimport java.net.URI\n\n\ndata class PersonViewModel(val contact: Contact,\n                           val personName: String,\n                           val avatarURI: URI,\n                           val personId: Long,\n                           @ContactSource val personSource: Int) : PeopleRowViewModel\n\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/permissions/MementoPermissions.kt",
    "content": "package com.alexstyl.specialdates.permissions\n\n\ninterface MementoPermissions {\n    fun canReadAndWriteContacts(): Boolean\n    fun canReadContacts(): Boolean\n    fun canReadExternalStorage(): Boolean\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/person/AgeCalculator.kt",
    "content": "package com.alexstyl.specialdates.person\n\nimport com.alexstyl.specialdates.date.Date\n\nclass AgeCalculator(private val today: Date) {\n    fun ageOf(dateOfBirth: Date): String {\n        if (dateOfBirth.hasNoYear()) {\n            // we cannot tell the age unless we know the year of birth\n            return \"\"\n        }\n\n        val age: Int\n        if (dateOfBirth.month > today.month || dateOfBirth.dayOfMonth > today.dayOfMonth) {\n            age = yearsAfter(dateOfBirth) - 1\n        } else {\n            age = yearsAfter(dateOfBirth)\n        }\n        if (age <= 0) {\n            return \"\"\n        }\n        return age.toString()\n    }\n\n    private fun yearsAfter(dateOfBirth: Date) = today.year - dateOfBirth.year\n\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/person/ContactActions.kt",
    "content": "package com.alexstyl.specialdates.person\n\nimport java.net.URI\n\ninterface ContactActions {\n    fun dial(phoneNumber: String): () -> Unit\n    fun view(data: URI, mimetype: String): () -> Unit\n    fun view(data: URI): () -> Unit\n    fun message(phoneNumber: String): () -> Unit\n    fun email(emailAdress: String): () -> Unit\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/person/ContactEventViewModel.kt",
    "content": "package com.alexstyl.specialdates.person\n\nimport com.alexstyl.specialdates.date.Date\n\ndata class ContactEventViewModel(val evenName: String, val dateLabel: String, val date: Date) : PersonDetailItem {\n    override val value: String\n        get() = dateLabel\n    override val label: String\n        get() = evenName\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/person/EventViewModelFactory.kt",
    "content": "package com.alexstyl.specialdates.person\n\nimport com.alexstyl.specialdates.Strings\nimport com.alexstyl.specialdates.date.ContactEvent\nimport com.alexstyl.specialdates.date.DateLabelCreator\n\nclass EventViewModelFactory(private val strings: Strings, private val dateLabelCreator: DateLabelCreator) {\n\n    operator fun invoke(events: List<ContactEvent>): List<ContactEventViewModel> {\n        val viewModels = ArrayList<ContactEventViewModel>(events.size)\n        events.forEach {\n            val eventName = it.type.getEventName(strings)\n            val date = it.date\n            val dateLabel = dateLabelCreator.createWithYearPreferred(date)\n            viewModels.add(ContactEventViewModel(eventName, dateLabel, date))\n        }\n        return viewModels\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/person/PersonDetailItem.kt",
    "content": "package com.alexstyl.specialdates.person\n\ninterface PersonDetailItem {\n    val value:String\n    val label:String\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/person/StarSign.kt",
    "content": "package com.alexstyl.specialdates.person\n\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.Date.Companion.on\nimport com.alexstyl.specialdates.date.Months.APRIL\nimport com.alexstyl.specialdates.date.Months.AUGUST\nimport com.alexstyl.specialdates.date.Months.DECEMBER\nimport com.alexstyl.specialdates.date.Months.FEBRUARY\nimport com.alexstyl.specialdates.date.Months.JANUARY\nimport com.alexstyl.specialdates.date.Months.JULY\nimport com.alexstyl.specialdates.date.Months.JUNE\nimport com.alexstyl.specialdates.date.Months.MARCH\nimport com.alexstyl.specialdates.date.Months.MAY\nimport com.alexstyl.specialdates.date.Months.NOVEMBER\nimport com.alexstyl.specialdates.date.Months.OCTOBER\nimport com.alexstyl.specialdates.date.Months.SEPTEMBER\n\nenum class StarSign(val emoji: String, val from: Date, val to: Date) {\n    AQUARIUS(\"\\u2652\", on(20, JANUARY), on(18, FEBRUARY)),\n    PISCES(\"\\u2653\", on(19, FEBRUARY), on(20, MARCH)),\n    ARIES(\"\\u2648\", on(21, MARCH), on(19, APRIL)),\n    TAURUS(\"\\u2649\", on(20, APRIL), on(20, MAY)),\n    GEMINI(\"\\u264a\", on(21, MAY), on(20, JUNE)),\n    CANCER(\"\\u264b\", on(21, JUNE), on(22, JULY)),\n    LEO(\"\\u264c\", on(23, JULY), on(22, AUGUST)),\n    VIRGO(\"\\u264d\", on(23, AUGUST), on(22, SEPTEMBER)),\n    LIBRA(\"\\u264e\", on(23, SEPTEMBER), on(22, OCTOBER)),\n    SCORPIO(\"\\u264f\", on(23, OCTOBER), on(21, NOVEMBER)),\n    SAGITTARIUS(\"\\u2650\", on(22, NOVEMBER), on(21, DECEMBER)),\n    CAPRICORN(\"\\u2651\", on(22, DECEMBER), on(19, JANUARY));\n\n    companion object {\n        fun forDateOfBirth(birthday: Date): StarSign {\n            enumValues<StarSign>().forEach {\n                if (birthday.startingDateOf(it) || birthday.endingDateOf(it)) {\n                    return it\n                }\n            }\n            throw IllegalStateException(\"Couldn't find starSign for \" + birthday)\n        }\n    }\n}\n\nprivate fun Date.startingDateOf(startSign: StarSign) = this.month == startSign.from.month && this.dayOfMonth >= startSign.from.dayOfMonth\n\nprivate fun Date.endingDateOf(startSign: StarSign) = this.month == startSign.to.month && this.dayOfMonth <= startSign.to.dayOfMonth\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/search/ContactEventLabelCreator.kt",
    "content": "package com.alexstyl.specialdates.search\n\nimport com.alexstyl.specialdates.Strings\nimport com.alexstyl.specialdates.date.ContactEvent\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.DateLabelCreator\n\nclass ContactEventLabelCreator(private val today: Date, private val strings: Strings, private val dateLabelCreator: DateLabelCreator) {\n\n    fun createFor(event: ContactEvent): String {\n        val eventLabel = event.getLabel(today, strings)\n        val dateLabel = dateLabelCreator.createLabelWithoutYear(event.date)\n        return strings.eventOnDate(eventLabel, dateLabel)\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/search/ContactWithEvents.java",
    "content": "package com.alexstyl.specialdates.search;\n\nimport com.alexstyl.specialdates.Optional;\nimport com.alexstyl.specialdates.contact.Contact;\nimport com.alexstyl.specialdates.date.ContactEvent;\nimport com.alexstyl.specialdates.events.peopleevents.StandardEventType;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nfinal class ContactWithEvents {\n\n    private static final Optional<ContactEvent> NO_EVENT = Optional.Companion.absent();\n\n    private final Contact contact;\n    private final List<ContactEvent> events;\n\n    ContactWithEvents(Contact contact, List<ContactEvent> events) {\n        this.contact = contact;\n        this.events = events;\n    }\n\n    ContactWithEvents(Contact contact, ContactEvent event) {\n        this.contact = contact;\n        this.events = new ArrayList<>();\n        this.events.add(event);\n    }\n\n    public Contact getContact() {\n        return contact;\n    }\n\n    public List<ContactEvent> getEvents() {\n        return events;\n    }\n\n    Optional<ContactEvent> getBirthday() {\n        for (ContactEvent event : events) {\n            if (event.getType() == StandardEventType.BIRTHDAY) {\n                return new Optional<>(event);\n            }\n        }\n        return NO_EVENT;\n    }\n\n    public List<ContactEvent> getNamedays() {\n        List<ContactEvent> contactEvents = new ArrayList<>();\n        for (ContactEvent event : events) {\n            if (event.getType() == StandardEventType.NAMEDAY) {\n                contactEvents.add(event);\n            }\n        }\n        return contactEvents;\n    }\n\n    @Override\n    public boolean equals(Object o) {\n        if (this == o) {\n            return true;\n        }\n        if (o == null || getClass() != o.getClass()) {\n            return false;\n        }\n\n        ContactWithEvents that = (ContactWithEvents) o;\n\n        if (!contact.equals(that.contact)) {\n            return false;\n        }\n        return events.equals(that.events);\n\n    }\n\n    @Override\n    public int hashCode() {\n        int result = contact.hashCode();\n        result = 31 * result + events.hashCode();\n        return result;\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/search/NameFilter.java",
    "content": "package com.alexstyl.specialdates.search;\n\nimport com.alexstyl.specialdates.WordComparator;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nfinal class NameFilter {\n\n    private static final int NAME_THREASHOLD = 5;\n\n    private final WordComparator comparator;\n\n    private final List<String> allNames;\n\n    NameFilter(List<String> allNames, WordComparator comparator) {\n        this.allNames = allNames;\n        this.comparator = comparator;\n    }\n\n    List<String> performFiltering(CharSequence constraint) {\n        List<String> names = new ArrayList<>();\n        if (constraint.length() > 0) {\n            int constraintLength = constraint.length();\n            String typedName = constraint.toString();\n            for (String existingName : allNames) {\n                int nameLength = existingName.length();\n                if (nameLength < constraintLength) {\n                    continue;\n                } else if (nameLength == constraintLength) {\n                    if (comparator.compare(typedName, existingName)) {\n                        // skip the existingName if the user has already typed it in\n                        names.add(existingName);\n                    }\n                } else if (comparator.compareUpToPoint(existingName, typedName, constraintLength)) {\n                    names.add(existingName);\n                }\n                if (names.size() == NAME_THREASHOLD) {\n                    break;\n                }\n            }\n\n        }\n        return names;\n    }\n\n    List<String> getAllNames() {\n        return allNames;\n    }\n\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/search/NameMatcher.kt",
    "content": "package com.alexstyl.specialdates.search\n\nimport com.alexstyl.specialdates.contact.DisplayName\nimport java.text.Collator\nimport java.util.Locale\n\nenum class NameMatcher {\n    INSTANCE;\n\n    private val collator: Collator = Collator.getInstance(Locale.getDefault())\n\n    init {\n        collator.strength = Collator.PRIMARY\n    }\n\n    fun match(displayName: DisplayName, searchQuery: String): Boolean {\n        return oneOfTheNamesMatchesQuery(displayName, searchQuery) || searchQueryIsPartOfFullName(displayName, searchQuery)\n    }\n\n    private fun searchQueryIsPartOfFullName(displayName: DisplayName, searchQuery: String): Boolean {\n        val fullDisplayName = displayName.toString()\n        val partOfName = substring(fullDisplayName, searchQuery.length)\n\n        return areEqual(partOfName, searchQuery)\n    }\n\n    private fun substring(string: String, length: Int): String {\n        return if (string.length <= length) {\n            string\n        } else string.substring(0, length)\n    }\n\n    private fun oneOfTheNamesMatchesQuery(displayName: DisplayName, searchQuery: String): Boolean {\n        val searchQueryLength = searchQuery.length\n        val allNames = displayName.firstNames\n        for (firstName in allNames) {\n            val worthCheckingPart = substring(firstName, searchQueryLength)\n            if (areEqual(searchQuery, worthCheckingPart)) {\n                return true\n            }\n        }\n\n        return checkIfLastNameMatches(displayName, searchQuery)\n    }\n\n    private fun checkIfLastNameMatches(displayName: DisplayName, searchQuery: String): Boolean {\n        val lastName = displayName.lastName\n        val searchQueryLength = searchQuery.length\n        val worthCheckingPart = substring(lastName, searchQueryLength)\n        return areEqual(worthCheckingPart, searchQuery)\n    }\n\n    private fun areEqual(displayName: String, worthCheckingPart: String): Boolean {\n        return !(displayName.isEmpty() || worthCheckingPart.isEmpty()) && collator.compare(worthCheckingPart, displayName) == 0\n    }\n\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/search/PeopleEventsSearch.java",
    "content": "package com.alexstyl.specialdates.search;\n\nimport com.alexstyl.specialdates.contact.Contact;\nimport com.alexstyl.specialdates.date.ContactEvent;\nimport com.alexstyl.specialdates.date.TimePeriod;\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsProvider;\nimport com.alexstyl.specialdates.util.HashMapList;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nfinal class PeopleEventsSearch {\n\n    private final NameMatcher nameMatcher;\n    private final PeopleEventsProvider peopleEventsProvider;\n\n    PeopleEventsSearch(PeopleEventsProvider peopleEventsProvider, NameMatcher nameMatcher) {\n        this.peopleEventsProvider = peopleEventsProvider;\n        this.nameMatcher = nameMatcher;\n    }\n\n    List<ContactWithEvents> searchForContacts(String searchQuery, int counter) {\n        if (counter <= 0) {\n            return new ArrayList<>();\n        }\n\n        searchQuery = searchQuery.trim();\n        HashMapList<Contact, ContactEvent> events = new HashMapList<>();\n        TimePeriod between = TimePeriod.Companion.aYearFromNow();\n        List<ContactEvent> contactEventsOnDate = peopleEventsProvider.fetchEventsBetween(between);\n        int size = 0;\n        for (ContactEvent contactEvent : contactEventsOnDate) {\n            Contact contact = contactEvent.getContact();\n            if (nameMatcher.match(contact.getDisplayName(), searchQuery)) {\n                events.addValue(contact, contactEvent);\n                size++;\n            }\n            if (size >= counter) {\n                break;\n            }\n        }\n\n        List<ContactWithEvents> contactWithEvents = new ArrayList<>();\n        for (Contact contact : events.keys()) {\n            List<ContactEvent> list = events.get(contact);\n            contactWithEvents.add(new ContactWithEvents(contact, list));\n        }\n        return contactWithEvents;\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/ui/widget/LetterPainter.kt",
    "content": "package com.alexstyl.specialdates.ui.widget\n\nimport android.support.annotation.ColorInt\n\ninterface LetterPainter {\n    @ColorInt\n    fun getVariant(i2: Int): Int\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/upcoming/AnnualDate.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\nimport com.alexstyl.specialdates.date.MonthInt\n\ndata class AnnualDate(val dayOfMonth: Int, @param:MonthInt val month: Int)\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/upcoming/BankHolidayViewModel.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\ndata class BankHolidayViewModel(val bankHolidayName: String) : UpcomingRowViewModel {\n    override val viewType: Int\n        get() = UpcomingRowViewType.BANKHOLIDAY\n    override val id: Long\n        get() = bankHolidayName.hashCode().toLong()\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/upcoming/CompositeUpcomingEventsProvider.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\nimport com.alexstyl.specialdates.date.DateComparator\nimport com.alexstyl.specialdates.date.TimePeriod\nimport com.alexstyl.specialdates.events.bankholidays.BankHolidayProvider\nimport com.alexstyl.specialdates.events.bankholidays.BankHolidaysUserSettings\nimport com.alexstyl.specialdates.events.namedays.NamedayUserSettings\nimport com.alexstyl.specialdates.events.namedays.NamesInADate\nimport com.alexstyl.specialdates.events.namedays.calendar.resource.NamedayCalendarProvider\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsProvider\n\nclass CompositeUpcomingEventsProvider(private val peopleEventsProvider: PeopleEventsProvider,\n                                      private val namedayPreferences: NamedayUserSettings,\n                                      private val namedayCalendarProvider: NamedayCalendarProvider,\n                                      private val bankHolidaysUserSettings: BankHolidaysUserSettings,\n                                      private val bankHolidayProvider: BankHolidayProvider,\n                                      private val upcomingRowViewModelFactory: UpcomingEventRowViewModelFactory) : UpcomingEventsProvider {\n\n    override fun calculateEventsBetween(timePeriod: TimePeriod): List<UpcomingRowViewModel> {\n        val contactEvents = peopleEventsProvider.fetchEventsBetween(timePeriod)\n        val upcomingRowViewModelsBuilder = UpcomingRowViewModelsBuilder(\n                timePeriod,\n                upcomingRowViewModelFactory\n        )\n                .withContactEvents(contactEvents)\n\n        if (shouldLoadBankHolidays()) {\n            val bankHolidays = bankHolidayProvider.calculateBankHolidaysBetween(timePeriod)\n            upcomingRowViewModelsBuilder.withBankHolidays(bankHolidays)\n        }\n\n        if (shouldLoadNamedays()) {\n            val namedays = calculateNamedaysBetween(timePeriod)\n            upcomingRowViewModelsBuilder.withNamedays(namedays)\n        }\n        return upcomingRowViewModelsBuilder.build()\n    }\n\n    private fun calculateNamedaysBetween(timeDuration: TimePeriod): List<NamesInADate> {\n        val selectedLanguage = namedayPreferences.selectedLanguage\n        val namedayCalendar = namedayCalendarProvider.loadNamedayCalendarForLocale(selectedLanguage, timeDuration.startingDate.year)\n\n        var indexDate = timeDuration.startingDate\n        val toDate = timeDuration.endingDate\n        val namedays = ArrayList<NamesInADate>()\n\n        while (COMPARATOR.compare(indexDate, toDate) < 0) {\n            val allNamedayOn = namedayCalendar.getAllNamedaysOn(indexDate)\n            if (allNamedayOn.nameCount() > 0) {\n                namedays.add(allNamedayOn)\n            }\n            indexDate = indexDate.addDay(1)\n        }\n        return namedays\n    }\n\n    private fun shouldLoadBankHolidays(): Boolean {\n        return bankHolidaysUserSettings.isEnabled\n    }\n\n    private fun shouldLoadNamedays(): Boolean {\n        return namedayPreferences.isEnabled && !namedayPreferences.isEnabledForContactsOnly\n    }\n\n    companion object {\n        private val COMPARATOR = DateComparator.INSTANCE\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/upcoming/ContactViewModelFactory.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\nimport com.alexstyl.resources.Colors\nimport com.alexstyl.specialdates.Strings\nimport com.alexstyl.specialdates.date.ContactEvent\nimport com.alexstyl.specialdates.date.Date\n\nclass ContactViewModelFactory(private val colors: Colors, private val strings: Strings) {\n\n    internal fun createViewModelFor(date: Date, contactEvent: ContactEvent): UpcomingContactEventViewModel {\n        val contact = contactEvent.contact\n        return UpcomingContactEventViewModel(\n                contact,\n                contact.displayName.toString(),\n                contactEvent.getLabel(date, strings),\n                colors.getColorFor(contactEvent.type),\n                contact.contactID.toInt(),\n                contact.imagePath\n        )\n    }\n\n\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/upcoming/DateHeaderViewModel.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\nimport android.support.annotation.ColorInt\n\ndata class DateHeaderViewModel(val date: String, @ColorInt val titleColor: Int) : UpcomingRowViewModel {\n\n    override val viewType: Int\n        get() = UpcomingRowViewType.DATE_HEADER\n\n    override val id: Long\n        get() = date.hashCode().toLong()\n\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/upcoming/MonthLabels.java",
    "content": "package com.alexstyl.specialdates.upcoming;\n\nimport com.alexstyl.specialdates.date.MonthInt;\n\nimport java.text.DateFormatSymbols;\nimport java.util.Arrays;\nimport java.util.Locale;\n\npublic class MonthLabels {\n\n    private final String[] monthLabels;\n\n    public static MonthLabels forLocale(Locale locale) {\n        DateFormatSymbols dateFormatSymbols = DateFormatSymbols.getInstance(locale);\n        String[] labels = dateFormatSymbols.getMonths();\n        return new MonthLabels(labels);\n    }\n\n    MonthLabels(String[] monthLabels) {\n        this.monthLabels = monthLabels;\n    }\n\n    public String getMonthOfYear(@MonthInt int monthPosition) {\n        return monthLabels[monthPosition - 1];\n    }\n\n    public String[] getMonthsOfYear() {\n        return Arrays.copyOf(monthLabels, monthLabels.length);\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/upcoming/UpcomingContactEventViewModel.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\nimport android.support.annotation.ColorInt\n\nimport com.alexstyl.specialdates.contact.Contact\n\nimport java.net.URI\n\ndata class UpcomingContactEventViewModel(val contact: Contact,\n                                         val contactName: String,\n                                         val eventLabel: String,\n                                         @param:ColorInt val eventColor: Int,\n                                         val backgroundVariant: Int,\n                                         val contactImagePath: URI) : UpcomingRowViewModel {\n    override val viewType: Int\n        get() = UpcomingRowViewType.CONTACT_EVENT\n    override val id: Long\n        get() = contact.contactID\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/upcoming/UpcomingDateStringCreator.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\nimport com.alexstyl.specialdates.date.Date\n\ninterface UpcomingDateStringCreator {\n    fun createLabelFor(date: Date): String\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/upcoming/UpcomingEventRowViewModelFactory.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\nimport com.alexstyl.resources.Colors\nimport com.alexstyl.specialdates.date.ContactEvent\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.events.bankholidays.BankHoliday\nimport com.alexstyl.specialdates.events.namedays.NamesInADate\n\nclass UpcomingEventRowViewModelFactory(private val today: Date,\n                                       private val colors: Colors,\n                                       private val dateCreator: UpcomingDateStringCreator,\n                                       private val contactViewModelFactory: ContactViewModelFactory) {\n\n    fun createDateHeader(date: Date): UpcomingRowViewModel {\n        val label = dateCreator.createLabelFor(date)\n        return DateHeaderViewModel(label, colorFor(date))\n    }\n\n    private fun colorFor(date: Date): Int {\n        return if (date == today) {\n            colors.getTodayHeaderTextColor()\n        } else {\n            colors.getDateHeaderTextColor()\n        }\n    }\n\n    fun createViewModelFor(contactEvent: ContactEvent): UpcomingRowViewModel = contactViewModelFactory.createViewModelFor(today, contactEvent)\n\n    fun createViewModelFor(bankHoliday: BankHoliday): UpcomingRowViewModel = BankHolidayViewModel(bankHoliday.holidayName)\n\n    fun createViewModelFor(namedays: NamesInADate): UpcomingRowViewModel = UpcomingNamedaysViewModel(namedays.getNames().joinToString(\", \"), namedays.date)\n\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/upcoming/UpcomingEventsAdRules.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\ninterface UpcomingEventsAdRules {\n    fun shouldAppendAd(): Boolean\n    fun onNewAdAdded()\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/upcoming/UpcomingEventsFreeUserAdRules.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\nclass UpcomingEventsFreeUserAdRules : UpcomingEventsAdRules {\n\n    private var adAdded: Boolean = false\n\n    override fun shouldAppendAd(): Boolean {\n        return !this.adAdded\n    }\n\n    override fun onNewAdAdded() {\n        this.adAdded = true\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/upcoming/UpcomingEventsPresenter.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.TimePeriod\nimport com.alexstyl.specialdates.permissions.MementoPermissions\nimport io.reactivex.Scheduler\nimport io.reactivex.disposables.Disposable\nimport io.reactivex.subjects.PublishSubject\n\nclass UpcomingEventsPresenter(private val firstDay: Date,\n                              private val permissions: MementoPermissions,\n                              private val providerUpcoming: UpcomingEventsProvider,\n                              private val workScheduler: Scheduler,\n                              private val resultScheduler: Scheduler) {\n\n    companion object {\n        private const val TRIGGER = 1\n    }\n\n    private val subject = PublishSubject.create<Int>()\n    private var disposable: Disposable? = null\n\n    fun startPresentingInto(view: UpcomingListMVPView) {\n        disposable =\n                subject\n                        .doOnSubscribe { _ ->\n                            if (view.isShowingNoEvents) {\n                                view.showLoading()\n                            }\n                        }\n                        .observeOn(workScheduler)\n                        .map { _ ->\n                            val timePeriod = TimePeriod.aYearFrom(firstDay)\n                            providerUpcoming.calculateEventsBetween(timePeriod)\n                        }\n                        .observeOn(resultScheduler)\n                        .onErrorReturn { error ->\n                            error.printStackTrace()\n                            emptyList()\n                        }\n                        .subscribe { upcomingRowViewModels ->\n                            view.display(upcomingRowViewModels)\n                        }\n        if (permissions.canReadAndWriteContacts()) {\n            refreshEvents()\n        }\n    }\n\n\n    fun refreshEvents() {\n        subject.onNext(TRIGGER)\n    }\n\n    fun stopPresenting() {\n        disposable?.dispose()\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/upcoming/UpcomingEventsProvider.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\nimport com.alexstyl.specialdates.date.TimePeriod\n\ninterface UpcomingEventsProvider {\n    fun calculateEventsBetween(timePeriod: TimePeriod): List<UpcomingRowViewModel>\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/upcoming/UpcomingListMVPView.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\ninterface UpcomingListMVPView {\n\n    val isShowingNoEvents: Boolean\n    fun showLoading()\n    fun display(events: List<UpcomingRowViewModel>)\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/upcoming/UpcomingNamedaysViewModel.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\nimport com.alexstyl.specialdates.date.Date\n\ndata class UpcomingNamedaysViewModel(val namesLabel: String, val date: Date) : UpcomingRowViewModel {\n\n    override val viewType: Int\n        get() = UpcomingRowViewType.NAMEDAY_CARD\n\n    override val id: Long\n        get() = namesLabel.hashCode().toLong()\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/upcoming/UpcomingRowViewModel.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\ninterface UpcomingRowViewModel {\n\n    @get:UpcomingRowViewType\n    val viewType: Int\n\n    val id: Long\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/upcoming/UpcomingRowViewModelsBuilder.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\nimport com.alexstyl.specialdates.date.ContactEvent\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.DateComparator\nimport com.alexstyl.specialdates.date.TimePeriod\nimport com.alexstyl.specialdates.events.bankholidays.BankHoliday\nimport com.alexstyl.specialdates.events.namedays.NamesInADate\nimport com.alexstyl.specialdates.util.HashMapList\n\nclass UpcomingRowViewModelsBuilder(private val duration: TimePeriod,\n                                   private val viewModelFactory: UpcomingEventRowViewModelFactory) {\n\n    private val dateComparator = DateComparator.INSTANCE\n    private val contactEvents = HashMapList<AnnualDate, ContactEvent>()\n    private val namedays = HashMap<AnnualDate, NamesInADate>()\n    private val bankHolidays = HashMap<AnnualDate, BankHoliday>()\n\n    fun withContactEvents(contactEvents: List<ContactEvent>): UpcomingRowViewModelsBuilder {\n        this.contactEvents.clear()\n        for (contactEvent in contactEvents) {\n            val annualDate = contactEvent.date.toAnnualDate()\n            this.contactEvents.addValue(annualDate, contactEvent)\n        }\n        return this\n    }\n\n    fun withNamedays(namedays: List<NamesInADate>): UpcomingRowViewModelsBuilder {\n        this.namedays.clear()\n        for (nameday in namedays) {\n            val date = nameday.date\n            this.namedays.put(date.toAnnualDate(), nameday)\n        }\n        return this\n    }\n\n    fun withBankHolidays(bankHolidays: List<BankHoliday>): UpcomingRowViewModelsBuilder {\n        this.bankHolidays.clear()\n        for (bankHoliday in bankHolidays) {\n            val date = bankHoliday.date\n            this.bankHolidays.put(date.toAnnualDate(), bankHoliday)\n        }\n        return this\n    }\n\n    fun build(): List<UpcomingRowViewModel> {\n        if (noEventsArePresent()) {\n            return NO_CELEBRATIONS\n        }\n\n        val rowsViewModels = ArrayList<UpcomingRowViewModel>()\n        var indexDate = duration.startingDate\n        val lastDate = duration.endingDate\n\n        var index = 0\n        while (dateComparator.compare(indexDate, lastDate) <= 0) {\n            val annualDate = indexDate.toAnnualDate()\n            if (containsAnyEventsOn(annualDate)) {\n\n                rowsViewModels.add(viewModelFactory.createDateHeader(indexDate))\n\n                if (bankHolidays[annualDate] != null) {\n                    rowsViewModels.add(viewModelFactory.createViewModelFor(bankHolidays[annualDate]!!))\n                }\n                if (namedays[annualDate] != null) {\n                    rowsViewModels.add(viewModelFactory.createViewModelFor(namedays[annualDate]!!))\n                }\n                getPeopleEventsOn(annualDate).forEach {\n                    rowsViewModels.add(viewModelFactory.createViewModelFor(it))\n                }\n                index++\n            }\n            indexDate = indexDate.addDay(1)\n        }\n        return rowsViewModels\n    }\n\n    private fun getPeopleEventsOn(indexDate: AnnualDate): List<ContactEvent> {\n        val contactEvent = contactEvents.get(indexDate)\n        if (contactEvent == null) {\n            return NO_CONTACT_EVENTS\n        } else {\n            return contactEvent\n        }\n    }\n\n    private fun noEventsArePresent(): Boolean = contactEvents.isEmpty && namedays.isEmpty() && bankHolidays.isEmpty()\n\n    private fun containsAnyEventsOn(date: AnnualDate): Boolean =\n            getPeopleEventsOn(date).isNotEmpty() || namedays.containsKey(date) || bankHolidays.containsKey(date)\n\n    companion object {\n\n        private val NO_CELEBRATIONS = emptyList<UpcomingRowViewModel>()\n        private val NO_CONTACT_EVENTS = emptyList<ContactEvent>()\n    }\n}\n\nprivate fun Date.toAnnualDate(): AnnualDate = AnnualDate(this.dayOfMonth, this.month)\n\n\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/upcoming/UpcomingRowViewType.java",
    "content": "package com.alexstyl.specialdates.upcoming;\n\nimport android.support.annotation.IntDef;\n\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\n\nimport static com.alexstyl.specialdates.upcoming.UpcomingRowViewType.*;\n\n@Retention(RetentionPolicy.SOURCE)\n@IntDef({\n        DATE_HEADER,\n        BANKHOLIDAY,\n        NAMEDAY_CARD,\n        CONTACT_EVENT\n})\npublic @interface UpcomingRowViewType {\n    int DATE_HEADER = 0;\n    int BANKHOLIDAY = 1;\n    int NAMEDAY_CARD = 2;\n    int CONTACT_EVENT = 3;\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/upcoming/widget/list/NoAds.kt",
    "content": "package com.alexstyl.specialdates.upcoming.widget.list\n\nimport com.alexstyl.specialdates.upcoming.UpcomingEventsAdRules\n\nclass NoAds : UpcomingEventsAdRules {\n\n    override fun shouldAppendAd(): Boolean {\n        return false\n    }\n\n    override fun onNewAdAdded() {\n        // do nothing\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/upcoming/widget/today/PercentToValueConverter.java",
    "content": "package com.alexstyl.specialdates.upcoming.widget.today;\n\nfinal class PercentToValueConverter {\n\n    private static final float STEP = 0.25f;\n    \n    float progressToPercent(int progress) {\n        return progress * STEP;\n    }\n\n    int percentToProgress(float percentage) {\n        return (int) (percentage / STEP);\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/upcoming/widget/today/RecentPeopleEventsPresenter.kt",
    "content": "package com.alexstyl.specialdates.upcoming.widget.today\n\nimport com.alexstyl.specialdates.Optional\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsProvider\nimport com.alexstyl.specialdates.permissions.MementoPermissions\nimport io.reactivex.Observable\nimport io.reactivex.Scheduler\nimport io.reactivex.disposables.Disposable\n\nclass RecentPeopleEventsPresenter(private val eventsProvider: PeopleEventsProvider,\n                                  private val permissions: MementoPermissions,\n                                  private val workScheduler: Scheduler,\n                                  private val resultScheduler: Scheduler) {\n\n    private var disposable: Disposable? = null\n\n    fun startPresentingInto(view: RecentPeopleEventsView) {\n        if (permissions.canReadContacts()) {\n            disposable =\n                    Observable.fromCallable {\n                        val today = Date.today()\n                        val date = eventsProvider.findClosestEventDateOnOrAfter(today)\n                        if (date != null) {\n                            val contactEventsOnADate = eventsProvider.fetchEventsOn(date)\n                            Optional(contactEventsOnADate)\n                        } else {\n                            Optional.absent()\n                        }\n                    }\n                            .subscribeOn(workScheduler)\n                            .observeOn(resultScheduler)\n                            .subscribe { viewModels ->\n                                if (viewModels.isPresent) {\n                                    view.onNextDateLoaded(viewModels.get())\n                                } else {\n                                    view.onNoEventsFound()\n                                }\n                            }\n        } else {\n            view.askForContactPermission()\n        }\n    }\n\n    fun stopPresenting() {\n        disposable?.dispose()\n    }\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/upcoming/widget/today/RecentPeopleEventsView.kt",
    "content": "package com.alexstyl.specialdates.upcoming.widget.today\n\nimport com.alexstyl.specialdates.events.peopleevents.ContactEventsOnADate\n\ninterface RecentPeopleEventsView {\n    fun onNextDateLoaded(events: ContactEventsOnADate)\n    fun onNoEventsFound()\n    fun askForContactPermission()\n}\n"
  },
  {
    "path": "memento/src/main/java/com/alexstyl/specialdates/util/HashMapList.kt",
    "content": "package com.alexstyl.specialdates.util\n\nclass HashMapList<K, V> {\n\n    private val map = HashMap<K, MutableList<V>>()\n\n    fun addValue(key: K, value: V): Boolean {\n        if (!map.containsKey(key)) {\n            map.put(key, ArrayList())\n        }\n        return map[key]!!.add(value)\n    }\n\n    operator fun get(key: K): List<V>? = map[key]\n\n    val isEmpty: Boolean\n        get() = map.isEmpty()\n\n    fun keys(): Set<K> = map.keys\n\n    fun clear() {\n        map.clear()\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/TestColors.kt",
    "content": "package com.alexstyl\n\nimport com.alexstyl.resources.Colors\nimport com.alexstyl.specialdates.events.peopleevents.EventType\n\nclass TestColors : Colors {\n    override fun getColorFor(eventType: EventType): Int = eventType.id\n    override fun getTodayHeaderTextColor(): Int = 0\n\n    override fun getDateHeaderTextColor(): Int = 1\n\n    override fun getDailyReminderColor(): Int = 2\n\n    override fun getNamedaysColor(): Int = 3\n\n    override fun getBankholidaysColor(): Int = 4\n\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/gsc/SoundComparerTest.kt",
    "content": "package com.alexstyl.gsc\n\nimport org.junit.Assert\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.runners.MockitoJUnitRunner\n\n@RunWith(MockitoJUnitRunner::class)\nclass SoundComparerTest {\n\n    @Test\n    fun soundTheSame() {\n        Assert.assertTrue(SoundComparer.soundTheSame(\"Αθήνα\", \"athina\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"Αθήνα\", \"athina\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"τζιτσαγκά\", \"jitsaga\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"Αθήνα\", \"Athena\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"Gilgames G\", \"Γκιλγγαμες Γ\"))\n\n        Assert.assertTrue(SoundComparer.soundTheSame(\"\", \"\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"  \", \"  \"))\n        Assert.assertFalse(SoundComparer.soundTheSame(\"Αθήνα\", \"\"))\n        Assert.assertFalse(SoundComparer.soundTheSame(\"\", \"AAAAA\"))\n\n        Assert.assertTrue(SoundComparer.soundTheSame(\"Yiannis\", \"Giannis\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"ΕΛΕΟΣ\", \"ELEOC\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"ΕΛΕΟΣ\", \"eLe0C\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"apistefto\", \"απίστευτο\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"sistima\", \"σύστημα\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"einai\", \"είναι\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"pragmatikotita\", \"πραγματικότητα\"))\n\n        Assert.assertTrue(SoundComparer.soundTheSame(\"ThaBo\", \"θάμπό\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"Eytih0s\", \"Ευτηχώς\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"Tha Pho Anthrwpoi PSOMY\", \"ΘΑ ΦΩ ΑΝΘΡΩΠΟΙ ΨΩΜΙ\"))\n\n        Assert.assertTrue(SoundComparer.soundTheSame(\"Ayto\", \"Άυτό\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"Auto\", \"Αυτό\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"Afto\", \"Αυτό\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"Ayti\", \"Αφτί\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"KSIFIAS\", \"XIPHIAS\"))\n\n        Assert.assertTrue(SoundComparer.soundTheSame(\"έχω\", \"exw\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"έξω\", \"exw\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"έχω\", \"exw\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"έχω\", \"ehw\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"έχω\", \"eho\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"έχω\", \"exo\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"exo\", \"eHo\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"Έχω\", \"Εxo\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"έχο\", \"eh0\"))\n\n        Assert.assertTrue(SoundComparer.soundTheSame(\"Αθήνα\", \"a8ina\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"Αθήνα\", \"a9ina\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"Αthήνα\", \"a9ina\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"Γιώργος\", \"Giorgos\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"Γιώργος\", \"giorgος\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"Γιώργος\", \"Giwrgos\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"Αλέξανδρος\", \"Aleksandros\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"Αλέξανδρος\", \"Alexandros\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"Αγγέλα\", \"Aggela\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"Αγγέλα\", \"Agela\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"Babis\", \"Μπάμπης\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"Mpampis\", \"Μπάμπης\"))\n\n        Assert.assertTrue(SoundComparer.soundTheSame(\"athina\", \"Αθήνα\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"Athina\", \"Αθήνα\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"a8ina\", \"Αθήνα\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"Αθήνα\", \"Αθηνα\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"πτεροδάκτυλος\", \"pterodaktilos\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"ΣΚΟΥΛΙΚΟΜΙΡΜΙΓΚΟΤΡΥΠΑΩ\", \"skoylikomirmiggotripaw\"))\n        Assert.assertTrue(SoundComparer.soundTheSame(\"ΣΚΟΥΛΙΚΟΜΙΡΜΙΓΚΟΤΡΥΠΑΩ\", \"skoylikomirmigotripaw\"))\n\n\n        Assert.assertFalse(SoundComparer.soundTheSame(\"έξω\", \"έχω\"))\n        Assert.assertFalse(SoundComparer.soundTheSame(\"Υτα\", \"FTA\"))\n        Assert.assertFalse(SoundComparer.soundTheSame(\"Αθήνα\", \"patra\"))\n        Assert.assertFalse(SoundComparer.soundTheSame(\"Αθήν\", \"athina\"))\n        Assert.assertFalse(SoundComparer.soundTheSame(\"Αθήνα\", \"athin\"))\n        Assert.assertFalse(SoundComparer.soundTheSame(\"Αθή\", \"athina\"))\n        Assert.assertFalse(SoundComparer.soundTheSame(\"Αθή\", \"ath\"))\n        Assert.assertFalse(SoundComparer.soundTheSame(\"Αθή\", \"ath\"))\n        Assert.assertFalse(SoundComparer.soundTheSame(\"Αθή\", \"ath\"))\n        Assert.assertFalse(SoundComparer.soundTheSame(\"Αθή\", \"ath\"))\n        Assert.assertFalse(SoundComparer.soundTheSame(\"Αθήα\", \"athie\"))\n        Assert.assertFalse(SoundComparer.soundTheSame(\"KSIFIA\", \"XIPHI\"))\n    }\n\n\n    @Test\n    fun startsWith() {\n        Assert.assertFalse(SoundComparer.startsWith(\"Αθήνα\", \"patra\"))\n        Assert.assertFalse(SoundComparer.startsWith(\"Αθήναx\", \"Αθήναs\"))\n        Assert.assertFalse(SoundComparer.startsWith(\"Αθήνεο\", \"Αθήνει\"))\n        Assert.assertFalse(SoundComparer.startsWith(\"Αθήνα\", \"ak\"))\n\n        Assert.assertTrue(SoundComparer.startsWith(\"Apopse\", \"Αποψ\"))\n        Assert.assertTrue(SoundComparer.startsWith(\"Αποψε\", \"Apop\"))\n        Assert.assertFalse(SoundComparer.startsWith(\"Αποψ\", \"Apopse\"))\n        Assert.assertFalse(SoundComparer.startsWith(\"Αποψε\", \"Apope\"))\n\n        Assert.assertTrue(SoundComparer.startsWith(\"Babis\", \"Μπάμπ\"))\n        Assert.assertTrue(SoundComparer.startsWith(\"Babis\", \"Μπάμ\"))\n        Assert.assertTrue(SoundComparer.startsWith(\"Babis\", \"Μ\"))\n        Assert.assertTrue(SoundComparer.startsWith(\"Αθήνα\", \"athin\"))\n        Assert.assertTrue(SoundComparer.startsWith(\"Αθήνα\", \"ath\"))\n        Assert.assertTrue(SoundComparer.startsWith(\"Αθήνα\", \"at\"))\n\n        Assert.assertTrue(SoundComparer.startsWith(\"Athena\", \"Αθήνα\"))\n        Assert.assertTrue(SoundComparer.startsWith(\"Athena\", \"Αθήν\"))\n        Assert.assertTrue(SoundComparer.startsWith(\"Athena\", \"Αθή\"))\n        Assert.assertTrue(SoundComparer.startsWith(\"Athena\", \"Αθ\"))\n        Assert.assertTrue(SoundComparer.startsWith(\"Athena\", \"Α\"))\n\n        Assert.assertTrue(SoundComparer.startsWith(\"Anthropoi\", \"Άνθρωποι\"))\n        Assert.assertTrue(SoundComparer.startsWith(\"Anthropoi\", \"Άνθρωπο\"))\n        Assert.assertTrue(SoundComparer.startsWith(\"Anthropoi\", \"Άνθρωπ\"))\n        Assert.assertTrue(SoundComparer.startsWith(\"Anthropoi\", \"Άνθρω\"))\n\n        Assert.assertFalse(SoundComparer.startsWith(\"Μπά\", \"Babis\"))\n\n        Assert.assertTrue(SoundComparer.startsWith(\"ΚΣ\", \"Κ\"))\n        Assert.assertTrue(SoundComparer.startsWith(\"ΟΞιφίας\", \"OK\"))\n        Assert.assertTrue(SoundComparer.startsWith(\"ΟΞιφίας\", \"ΟKSIP\"))\n        Assert.assertTrue(SoundComparer.startsWith(\"ΟΞιφίας\", \"ΟKSIPH\"))\n        Assert.assertTrue(SoundComparer.startsWith(\"ΟΞιφίας\", \"ΟKSIPHIAS\"))\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/gsc/SoundTest.kt",
    "content": "package com.alexstyl.gsc\n\nimport org.fest.assertions.api.Assertions\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.runners.MockitoJUnitRunner\n\n@RunWith(MockitoJUnitRunner::class)\nclass SoundTest {\n\n    @Test\n    fun combiningTwoSymbols_returnsASoundWithAllTheSymbols() {\n        val result = sound('A') + sound('E')\n        Assertions.assertThat(result).isEqualTo(sound(charArrayOf('A', 'E')))\n    }\n\n\n    @Test\n    fun appendingThreeSounds_returnsASoundWithAllSymbols() {\n        var result = Sound.flatten(listOf(sound('A'), sound('B'), sound('C')))\n        Assertions.assertThat(result).isEqualTo(sound(\"A,B,C\"))\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/JavaStrings.kt",
    "content": "package com.alexstyl.specialdates\n\n\nimport com.alexstyl.specialdates.events.namedays.NamedayLocale\nimport com.alexstyl.specialdates.events.peopleevents.EventType\nimport com.alexstyl.specialdates.events.peopleevents.StandardEventType\nimport com.alexstyl.specialdates.person.StarSign\n\nclass JavaStrings : Strings {\n    override fun contactUpdated(): String = \"contactUpdated\"\n\n    override fun contactAdded(): String = \"contactAdded\"\n\n    override fun contactAddedFailed(): String = \"contactAddedFailed\"\n\n    override fun contactUpdateFailed(): String = \"contactUpdateFailed\"\n    override fun dontForgetToSendWishes(): String = \"Don't forget to send your wishes!\"\n\n    override fun call(): String = \"Call\"\n    override fun sendWishes(): String = \"Send wishes\"\n    override fun bankholidaySubtitle(): String = \"Tap to see more events.\"\n    override fun contacts(): String = \"Contacts\"\n\n    override fun bankholidays(): String = \"Bank Holidays\"\n\n    override fun namedays(): String = \"Namedays\"\n\n    override fun dailyReminder(): String = \"Daily Reminder\"\n    override fun importFromFacebook(): String = \"Import from Facebook\"\n\n    override fun viewFacebookProfile(): String = \"View Facebook Friends\"\n    override fun postOnFacebook(): String = \"Post on Facebook\"\n\n    override fun facebook(): String = \"Facebook\"\n\n    override fun viewConversation(): String = \"View Conversations\"\n\n    override fun facebookMessenger(): String = \"Messenger\"\n\n    override fun nameOf(starSign: StarSign): String = when (starSign) {\n        StarSign.AQUARIUS -> \"Aquarius\"\n        StarSign.PISCES -> \"Pisces\"\n        StarSign.ARIES -> \"Aries\"\n        StarSign.TAURUS -> \"Taurus\"\n        StarSign.GEMINI -> \"Gemini\"\n        StarSign.CANCER -> \"Cancer\"\n        StarSign.LEO -> \"Leo\"\n        StarSign.VIRGO -> \"Virgo\"\n        StarSign.LIBRA -> \"Libra\"\n        StarSign.SCORPIO -> \"Scorpio\"\n        StarSign.SAGITTARIUS -> \"Sagittarius\"\n        StarSign.CAPRICORN -> \"Capricorn\"\n    }\n\n    override fun turnsAge(age: Int): String = \"Turns \" + age\n\n    override fun inviteFriend(): String = \"Invite Friend\"\n\n    override fun todaysNamedays(numberOfNamedays: Int): String {\n        return if (numberOfNamedays > 0) {\n            \"todays namedays\"\n        } else {\n            \"todays nameday\"\n        }\n    }\n\n    override fun donateAmount(amount: String): String = \"Donate \" + amount\n\n    override fun eventOnDate(eventLabel: String, dateLabel: String): String = eventLabel + \" on \" + dateLabel\n\n    override fun appName(): String = \"DEBUG APP\"\n\n    override fun shareText(): String = \"Share Text\"\n\n    override fun today(): String = \"today\"\n\n    override fun tomorrow(): String = \"tomorrow\"\n\n    override fun todayCelebrateTwo(nameOne: String, nameTwo: String): String = \"Today celebrate $nameOne and $nameTwo\"\n\n    override fun todayCelebrateMany(name: String, numberLeft: Int): String = \"Today celebrate $name and $numberLeft other\"\n\n    override fun nameOfEvent(event: EventType): String = when (event) {\n        StandardEventType.BIRTHDAY -> \"Birthday\"\n        StandardEventType.NAMEDAY -> \"Nameday\"\n        StandardEventType.ANNIVERSARY -> \"Anniversary\"\n        StandardEventType.OTHER -> \"Other\"\n        StandardEventType.CUSTOM -> \"Custom\"\n        else -> {\n            throw IllegalStateException(\"$event has no name\")\n        }\n    }\n\n    override fun localeName(locale: NamedayLocale): String = when (locale) {\n        NamedayLocale.GREEK -> \"Greek\"\n        NamedayLocale.ROMANIAN -> \"Romanian\"\n        NamedayLocale.RUSSIAN -> \"Russian\"\n        NamedayLocale.LATVIAN -> \"Latvian\"\n        NamedayLocale.LATVIAN_EXTENDED -> \"Latvian (Extended)\"\n        NamedayLocale.SLOVAK -> \"Slovak\"\n        NamedayLocale.ITALIAN -> \"Italian\"\n        NamedayLocale.CZECH -> \"Czech\"\n        NamedayLocale.HUNGARIAN -> \"Hungarian\"\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/NamesTest.kt",
    "content": "package com.alexstyl.specialdates\n\nimport com.alexstyl.specialdates.contact.Names\nimport org.fest.assertions.api.Assertions.assertThat\nimport org.junit.Test\n\nclass NamesTest {\n\n    @Test\n    fun singleName() {\n        val names = Names.parse(\"Πέτρος\")\n\n        assertThat(names).containsExactly(\"Πέτρος\")\n    }\n\n    @Test\n    fun singleNameWithNumbers() {\n        val names = Names.parse(\"Π3τρος\")\n\n        assertThat(names).containsExactly(\"Π3τρος\")\n    }\n\n    @Test\n    fun twoNamesSplitWithSpace() {\n        val names = Names.parse(\"Άννα Μαρία\")\n\n        assertThat(names).containsExactly(\"Άννα\", \"Μαρία\")\n    }\n\n    @Test\n    fun twoNamesSplitWithColumn() {\n        val names = Names.parse(\"Άννα-Μαρία\")\n\n        assertThat(names).containsExactly(\"Άννα\", \"Μαρία\")\n    }\n\n    @Test\n    fun fiveNamesSpitWithSpacesAndColumns() {\n        val names = Names.parse(\"Άννα Μαρία-Πέτρου Βασίλη Τάκη\")\n\n        assertThat(names).containsExactly(\"Άννα\", \"Μαρία\", \"Πέτρου\", \"Βασίλη\", \"Τάκη\")\n    }\n\n    @Test\n    fun emojisAreNotNames() {\n        val names = Names.parse(\"~Alex~~<3❤️\")\n\n        assertThat(names).containsExactly(\"Alex\", \"3\")\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/OptionalTest.java",
    "content": "package com.alexstyl.specialdates;\n\nimport org.junit.Test;\n\nimport static org.fest.assertions.api.Assertions.assertThat;\n\npublic class OptionalTest {\n\n    @Test\n    public void presentNotEqualToAbsent() {\n        Optional<String> one = new Optional<>(\"Hi\");\n        assertThat(one).isNotEqualTo(Optional.Companion.<String>absent());\n    }\n\n    @Test\n    public void presentsAreEqual() {\n        assertThat(new Optional<>(\"Hi\")).isEqualTo(new Optional<>(\"Hi\"));\n    }\n\n    @Test\n    public void absentsAreEqual() {\n        assertThat(Optional.Companion.<String>absent()).isEqualTo(Optional.Companion.<String>absent());\n    }\n\n    @Test\n    public void toStringPrintsTheObject() {\n        Optional<String> stringOptional = new Optional<>(\"hello\");\n        assertThat(stringOptional.toString()).isEqualTo(\"hello\");\n    }\n\n    @Test\n    public void absentToStringPrintsAbsent() {\n        Optional<String> stringOptional = Optional.Companion.absent();\n        assertThat(stringOptional.toString()).isEqualTo(\"absent\");\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/TestContactEventsBuilder.kt",
    "content": "package com.alexstyl.specialdates\n\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.date.ContactEvent\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.events.peopleevents.EventType\nimport com.alexstyl.specialdates.events.peopleevents.StandardEventType.ANNIVERSARY\nimport com.alexstyl.specialdates.events.peopleevents.StandardEventType.BIRTHDAY\nimport com.alexstyl.specialdates.events.peopleevents.StandardEventType.NAMEDAY\nimport java.util.ArrayList\n\nclass TestContactEventsBuilder {\n    private val contactEvents = ArrayList<ContactEvent>()\n\n    fun addBirthdayFor(contact: Contact, date: Date): TestContactEventsBuilder {\n        addEventFor(contact, BIRTHDAY, date)\n        return this\n    }\n\n    fun addAnniversaryFor(contact: Contact, date: Date): TestContactEventsBuilder {\n        addEventFor(contact, ANNIVERSARY, date)\n        return this\n    }\n\n    fun addNamedayFor(contact: Contact, date: Date): TestContactEventsBuilder {\n        addEventFor(contact, NAMEDAY, date)\n        return this\n    }\n\n    private fun addEventFor(contact: Contact, eventType: EventType, date: Date) {\n        contactEvents.add(ContactEvent(NO_DEVICE_CONTACT_ID, eventType, date, contact))\n    }\n\n    fun build(): List<ContactEvent> {\n        return contactEvents.toList()\n    }\n\n    companion object {\n\n        private val NO_DEVICE_CONTACT_ID = Optional.absent<Long>()\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/TestDateLabelCreator.kt",
    "content": "package com.alexstyl.specialdates\n\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.DateLabelCreator\nimport com.alexstyl.specialdates.upcoming.MonthLabels\nimport java.util.*\n\nclass TestDateLabelCreator private constructor(private val monthLabels: MonthLabels) : DateLabelCreator {\n\n    override fun createWithYearPreferred(date: Date): String {\n        return if (date.hasYear()) {\n            monthLabels.getMonthOfYear(date.month) + \" \" + date.dayOfMonth + \" \" + date.year\n        } else {\n            monthLabels.getMonthOfYear(date.month) + \" \" + date.dayOfMonth\n        }\n    }\n\n    override fun createLabelWithoutYear(date: Date): String = monthLabels.getMonthOfYear(date.month) + \" \" + date.dayOfMonth\n\n    companion object {\n        fun forUS(): DateLabelCreator {\n            val monthLabels = MonthLabels.forLocale(Locale.US)\n            return TestDateLabelCreator(monthLabels)\n        }\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/addevent/AddEventsPresenterTest.kt",
    "content": "package com.alexstyl.specialdates.addevent\n\nimport com.alexstyl.specialdates.JavaStrings\nimport com.alexstyl.specialdates.Optional\nimport com.alexstyl.specialdates.TestDateLabelCreator\nimport com.alexstyl.specialdates.addevent.operations.InsertContact\nimport com.alexstyl.specialdates.addevent.operations.InsertEvent\nimport com.alexstyl.specialdates.addevent.operations.UpdateContact\nimport com.alexstyl.specialdates.analytics.Analytics\nimport com.alexstyl.specialdates.contact.ContactFixture\nimport com.alexstyl.specialdates.date.ContactEvent\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.Months\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsProvider\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsUpdater\nimport com.alexstyl.specialdates.events.peopleevents.StandardEventType\nimport io.reactivex.Observable\nimport io.reactivex.schedulers.Schedulers\nimport org.junit.Before\nimport org.junit.Test\nimport org.mockito.BDDMockito\nimport org.mockito.BDDMockito.given\nimport org.mockito.Mockito\nimport org.mockito.Mockito.mock\nimport org.mockito.Mockito.times\nimport org.mockito.Mockito.verify\n\nclass AddEventsPresenterTest {\n    private lateinit var presenter: AddEventsPresenter\n    private val strings = JavaStrings()\n    private val viewModelFactory = AddEventViewModelFactory(TestDateLabelCreator.forUS(), JavaStrings(), JavaEventIcons())\n\n    private val mockView = Mockito.mock(AddEventView::class.java)\n    private val mockMessageDisplayer = mock(MessageDisplayer::class.java)\n    private val mockPeopleEventsProvider = Mockito.mock(PeopleEventsProvider::class.java)\n    private val mockExecutor = mock(ContactOperationsExecutor::class.java)\n\n    @Before\n    fun setUp() {\n        val mockPeopleEventsUpdater = mock(PeopleEventsUpdater::class.java)\n        // don't mind for updates\n        given(mockPeopleEventsUpdater.updateEvents()).willReturn(Observable.empty())\n\n        presenter = AddEventsPresenter(\n                mock(Analytics::class.java),\n                ContactOperations(),\n                mockMessageDisplayer,\n                mockExecutor,\n                strings,\n                mockPeopleEventsProvider,\n                viewModelFactory,\n                mockPeopleEventsUpdater,\n                Schedulers.trampoline(),\n                Schedulers.trampoline()\n        )\n    }\n\n    @Test\n    fun whenStartPresenting_thenAlwaysStartsWithEmptyViewModelsForStandardTypes() {\n        presenter.startPresentingInto(mockView)\n\n        val expectedViewModels = emptyModelsFor(StandardEventType.BIRTHDAY,\n                StandardEventType.ANNIVERSARY,\n                StandardEventType.OTHER)\n\n        Mockito.verify(mockView).display(expectedViewModels)\n    }\n\n    private fun emptyModelsFor(standardEventType: StandardEventType, vararg others: StandardEventType): List<AddEventContactEventViewModel> {\n        return (listOf(standardEventType) + others.toList())\n                .map { viewModelFactory.createViewModelFor(it) }\n    }\n\n    @Test\n    fun givenAContactWithoutEvents_thenEmptyViewModelsWillBePassedToTheView() {\n        presenter.startPresentingInto(mockView)\n\n        val contact = ContactFixture.aContactCalled(\"Martha\")\n        BDDMockito.given(mockPeopleEventsProvider.fetchEventsFor(contact)).willReturn(emptyList())\n\n        presenter.presentContact(contact)\n\n        Mockito.verify(mockView, times(2)).display(emptyModelsFor(StandardEventType.BIRTHDAY, StandardEventType.ANNIVERSARY, StandardEventType.OTHER))\n    }\n\n    @Test\n    fun givenAContactWithAllEvents_thenTheViewModelsForThoseEventsArePassedIntoTheView() {\n        presenter.startPresentingInto(mockView)\n\n        val contact = ContactFixture.aContactCalled(\"Martha\")\n        val birthday = ContactEvent(Optional.absent(), StandardEventType.BIRTHDAY, Date.today(), contact)\n        val anniversary = ContactEvent(Optional.absent(), StandardEventType.ANNIVERSARY, Date.today() + 1, contact)\n        val other = ContactEvent(Optional.absent(), StandardEventType.OTHER, Date.today() + 2, contact)\n        BDDMockito.given(mockPeopleEventsProvider.fetchEventsFor(contact)).willReturn(listOf(birthday, anniversary, other))\n\n        presenter.presentContact(contact)\n\n        val expectedViewModels = listOf(viewModelFactory.createViewModelFor(birthday), viewModelFactory.createViewModelFor(anniversary), viewModelFactory.createViewModelFor(other))\n        Mockito.verify(mockView).display(expectedViewModels)\n    }\n\n    @Test\n    fun givenAContactWithCustomEvents_thenTheViewModelsForThoseEventsButNoCustomArePassedIntoTheView() {\n        presenter.startPresentingInto(mockView)\n\n        val contact = ContactFixture.aContactCalled(\"Martha\")\n        val nameday = ContactEvent(Optional.absent(), StandardEventType.NAMEDAY, Date.today() + 2, contact)\n        val custom = ContactEvent(Optional.absent(), StandardEventType.CUSTOM, Date.today() + 2, contact)\n\n        BDDMockito.given(mockPeopleEventsProvider.fetchEventsFor(contact)).willReturn(listOf(nameday, custom))\n\n        presenter.presentContact(contact)\n\n        val expectedViewModels = emptyModelsFor(StandardEventType.BIRTHDAY, StandardEventType.ANNIVERSARY, StandardEventType.OTHER)\n        Mockito.verify(mockView, times(2)).display(expectedViewModels)\n    }\n\n    @Test\n    fun givenADateAndEventIsSelected_thenTheViewModelsOfThatEventPlusAllOtherEmptyViewModelsArePassedToTheView() {\n        presenter.startPresentingInto(mockView)\n        Mockito.verify(mockView).display(emptyModelsFor(StandardEventType.BIRTHDAY, StandardEventType.ANNIVERSARY, StandardEventType.OTHER))\n\n        presenter.onEventDatePicked(StandardEventType.BIRTHDAY, Date.today())\n\n        val dateViewModel = viewModelFactory.createViewModelFor(StandardEventType.BIRTHDAY, Date.today())\n        Mockito.verify(mockView).display(listOf(dateViewModel) + emptyModelsFor(StandardEventType.ANNIVERSARY, StandardEventType.OTHER))\n    }\n\n    @Test\n    fun givenADateAndEventIsRemoved_thenTheViewModelsOfThatEventIsReturnedEmptyToTheView() {\n        presenter.startPresentingInto(mockView)\n\n        val contact = ContactFixture.aContactCalled(\"Martha\")\n        val birthday = ContactEvent(Optional.absent(), StandardEventType.BIRTHDAY, Date.today(), contact)\n        val anniversary = ContactEvent(Optional.absent(), StandardEventType.ANNIVERSARY, Date.today() + 1, contact)\n        val other = ContactEvent(Optional.absent(), StandardEventType.OTHER, Date.today() + 2, contact)\n        BDDMockito.given(mockPeopleEventsProvider.fetchEventsFor(contact)).willReturn(listOf(birthday, anniversary, other))\n\n        presenter.presentContact(contact)\n\n        presenter.removeEvent(StandardEventType.BIRTHDAY)\n\n        val expectedViewModels = listOf(viewModelFactory.createViewModelFor(StandardEventType.BIRTHDAY),\n                viewModelFactory.createViewModelFor(anniversary),\n                viewModelFactory.createViewModelFor(other)\n        )\n        Mockito.verify(mockView).display(expectedViewModels)\n    }\n\n\n    @Test\n    fun whenStartPresenting_thenSaveIsDisabled() {\n        presenter.startPresentingInto(mockView)\n\n        verify(mockView).preventSave()\n    }\n\n    @Test\n    fun whenAContactIsSelected_thenSaveIsDisabled() {\n        presenter.startPresentingInto(mockView)\n\n        val contact = ContactFixture.aContactCalled(\"Rob\")\n        presenter.presentContact(contact)\n\n        verify(mockView, times(2)).preventSave()\n        verify(mockView, times(0)).allowSave()\n    }\n\n    @Test(expected = UnsupportedOperationException::class)\n    fun givenAName_whenAContactIsSelected_thenThrowsException() {\n        presenter.startPresentingInto(mockView)\n        presenter.presentContact(ContactFixture.aContactCalled(\"Yoland\"))\n        presenter.presentName(\"Yolanda\")\n    }\n\n    @Test\n    fun whenAnEventIsSelected_givenAContactIsSelected_thenSaveIsEnabled() {\n        presenter.startPresentingInto(mockView)\n\n        presenter.presentName(\"Alex\")\n\n        verify(mockView, times(2)).preventSave()\n        verify(mockView, times(0)).allowSave()\n\n        presenter.onEventDatePicked(StandardEventType.BIRTHDAY, Date.on(19, Months.DECEMBER, 1990))\n\n        verify(mockView, times(1)).allowSave()\n    }\n\n    @Test\n    fun whenAllEventsAreRemoved_givenAContact_thenSaveIsDisabled() {\n        presenter.startPresentingInto(mockView) // prevent save 1\n\n        val contact = ContactFixture.aContactCalled(\"Chrysa\")\n        given(mockPeopleEventsProvider.fetchEventsFor(contact))\n                .willReturn(listOf(\n                        ContactEvent(Optional.absent(), StandardEventType.BIRTHDAY, Date.today(), contact))\n                )\n\n        presenter.presentContact(contact)    // prevent save 2\n        presenter.removeEvent(StandardEventType.BIRTHDAY)     // prevent save 3\n\n        verify(mockView, times(3)).preventSave()\n    }\n\n\n    @Test\n    fun givenANameABirthday_thenAContactIsCreatedMessageIsShown() {\n        given(mockExecutor.execute(\n                listOf(\n                        InsertContact(\"Alex\"), InsertEvent(StandardEventType.BIRTHDAY, Date.on(19, Months.DECEMBER, 1990))\n                )\n        )).willReturn(true)\n\n        presenter.startPresentingInto(mockView)\n        presenter.presentName(\"Alex\")\n        presenter.onEventDatePicked(StandardEventType.BIRTHDAY, Date.on(19, Months.DECEMBER, 1990))\n        presenter.saveChanges()\n\n        verify(mockMessageDisplayer).showMessage(strings.contactAdded())\n    }\n\n    @Test\n    fun givenANameABirthday_thenANewContactIsCreated() {\n        presenter.startPresentingInto(mockView)\n        presenter.presentName(\"Alex\")\n        presenter.onEventDatePicked(StandardEventType.BIRTHDAY, Date.on(19, Months.DECEMBER, 1990))\n        presenter.saveChanges()\n\n        verify(mockExecutor).execute(\n                listOf(\n                        InsertContact(\"Alex\"),\n                        InsertEvent(StandardEventType.BIRTHDAY, Date.on(19, Months.DECEMBER, 1990))\n                ))\n    }\n\n    @Test\n    fun givenAContact_whenTheContactHasAnExistingBirthday_thenTheBirthdayWillBeUpdated() {\n        presenter.startPresentingInto(mockView)\n        val selectedContact = ContactFixture.aContactCalled(\"Joseph\")\n        presenter.presentContact(selectedContact)\n\n        val existingBirthday = ContactEvent(Optional.absent(), StandardEventType.BIRTHDAY, Date.on(1, Months.JANUARY), selectedContact)\n\n        given(mockPeopleEventsProvider.fetchEventsFor(selectedContact)).willReturn(listOf(existingBirthday))\n\n        presenter.onEventDatePicked(StandardEventType.BIRTHDAY, Date.on(19, Months.DECEMBER, 1990))\n        presenter.saveChanges()\n\n        verify(mockExecutor).execute(\n                listOf(\n                        UpdateContact(selectedContact),\n                        InsertEvent(StandardEventType.BIRTHDAY, Date.on(19, Months.DECEMBER, 1990))\n                ))\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/addevent/JavaEventIcons.kt",
    "content": "package com.alexstyl.specialdates.addevent\n\nimport com.alexstyl.specialdates.events.peopleevents.EventType\n\nclass JavaEventIcons : EventIcons {\n    override fun iconOf(eventType: EventType): Int = eventType.id\n\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/addevent/JavaMessageDisplayer.kt",
    "content": "package com.alexstyl.specialdates.addevent\n\nclass JavaMessageDisplayer : MessageDisplayer {\n    override fun showMessage(string: String) {\n        println(string)\n    }\n\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/addevent/ui/ContactSourcesStubs.kt",
    "content": "package com.alexstyl.specialdates.addevent.ui\n\nimport com.alexstyl.specialdates.contact.ContactFixture\nimport com.alexstyl.specialdates.contact.Contacts\nimport org.mockito.BDDMockito\n\nfun BDDMockito.BDDMyOngoingStubbing<Contacts>.willReturnContacts(name: String, vararg names: String) =\n        this.willReturn((Contacts(1, (names.toList() + name).map { ContactFixture.aContactCalled(it) })))\n\nfun BDDMockito.BDDMyOngoingStubbing<Contacts>.willReturnNoContact() =\n        this.willReturn((Contacts(1, emptyList())))\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/addevent/ui/ContactsSearchTest.kt",
    "content": "package com.alexstyl.specialdates.addevent.ui\n\nimport com.alexstyl.specialdates.addevent.ContactsSearch\nimport com.alexstyl.specialdates.contact.ContactsProvider\nimport com.alexstyl.specialdates.contact.ContactsProviderSource\nimport com.alexstyl.specialdates.search.NameMatcher\nimport org.fest.assertions.api.Assertions.assertThat\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.BDDMockito.given\nimport org.mockito.Mock\nimport org.mockito.runners.MockitoJUnitRunner\n\n@RunWith(MockitoJUnitRunner::class)\nclass ContactsSearchTest {\n\n    private lateinit var contactsProvider: ContactsProvider\n    @Mock\n    private lateinit var mockSource: ContactsProviderSource\n\n    @Before\n    fun setUp() {\n        contactsProvider = ContactsProvider(mapOf(Pair(1, mockSource)))\n\n    }\n\n    @Test\n    fun ensureThatCounterIsRespected() {\n        given(mockSource.allContacts).willReturnContacts(\"Alex Styl\", \"Alex Evil Twin\")\n        val search = ContactsSearch(contactsProvider, NameMatcher.INSTANCE)\n        val oneContact = search.searchForContacts(\"Alex\", 1)\n        assertThat(oneContact.size).isEqualTo(1)\n\n        val twoContacts = search.searchForContacts(\"Alex\", 2)\n        assertThat(twoContacts.size).isEqualTo(2)\n    }\n\n    @Test\n    fun canFindFirstname() {\n        given(mockSource.allContacts).willReturnContacts(\"Alex Styl\", \"Alex Evil Twin\", \"Anna Papadopoulou\")\n        val search = ContactsSearch(contactsProvider, NameMatcher.INSTANCE)\n\n        val oneContact = search.searchForContacts(\"Anna\", 1)\n        assertThat(oneContact.size).isEqualTo(1)\n        assertThat(oneContact[0].displayName.toString()).isEqualTo(\"Anna Papadopoulou\")\n    }\n\n    @Test\n    fun canFindSurname() {\n        given(mockSource.allContacts).willReturnContacts(\"Alex Styl\", \"Alex Evil Twin\", \"Anna Papadopoulou\")\n        val search = ContactsSearch(contactsProvider, NameMatcher.INSTANCE)\n\n        val oneContact = search.searchForContacts(\"Papadopoulou\", 1)\n        assertThat(oneContact.size).isEqualTo(1)\n        assertThat(oneContact[0].displayName.toString()).isEqualTo(\"Anna Papadopoulou\")\n    }\n\n    @Test\n    fun returnEmptyForNoMatches() {\n        given(mockSource.allContacts).willReturnContacts(\"Alex Styl\", \"Alex Evil Twin\", \"Anna Papadopoulou\")\n        val search = ContactsSearch(contactsProvider, NameMatcher.INSTANCE)\n        val results = search.searchForContacts(\"there is no contact with a name like this\", 1)\n        assertThat(results).isEmpty()\n    }\n\n    @Test\n    fun returnEmptyForNoContacts() {\n        given(mockSource.allContacts).willReturnNoContact()\n        val search = ContactsSearch(contactsProvider, NameMatcher.INSTANCE)\n        val results = search.searchForContacts(\"there is no contact with a name like this\", 1)\n        assertThat(results).isEmpty()\n    }\n}\n\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/contact/ContactCacheTest.java",
    "content": "package com.alexstyl.specialdates.contact;\n\nimport org.junit.Before;\nimport org.junit.Test;\n\nimport static org.fest.assertions.api.Assertions.assertThat;\n\npublic class ContactCacheTest {\n\n    private static final int CACHE_SIZE = 1024 * 5;\n\n    private static final DisplayName ANY_DISPLAY_NAME = DisplayName.Companion.from(\"Alex Styl\");\n\n    private ContactCache contactCache;\n\n    @Before\n    public void createEmptyCache() {\n        contactCache = new ContactCache(CACHE_SIZE);\n    }\n\n    @Test\n    public void givenOneContactIsAdded_thenSizeIsIncreasedByOne() {\n        Contact anyContact = ContactFixture.aContact();\n\n        contactCache.addContact(anyContact);\n\n        assertThat(contactCache.size()).isEqualTo(1);\n    }\n\n    @Test\n    public void givenOneContactIsAdded_thenSameContactIsReturned() {\n        Contact anyContact = ContactFixture.aContact();\n\n        contactCache.addContact(anyContact);\n        long contactID = anyContact.getContactID();\n\n        Contact returnedContact = contactCache.getContact(contactID);\n\n        assertThat(returnedContact).isEqualTo(anyContact);\n\n    }\n\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/contact/ContactFixture.java",
    "content": "package com.alexstyl.specialdates.contact;\n\nimport java.net.URI;\n\nimport static com.alexstyl.specialdates.contact.ContactSource.SOURCE_DEVICE;\n\npublic class ContactFixture {\n\n    private static final URI SOME_IMAGE = URI.create(\"https://www.alexstyl.com/image.jpg\");\n\n    public static Contact aContact() {\n        return new Contact(-1, DisplayName.Companion.from(\"Test Contact\"), SOME_IMAGE, SOURCE_DEVICE);\n    }\n\n    public static Contact aContactCalled(String peter) {\n        return new Contact(-1, DisplayName.Companion.from(peter), SOME_IMAGE, 1);\n    }\n\n    public static Contact with(long id, String firstName) {\n        return new Contact(id, DisplayName.Companion.from(firstName), SOME_IMAGE, SOURCE_DEVICE);\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/contact/ContactTest.java",
    "content": "package com.alexstyl.specialdates.contact;\n\nimport java.net.URI;\n\nimport org.junit.Test;\n\nimport static org.fest.assertions.api.Assertions.assertThat;\n\npublic class ContactTest {\n\n    private final URI someImageURI = URI.create(\"https://www.alexstyl.com/some/image.jpg\");\n\n    @Test\n    public void toStringReturnsTheDisplayNameRepresentation() {\n        Contact contact = new Contact(404, DisplayName.Companion.from(\"Alex Styl\"), someImageURI, -1);\n        assertThat(contact.toString()).isEqualTo(\"Alex Styl\");\n    }\n\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/contact/DisplayNameTest.java",
    "content": "package com.alexstyl.specialdates.contact;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport org.junit.Test;\n\nimport static org.fest.assertions.api.Assertions.assertThat;\n\npublic class DisplayNameTest {\n\n    @Test\n    public void givenFirstName_thenDisplayNameHasOneFirstNameAndNoLastName() {\n        DisplayName name = DisplayName.Companion.from(\"Alex\");\n\n        assertThat(name.getFirstNames().getCount()).isEqualTo(1);\n        assertThat(name.getLastName()).isEmpty();\n    }\n\n    @Test\n    public void givenFirstAndLastName_thenFirstNameIsCorrect() {\n        DisplayName displayName = DisplayName.Companion.from(\"Alex Styl\");\n        assertThat(displayName.getFirstNames().getPrimary()).isEqualTo(\"Alex\");\n    }\n\n    @Test\n    public void givenFirstAndLastName_thenLastNameIsCorrect() {\n        DisplayName displayName = DisplayName.Companion.from(\"Alex Styl\");\n        assertThat(displayName.getLastName()).isEqualTo(\"Styl\");\n    }\n\n    @Test\n    public void givenFirstAndLastName_thenDisplayNameHasOneFirstAndLastName() {\n        DisplayName displayName = DisplayName.Companion.from(\"Alex Styl\");\n\n        assertThat(displayName.getFirstNames().getCount()).isEqualTo(1);\n        assertThat(displayName.getLastName()).isNotEmpty();\n    }\n\n    @Test\n    public void givenMultipleFirstNames_thenDisplayNameHasMultipleNamesAndLastName() {\n        DisplayName displayName = DisplayName.Companion.from(\"John Peters Jackson\");\n\n        assertThat(displayName.hasMultipleFirstNames()).isTrue();\n        assertThat(displayName.getFirstNames().getCount()).isEqualTo(2);\n        assertThat(displayName.getLastName()).isNotEmpty();\n    }\n\n    @Test\n    public void givenFirstNameWithSemicolumnAndLastName_thenDisplayNameHasTwoFirstNameAndLastName() {\n        DisplayName displayName = DisplayName.Companion.from(\"John-Peters Jackson\");\n\n        assertThat(displayName.hasMultipleFirstNames()).isTrue();\n        assertThat(displayName.getFirstNames().getCount()).isEqualTo(2);\n        assertThat(displayName.getLastName()).isNotEmpty();\n    }\n\n    @Test\n    public void givenEmptyName_NoNameIsReturned() {\n        DisplayName displayName = DisplayName.Companion.from(\"\");\n\n        assertThat(displayName).isEqualTo(DisplayName.Companion.getNO_NAME());\n    }\n\n    @Test\n    public void givenNullName_NoNameIsReturned() {\n        DisplayName displayName = DisplayName.Companion.from(null);\n\n        assertThat(displayName).isEqualTo(DisplayName.Companion.getNO_NAME());\n    }\n\n    @Test\n    public void noName_ReturnsEmptyName() {\n        DisplayName displayName = DisplayName.Companion.getNO_NAME();\n        assertThat(displayName.toString()).isEqualTo(\"\");\n    }\n\n    @Test\n    public void allNames() {\n        DisplayName displayName = DisplayName.Companion.from(\"Alex Bob Derek Styl\");\n        Names names = displayName.getAllNames();\n        List<String> namesList = asList(names);\n        assertThat(namesList).contains(\"Alex\", \"Bob\", \"Derek\", \"Styl\");\n    }\n\n    @Test\n    public void toStringReturnsTheFullName() {\n        String nameRaw = \"Alex Styl\";\n        String toString = DisplayName.Companion.from(nameRaw).toString();\n        assertThat(nameRaw).isEqualTo(toString);\n    }\n\n    private static List<String> asList(Names names) {\n        List<String> namesList = new ArrayList<>();\n        for (String name : names) {\n            namesList.add(name);\n        }\n        return namesList;\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/date/ContactEventTest.java",
    "content": "package com.alexstyl.specialdates.date;\n\nimport com.alexstyl.specialdates.JavaStrings;\nimport com.alexstyl.specialdates.Strings;\nimport com.alexstyl.specialdates.Optional;\nimport com.alexstyl.specialdates.contact.Contact;\nimport com.alexstyl.specialdates.contact.ContactFixture;\nimport com.alexstyl.specialdates.events.peopleevents.StandardEventType;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.runners.MockitoJUnitRunner;\n\nimport static com.alexstyl.specialdates.date.Months.JANUARY;\nimport static org.fest.assertions.api.Assertions.assertThat;\n\n@RunWith(MockitoJUnitRunner.class)\npublic class ContactEventTest {\n\n    private static final Optional<Long> NO_DEVICE_ID = Optional.Companion.absent();\n    private static final Date SOME_DATE = Date.Companion.on(1, JANUARY, 1990);\n    private static final Date SOME_DATE_WITHOUT_YEAR = Date.Companion.on(1, JANUARY);\n    private static final int CURRENT_YEAR = Date.Companion.getCURRENT_YEAR();\n\n    private Contact ANY_CONTACT = ContactFixture.aContact();\n\n    private Strings strings = new JavaStrings();\n\n    @Test\n    public void labelForNameday() {\n        ContactEvent contactEvent = new ContactEvent(NO_DEVICE_ID, StandardEventType.NAMEDAY, SOME_DATE, ANY_CONTACT);\n        String label = contactEvent.getLabel(SOME_DATE, strings);\n        assertThat(label).isEqualTo(\"Nameday\");\n    }\n\n    @Test\n    public void labelForBirthdayWithoutYear() {\n        ContactEvent contactEvent = new ContactEvent(NO_DEVICE_ID, StandardEventType.BIRTHDAY, SOME_DATE_WITHOUT_YEAR, ANY_CONTACT);\n        String label = contactEvent.getLabel(SOME_DATE, strings);\n        assertThat(label).isEqualTo(\"Birthday\");\n    }\n\n    @Test\n    public void labelForBirthdayWithYearAfterDate() {\n        Date eventDate = Date.Companion.on(1, JANUARY, CURRENT_YEAR + 50);\n        ContactEvent contactEvent = new ContactEvent(NO_DEVICE_ID, StandardEventType.BIRTHDAY, eventDate, ANY_CONTACT);\n        String label = contactEvent.getLabel(SOME_DATE, strings);\n        assertThat(label).isEqualTo(\"Birthday\");\n    }\n\n    @Test\n    public void labelForBirthdayWithYearOnDate() {\n        Date eventDate = Date.Companion.on(1, JANUARY, CURRENT_YEAR);\n        ContactEvent contactEvent = new ContactEvent(NO_DEVICE_ID, StandardEventType.BIRTHDAY, eventDate, ANY_CONTACT);\n        String label = contactEvent.getLabel(SOME_DATE, strings);\n        assertThat(label).isEqualTo(\"Birthday\");\n    }\n\n    @Test\n    public void labelForBirthdayWithYearBeforeDate() {\n        Date eventDate = Date.Companion.on(1, JANUARY, CURRENT_YEAR - 10);\n\n        ContactEvent contactEvent = new ContactEvent(NO_DEVICE_ID, StandardEventType.BIRTHDAY, eventDate, ANY_CONTACT);\n        String label = contactEvent.getLabel(Date.Companion.on(1, JANUARY, Date.Companion.today().getYear()), strings);\n        assertThat(label).isEqualTo(\"Turns 10\");\n    }\n\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/events/ContactActionTest.java",
    "content": "package com.alexstyl.specialdates.events;\n\nimport com.alexstyl.specialdates.Optional;\nimport com.alexstyl.specialdates.contact.Contact;\nimport com.alexstyl.specialdates.contact.ContactFixture;\nimport com.alexstyl.specialdates.date.ContactEvent;\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.events.peopleevents.ContactEventsOnADate;\nimport com.alexstyl.specialdates.events.peopleevents.StandardEventType;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport org.junit.Test;\n\nimport static com.alexstyl.specialdates.date.Months.JANUARY;\nimport static org.fest.assertions.api.Assertions.assertThat;\n\npublic class ContactActionTest {\n\n    private final Optional<Long> NO_DEVICE_EVENT_ID = Optional.Companion.absent();\n    private final List<ContactEvent> ANY_CONTACTS = new ArrayList<>();\n    private final Contact CONTACT_ONE = ContactFixture.aContactCalled(\"Alex Styl\");\n    private final ContactEvent EVENT_ONE = new ContactEvent(NO_DEVICE_EVENT_ID, StandardEventType.BIRTHDAY, Date.Companion.on(1, JANUARY, 1990), CONTACT_ONE);\n\n    private final Contact CONTACT_TWO = ContactFixture.aContactCalled(\"George Peterson\");\n    private final ContactEvent EVENT_TWO = new ContactEvent(NO_DEVICE_EVENT_ID, StandardEventType.BIRTHDAY, Date.Companion.on(1, JANUARY, 1970), CONTACT_TWO);\n\n    @Test\n    public void testTheSameDateIsReturned() throws Exception {\n        Date expectedDate = Date.Companion.on(1, JANUARY, 1990);\n        ContactEventsOnADate events = ContactEventsOnADate.Companion.createFrom(expectedDate, ANY_CONTACTS);\n\n        Date actualDate = events.getDate();\n        assertThat(actualDate).isEqualTo(expectedDate);\n    }\n\n    @Test\n    public void testContactCorrectContactIsReturned() {\n        Date date = Date.Companion.on(1, JANUARY, 2016);\n        ArrayList<ContactEvent> contactEvent = new ArrayList<>();\n        contactEvent.add(EVENT_ONE);\n\n        ContactEventsOnADate events = ContactEventsOnADate.Companion.createFrom(date, contactEvent);\n\n        List<Contact> contacts = events.getContacts();\n        assertThat(contacts.get(0)).isEqualTo(CONTACT_ONE);\n    }\n\n    @Test\n    public void testContactsAreCorrectlyReturned() {\n        Date date = Date.Companion.on(1, JANUARY, 2016);\n        ArrayList<ContactEvent> contactEvent = new ArrayList<>();\n        contactEvent.add(EVENT_ONE);\n        contactEvent.add(EVENT_TWO);\n        ContactEventsOnADate events = ContactEventsOnADate.Companion.createFrom(date, contactEvent);\n\n        List<Contact> contacts = events.getContacts();\n        assertThat(contacts).contains(CONTACT_ONE);\n        assertThat(contacts).contains(CONTACT_TWO);\n    }\n\n    @Test\n    public void testReturnedContactsSizeIsCorrect() {\n        Date date = Date.Companion.on(1, JANUARY, 2016);\n        ArrayList<ContactEvent> contactEvent = new ArrayList<>();\n        contactEvent.add(EVENT_ONE);\n        contactEvent.add(EVENT_TWO);\n        ContactEventsOnADate events = ContactEventsOnADate.Companion.createFrom(date, contactEvent);\n\n        List<Contact> contacts = events.getContacts();\n        assertThat(contacts.size()).isEqualTo(2);\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/events/DateTest.java",
    "content": "package com.alexstyl.specialdates.events;\n\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.date.DateComparator;\nimport com.alexstyl.specialdates.date.MonthInt;\n\nimport org.junit.Test;\n\nimport static com.alexstyl.specialdates.date.Months.*;\nimport static org.fest.assertions.api.Assertions.assertThat;\n\npublic class DateTest {\n\n    private static final DateComparator comparator = DateComparator.INSTANCE;\n\n    private static final int DAY = 5;\n    private static final\n    @MonthInt\n    int MONTH = 10;\n\n    private static final Date ANY_DATE = Date.Companion.on(DAY, MONTH, 1990);\n\n    @Test\n    public void whenAddingADayOfMonth_thenIncreaseNormally() {\n\n        Date after = ANY_DATE.addDay(1);\n        int expectedDay = DAY + 1;\n\n        assertThat(after.getDayOfMonth()).isEqualTo(expectedDay);\n    }\n\n    @Test\n    public void givenAEndOfTheYearDate_whenAddingOneDay_thenTheFirstDayOfTheNextYearIsReturned() {\n        Date lastDayOfYear = Date.Companion.on(31, DECEMBER, 1990);\n        Date firstDayOfNextYear = lastDayOfYear.addDay(1);\n\n        assertThat(firstDayOfNextYear.getMonth()).isEqualTo(1);\n        assertThat(firstDayOfNextYear.getDayOfMonth()).isEqualTo(1);\n        int nextYear = lastDayOfYear.getYear() + 1;\n        assertThat(firstDayOfNextYear.getYear()).isEqualTo(nextYear);\n    }\n\n    @Test\n    public void givenDateWithShortMonthAndNoYearSpecified_thenReturn29Days() {\n        Date date = Date.Companion.on(1, FEBRUARY);\n\n        assertThat(date.getDaysInCurrentMonth()).isEqualTo(29);\n    }\n\n    @Test\n    public void givenDateWithShortMonthAndCommonYear_thenReturn28Days() {\n        Date date = Date.Companion.on(1, FEBRUARY, 2018);\n\n        assertThat(date.getDaysInCurrentMonth()).isEqualTo(28);\n    }\n\n    @Test\n    public void givenDateWithShortMonthAndLeapYear_thenReturn29Days() {\n        Date date = Date.Companion.on(1, FEBRUARY, 2020);\n\n        assertThat(date.getDaysInCurrentMonth()).isEqualTo(29);\n    }\n\n    @Test\n    public void testOneDayAhead() {\n        Date firstDayOfYear = Date.Companion.on(1, JANUARY, 1990);\n        Date secondDayOfYear = Date.Companion.on(2, JANUARY, 1990);\n        assertThat(firstDayOfYear.daysDifferenceTo(secondDayOfYear)).isEqualTo(1);\n    }\n\n    @Test\n    public void testOneYearAhead() {\n        Date firstDayOfYear = Date.Companion.on(1, JANUARY, 1990);\n        Date secondDayOfYear = Date.Companion.on(1, JANUARY, 1991);\n        assertThat(firstDayOfYear.daysDifferenceTo(secondDayOfYear)).isEqualTo(365);\n    }\n\n    @Test\n    public void testTwoYearAhead() {\n        Date firstDayOfYear = Date.Companion.on(1, JANUARY, 1990);\n        Date secondDayOfYear = Date.Companion.on(1, JANUARY, 1992);\n        assertThat(firstDayOfYear.daysDifferenceTo(secondDayOfYear)).isEqualTo(365 * 2);\n    }\n\n    @Test\n    public void compareFutureDayDate() {\n        int result = comparator.compare(Date.Companion.on(1, JANUARY, 1990), Date.Companion.on(2, JANUARY, 1990));\n        assertThat(result).isNegative();\n    }\n\n    @Test\n    public void compareSameDayDate() {\n        int result = comparator.compare(Date.Companion.on(1, JANUARY, 1990), Date.Companion.on(1, JANUARY, 1990));\n        assertThat(result).isZero();\n    }\n\n    @Test\n    public void comparePastDayDate() {\n        int result = comparator.compare(Date.Companion.on(1, JANUARY, 1990), Date.Companion.on(1, JANUARY, 1980));\n        assertThat(result).isPositive();\n    }\n\n    @Test\n    public void compareFutureDate() {\n        int result = comparator.compare(Date.Companion.on(1, JANUARY, 1990), Date.Companion.on(2, JANUARY));\n        assertThat(result).isNegative();\n    }\n\n    @Test\n    public void compareSameDate() {\n        int result = comparator.compare(Date.Companion.on(1, JANUARY, 1990), Date.Companion.on(1, JANUARY));\n        assertThat(result).isZero();\n    }\n\n    @Test\n    public void comparePastDate() {\n        int result = comparator.compare(Date.Companion.on(2, JANUARY, 1990), Date.Companion.on(1, JANUARY));\n        assertThat(result).isPositive();\n    }\n\n    @Test\n    public void whenComparingToSameDate_thenTheyAreEqual() {\n        Date firstDate = Date.Companion.on(16, APRIL, 1991);\n        Date secondDate = Date.Companion.on(16, APRIL, 1991);\n\n        assertThat(firstDate.equals(secondDate)).isTrue();\n    }\n\n    @Test\n    public void whenComparingToDateWithDifferentYear_thenTheyAreNotEqual() {\n        Date firstDate = Date.Companion.on(16, APRIL, 1991);\n        Date secondDate = Date.Companion.on(16, APRIL, 1987);\n\n        assertThat(firstDate.equals(secondDate)).isFalse();\n    }\n\n    @Test(expected = IllegalArgumentException.class)\n    public void throwsException_whenInvalidDateIsCreated() {\n        Date.Companion.on(31, FEBRUARY, 1991);\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/events/ShortDateLabelCreatorTest.java",
    "content": "package com.alexstyl.specialdates.events;\n\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.events.peopleevents.ShortDateLabelCreator;\n\nimport org.junit.Test;\n\nimport static com.alexstyl.specialdates.date.Months.MAY;\nimport static org.fest.assertions.api.Assertions.assertThat;\n\npublic class ShortDateLabelCreatorTest {\n\n    private static ShortDateLabelCreator CREATOR = new ShortDateLabelCreator();\n\n    @Test\n    public void givenDateWithYear_whenAskingYear_thenYearIsReturned() {\n        Date date = Date.Companion.on(5, MAY, 1995);\n        String dateToString = CREATOR.createLabelWithYearPreferredFor(date);\n        assertThat(dateToString).isEqualTo(\"1995-05-05\");\n    }\n\n    @Test\n    public void givenDateWithNoYear_whenAskingForYear_NoYearIsReturned() {\n        Date date = Date.Companion.on(5, MAY);\n        String dateToString = CREATOR.createLabelWithYearPreferredFor(date);\n        assertThat(dateToString).isEqualTo(\"--05-05\");\n    }\n\n    @Test\n    public void givenDateWithNoYear_whenAskingNoYear_thenNoYearIsReturned() {\n        Date date = Date.Companion.on(5, MAY);\n        String dateToString = CREATOR.createLabelWithNoYearFor(date);\n        assertThat(dateToString).isEqualTo(\"05-05\");\n    }\n\n    @Test\n    public void givenDateWithYear_whenAskingForNoYear_NoYearIsReturned() {\n        Date date = Date.Companion.on(5, MAY, 1990);\n        String dateToString = CREATOR.createLabelWithNoYearFor(date);\n        assertThat(dateToString).isEqualTo(\"05-05\");\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/events/StandardEventTypeTest.java",
    "content": "package com.alexstyl.specialdates.events;\n\nimport com.alexstyl.specialdates.events.peopleevents.StandardEventType;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.runners.MockitoJUnitRunner;\n\nimport static com.alexstyl.specialdates.events.database.EventTypeId.TYPE_BIRTHDAY;\nimport static com.alexstyl.specialdates.events.database.EventTypeId.TYPE_NAMEDAY;\nimport static org.fest.assertions.api.Assertions.assertThat;\n\n@RunWith(MockitoJUnitRunner.class)\npublic class StandardEventTypeTest {\n\n    @Test\n    public void mapsTypeBirthdayIdToBirthdayEvent() {\n        StandardEventType eventType = StandardEventType.fromId(TYPE_BIRTHDAY);\n        assertThat(eventType).isEqualTo(StandardEventType.BIRTHDAY);\n    }\n\n    @Test\n    public void mapsTypeNamedayIdToNamedayEvent() {\n        StandardEventType eventType = StandardEventType.fromId(TYPE_NAMEDAY);\n        assertThat(eventType).isEqualTo(StandardEventType.NAMEDAY);\n    }\n\n    @Test(expected = IllegalArgumentException.class)\n    public void throwExceptionOnInvalidId() {\n        StandardEventType.fromId(5);\n    }\n\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/events/bankholidays/BankHolidayProviderTest.java",
    "content": "package com.alexstyl.specialdates.events.bankholidays;\n\n//@RunWith(MockitoJUnitRunner.class)\npublic class BankHolidayProviderTest {\n//    private static final Date GREEK_INDEPENDENCE_DAY = Date.on(25, MARCH, 1990);\n//\n//    private OrthodoxEasterCalculator calculator;\n//    private BankHolidayProvider repository;\n//\n//    @Before\n//    public void setUp() throws Exception {\n//        repository = new BankHolidayProvider(new GreekBankHolidaysCalculator(OrthodoxEasterCalculator.INSTANCE));\n////        when(calculator.calculateEasterForYear(1990)).thenReturn(Date.on(1, JANUARY, 1990));\n////        when(calculator.calculateEasterForYear(1991)).thenReturn(Date.on(1, JANUARY, 1991));\n//    }\n//\n//    @Test\n//    public void whenCheckingForSameYearTwice_thenEasterIsCalculatedOnlyOnce() {\n//        repository.getBankHolidayFor(aDateInYear(1990));\n//        repository.getBankHolidayFor(aDateInYear(1990));\n//        verify(calculator, times(1)).calculateEasterForYear(1990);\n//    }\n//\n//    @Test\n//    public void whenCheckingForDifferentYearthenEasterIsRecalculated() {\n//        repository.getBankHolidayFor(aDateInYear(1990));\n//        repository.getBankHolidayFor(aDateInYear(1991));\n//        verify(calculator, times(1)).calculateEasterForYear(1990);\n//        verify(calculator, times(1)).calculateEasterForYear(1991);\n//    }\n//\n//    @Test\n//    public void testThatAGreekKnownBankholidayIsCalculatedProperly() {\n//        Date date = GREEK_INDEPENDENCE_DAY;\n//        Optional<BankHoliday> bankHoliday = repository.getBankHolidayFor(date);\n//        assertThat(bankHoliday.get().getDate()).isEqualTo(Date.on(25, MARCH, 1990));\n//    }\n//\n//    private Date aDateInYear(int year) {\n//        return Date.on(1, JANUARY, year);\n//    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/events/namedays/NamedaysListTest.java",
    "content": "package com.alexstyl.specialdates.events.namedays;\n\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.date.Months;\n\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\nimport static org.fest.assertions.api.Assertions.assertThat;\n\npublic class NamedaysListTest {\n\n    private static final String RECURRING_NAMEDAY = \"recurring_nameday\";\n    private static final String FIXED_YEAR_NAMEDAY = \"fixed_date_nameday\";\n    private static final int FIXED_YEAR = 2015;\n    private static final int FIXED_MONTH = Months.JANUARY;\n\n    private static final NamedaysList namedays = new NamedaysList();\n\n    @BeforeClass\n    public static void setUp() {\n        populateNamedays();\n    }\n\n    private static void populateNamedays() {\n        namedays.addNameday(Date.Companion.on(1, FIXED_MONTH, FIXED_YEAR), FIXED_YEAR_NAMEDAY);\n        namedays.addNameday(Date.Companion.on(2, FIXED_MONTH, FIXED_YEAR), FIXED_YEAR_NAMEDAY);\n        namedays.addNameday(Date.Companion.on(3, FIXED_MONTH, FIXED_YEAR), FIXED_YEAR_NAMEDAY);\n\n        namedays.addNameday(Date.Companion.on(4, FIXED_MONTH), RECURRING_NAMEDAY);\n        namedays.addNameday(Date.Companion.on(5, FIXED_MONTH), RECURRING_NAMEDAY);\n\n    }\n\n    @Test\n    public void whenNoYearSpecified_thenRecurringEventIsReturned() {\n        Date dateWithNoYear = Date.Companion.on(4, FIXED_MONTH);\n\n        NamesInADate results = namedays.getNamedaysFor(dateWithNoYear);\n\n        assertThat(results.getNames().get(0)).isEqualTo(RECURRING_NAMEDAY);\n    }\n\n    @Test\n    public void whenNoYearSpecified_thenFixedYearEventIsNotReturned() {\n        Date dateWithNoYear = Date.Companion.on(1, FIXED_MONTH);\n\n        NamesInADate results = namedays.getNamedaysFor(dateWithNoYear);\n\n        assertThat(results.getNames()).isEmpty();\n    }\n\n    @Test\n    public void whenYearSpecified_thenFixedYearEventIsReturned() {\n        Date dateWithNoYear = Date.Companion.on(1, FIXED_MONTH, FIXED_YEAR);\n\n        NamesInADate results = namedays.getNamedaysFor(dateWithNoYear);\n\n        assertThat(results.getNames().get(0)).isEqualTo(FIXED_YEAR_NAMEDAY);\n    }\n\n    @Test\n    public void whenYearSpecified_thenRecurringEventIsReturned() {\n        Date date = Date.Companion.on(4, FIXED_MONTH, FIXED_YEAR);\n\n        NamesInADate results = namedays.getNamedaysFor(date);\n\n        assertThat(results.getNames().get(0)).isEqualTo(RECURRING_NAMEDAY);\n    }\n\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/events/namedays/OrthodoxEasterCalculatorTest.java",
    "content": "package com.alexstyl.specialdates.events.namedays;\n\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.events.namedays.calendar.OrthodoxEasterCalculator;\n\nimport java.util.HashMap;\n\nimport org.junit.Before;\nimport org.junit.Test;\n\nimport static com.alexstyl.specialdates.date.Months.APRIL;\nimport static com.alexstyl.specialdates.date.Months.MAY;\nimport static org.fest.assertions.api.Assertions.assertThat;\n\npublic class OrthodoxEasterCalculatorTest {\n\n    private final HashMap<Integer, Date> EXPECTED_DATES = new HashMap<>();\n    private final OrthodoxEasterCalculator calculator = new OrthodoxEasterCalculator();\n\n    @Before\n    public void initExpectedDates() {\n        addDay(2010, Date.Companion.on(4, APRIL, 2010));\n        addDay(2011, Date.Companion.on(24, APRIL, 2011));\n        addDay(2012, Date.Companion.on(15, APRIL, 2012));\n        addDay(2013, Date.Companion.on(5, MAY, 2013));\n        addDay(2014, Date.Companion.on(20, APRIL, 2014));\n        addDay(2015, Date.Companion.on(12, APRIL, 2015));\n        addDay(2016, Date.Companion.on(1, MAY, 2016));\n    }\n\n    private void addDay(int year, Date date) {\n        EXPECTED_DATES.put(year, date);\n    }\n\n    @Test\n    public void easternDatesAreCalcualtedProperly() {\n        for (int year : EXPECTED_DATES.keySet()) {\n            Date expectedDate = EXPECTED_DATES.get(year);\n            Date actualDate = calculator.calculateEasterForYear(year);\n            assertThat(actualDate).isEqualTo(expectedDate);\n            assertThatCalendarsReferToTheSameDate(expectedDate, actualDate);\n        }\n    }\n\n    private void assertThatCalendarsReferToTheSameDate(Date expectedDate, Date actualDate) {\n        assertThat(expectedDate.getYear()).isEqualTo(actualDate.getYear());\n        assertThat(expectedDate.getMonth()).isEqualTo(actualDate.getMonth());\n        assertThat(expectedDate.getDayOfMonth()).isEqualTo(actualDate.getDayOfMonth());\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/events/namedays/RomanianNamedaysTest.java",
    "content": "package com.alexstyl.specialdates.events.namedays;\n\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.events.namedays.calendar.OrthodoxEasterCalculator;\nimport com.alexstyl.specialdates.events.namedays.calendar.resource.RomanianEasterSpecialCalculator;\nimport com.alexstyl.specialdates.events.namedays.calendar.resource.RomanianNamedays;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Locale;\n\nimport org.junit.Test;\n\nimport static org.fest.assertions.api.Assertions.assertThat;\nimport static org.fest.assertions.api.Assertions.fail;\n\npublic class RomanianNamedaysTest {\n\n    private final RomanianEasterSpecialCalculator calculator = new RomanianEasterSpecialCalculator(new OrthodoxEasterCalculator());\n\n    @Test\n    public void whenCreatingRomanianNamedaysAllNamesAreReturnedCorrectly() throws Exception {\n        List<String> celebratingNames = Arrays.asList(\"Florin\", \"Viorel\", \"Viorica\", \"Florin\");\n\n        RomanianNamedays namedays = new RomanianNamedays(calculator, celebratingNames);\n\n        ArrayList<String> allNames = namedays.getAllNames();\n        assertThat(allNames).isEqualTo(celebratingNames);\n    }\n\n    @Test\n    public void whenCreatingRomanianNamedaysDateIsCalculatedProperly() throws Exception {\n        List<String> expectedNames = Arrays.asList(\"Florin\", \"Viorel\", \"Viorica\", \"Florin\");\n\n        RomanianNamedays namedays = new RomanianNamedays(calculator, expectedNames);\n\n        List<Date> expectedDates = buildExpectedDates();\n        for (Date expectedDate : expectedDates) {\n            NamesInADate allNames = namedays.getNamedaysFor(expectedDate);\n            List<String> actualNames = allNames.getNames();\n            if (!expectedNames.equals(actualNames)) {\n                fail(String.format(Locale.US, \"Year [%d] did not contain the correct names [%s]\", expectedDate.getYear(), actualNames));\n            }\n        }\n    }\n\n    private List<Date> buildExpectedDates() {\n        List<Date> dates = new ArrayList<>();\n        dates.add(Date.Companion.on(9, 4, 2017));\n        dates.add(Date.Companion.on(1, 4, 2018));\n        dates.add(Date.Companion.on(21, 4, 2019));\n        dates.add(Date.Companion.on(12, 4, 2020));\n        dates.add(Date.Companion.on(25, 4, 2021));\n        dates.add(Date.Companion.on(17, 4, 2022));\n        return dates;\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/events/namedays/activity/NamedaysInADayPresenterTest.kt",
    "content": "package com.alexstyl.specialdates.events.namedays.activity\n\nimport com.alexstyl.specialdates.addevent.ui.willReturnContacts\nimport com.alexstyl.specialdates.addevent.ui.willReturnNoContact\nimport com.alexstyl.specialdates.contact.ContactFixture.aContactCalled\nimport com.alexstyl.specialdates.contact.ContactsProvider\nimport com.alexstyl.specialdates.contact.ContactsProviderSource\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.Months.JANUARY\nimport com.alexstyl.specialdates.events.namedays.NamedayUserSettings\nimport com.alexstyl.specialdates.events.namedays.NamesInADate\nimport com.alexstyl.specialdates.events.namedays.calendar.NamedayCalendar\nimport com.alexstyl.specialdates.ui.widget.LetterPainter\nimport io.reactivex.schedulers.Schedulers\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.BDDMockito.given\nimport org.mockito.Mockito\nimport org.mockito.Mockito.verify\nimport org.mockito.runners.MockitoJUnitRunner\n\n@RunWith(MockitoJUnitRunner::class)\nclass NamedaysInADayPresenterTest {\n\n    private val mockView = Mockito.mock(NamedaysOnADayView::class.java)\n    private val LETTER_VARIANT = 5\n\n    private val ANY_DATE = Date.on(1, JANUARY, 2017)\n    private val mockNamedayCalendar = Mockito.mock(NamedayCalendar::class.java)\n    private var mockSource = Mockito.mock(ContactsProviderSource::class.java)\n    private var mockLetterPainter = Mockito.mock(LetterPainter::class.java)\n    private val mockUserSettings = Mockito.mock(NamedayUserSettings::class.java)\n\n    private lateinit var presenter: NamedaysInADayPresenter\n\n    @Before\n    fun setUp() {\n        val workScheduler = Schedulers.trampoline()\n        val resultScheduler = Schedulers.trampoline()\n\n        presenter = NamedaysInADayPresenter(\n                mockNamedayCalendar,\n                NamedaysViewModelFactory(mockLetterPainter),\n                ContactsProvider(mapOf(Pair(0, mockSource))), mockUserSettings, workScheduler, resultScheduler)\n        given(mockLetterPainter.getVariant(Mockito.anyInt())).willReturn(LETTER_VARIANT)\n        given(mockSource.allContacts).willReturnNoContact()\n    }\n\n    @Test\n    fun whenNoNamedaysExistOnASpecificDate_thenNoViewModelsArePassedToTheView() {\n        given(mockNamedayCalendar.getAllNamedaysOn(ANY_DATE)).willReturn(NamesInADate(ANY_DATE, arrayListOf()))\n        presenter.startPresenting(mockView, forDate = ANY_DATE)\n\n        Mockito.verify(mockView).displayNamedays(emptyList())\n    }\n\n    @Test\n    fun aNamedayWithAContact_returnsAViewModelWithThatContact() {\n        given(mockSource.allContacts).willReturnContacts(\"Kate Brown\")\n        given(mockNamedayCalendar.getAllNamedaysOn(ANY_DATE)).willReturn(NamesInADate(ANY_DATE, arrayListOf(\"Kate\")))\n\n        presenter.startPresenting(mockView, forDate = ANY_DATE)\n\n        verify(mockView).displayNamedays(\n                arrayListOf(\n                        NamedaysViewModel(\"Kate\"),\n                        CelebratingContactViewModel(aContactCalled(\"Kate Brown\"), \"Kate Brown\", LETTER_VARIANT)\n                ))\n    }\n\n    @Test\n    fun aNamedayWithoutRelatedContacts_returnsOnlyTheNameday() {\n        given(mockNamedayCalendar.getAllNamedaysOn(ANY_DATE)).willReturn(NamesInADate(ANY_DATE, arrayListOf(\"Kate\")))\n\n        presenter.startPresenting(mockView, forDate = ANY_DATE)\n\n        val expectedViewModels = arrayListOf(NamedaysViewModel(\"Kate\"))\n        Mockito.verify(mockView).displayNamedays(expectedViewModels)\n    }\n\n    @Test\n    fun irida() {\n        given(mockSource.allContacts).willReturnContacts(\"Irida\")\n        given(mockNamedayCalendar.getAllNamedaysOn(ANY_DATE)).willReturn(NamesInADate(ANY_DATE, arrayListOf(\"Ιριδα\")))\n\n        presenter.startPresenting(mockView, forDate = ANY_DATE)\n\n        val expectedViewModels = arrayListOf(NamedaysViewModel(\"Ιριδα\"),\n                CelebratingContactViewModel(aContactCalled(\"Irida\"), \"Irida\", LETTER_VARIANT))\n        Mockito.verify(mockView).displayNamedays(expectedViewModels)\n    }\n\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/events/namedays/calendar/resource/CharacterNodeTest.java",
    "content": "package com.alexstyl.specialdates.events.namedays.calendar.resource;\n\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.events.namedays.NameCelebrations;\n\nimport org.junit.Test;\n\nimport static org.fest.assertions.api.Assertions.assertThat;\n\npublic class CharacterNodeTest {\n\n    @Test\n    public void addingADate_isPlacedUnderTheRightNode() {\n        Node node = new CharacterNode();\n        Date date = Date.Companion.on(1, 2, 1990);\n        node.addDate(\"Alex\", date);\n\n        NameCelebrations extracted = node.getDates(\"Alex\");\n        assertThat(extracted.getDate(0)).isEqualTo(date);\n    }\n\n    @Test\n    public void gettingDateFromEmptyNodeReturnsNoDates() throws Exception {\n        Node node = new CharacterNode();\n        NameCelebrations extracted = node.getDates(\"Alex\");\n        assertThat(extracted.getDates().size()).isZero();\n    }\n\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/events/namedays/calendar/resource/GreeklishParserTest.java",
    "content": "package com.alexstyl.specialdates.events.namedays.calendar.resource;\n\nimport com.alexstyl.specialdates.events.namedays.NameCelebrations;\nimport com.alexstyl.specialdates.events.namedays.NamedayBundle;\nimport com.alexstyl.specialdates.events.namedays.NamedayLocale;\n\nimport org.json.JSONException;\nimport org.junit.Before;\nimport org.junit.Test;\n\nimport static org.fest.assertions.api.Assertions.assertThat;\n\npublic class GreeklishParserTest {\n\n    private NamedayJSON namedayJSON;\n\n    @Before\n    public void setUp() throws JSONException {\n        TestJSONResourceLoader resourceLoader = new TestJSONResourceLoader();\n        NamedayJSONProvider resourceProvider = new NamedayJSONProvider(resourceLoader);\n        namedayJSON = resourceProvider.getNamedayJSONFor(NamedayLocale.GREEK);\n\n    }\n\n    @Test\n    public void alexandrosNamedayIsReturnedCorrectly() {\n        NamedayBundle namedayBundle = NamedayJSONParser.getNamedaysFromJSONasSounds(namedayJSON);\n        NameCelebrations dates = namedayBundle.getDatesFor(\"Αλέξανδρος\");\n        NameCelebrations datesGreeklish = namedayBundle.getDatesFor(\"Aleksandros\");\n        assertThatContainsSamedate(dates, datesGreeklish);\n    }\n\n    @Test\n    public void davidNamedayIsReturnedCorrectly() {\n        NamedayBundle namedayBundle = NamedayJSONParser.getNamedaysFromJSONasSounds(namedayJSON);\n        NameCelebrations dates = namedayBundle.getDatesFor(\"Δαβίδ\");\n        NameCelebrations datesGreeklish = namedayBundle.getDatesFor(\"David\");\n        assertThatContainsSamedate(dates, datesGreeklish);\n    }\n\n    @Test\n    public void magdoulaNamedayIsReturnedCorrectly() {\n        NamedayBundle namedayBundle = NamedayJSONParser.getNamedaysFromJSONasSounds(namedayJSON);\n        NameCelebrations dates = namedayBundle.getDatesFor(\"Αμαλία\");\n        NameCelebrations datesGreeklish = namedayBundle.getDatesFor(\"Amalia\");\n        assertThatContainsSamedate(dates, datesGreeklish);\n    }\n\n    private void assertThatContainsSamedate(NameCelebrations dates, NameCelebrations dates2) {\n        assertThat(dates.getDate(0)).isEqualTo(dates2.getDate(0));\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/events/namedays/calendar/resource/NamedayJSONParserTest.java",
    "content": "package com.alexstyl.specialdates.events.namedays.calendar.resource;\n\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.date.Dates;\nimport com.alexstyl.specialdates.events.namedays.NameCelebrations;\nimport com.alexstyl.specialdates.events.namedays.NamedayBundle;\nimport com.alexstyl.specialdates.events.namedays.NamedayLocale;\n\nimport org.json.JSONException;\nimport org.junit.Before;\nimport org.junit.Test;\n\nimport static com.alexstyl.specialdates.date.Months.*;\nimport static org.fest.assertions.api.Assertions.assertThat;\nimport static org.fest.assertions.api.Assertions.fail;\n\npublic class NamedayJSONParserTest {\n\n    private NamedayJSON namedayJSON;\n\n    @Before\n    public void setUp() throws JSONException {\n        TestJSONResourceLoader resourceLoader = new TestJSONResourceLoader();\n        NamedayJSONProvider resourceProvider = new NamedayJSONProvider(resourceLoader);\n        namedayJSON = resourceProvider.getNamedayJSONFor(NamedayLocale.GREEK);\n\n    }\n\n    @Test\n    public void returningBundleHasNames() {\n        NamedayBundle namedayBundle = NamedayJSONParser.getNamedaysFrom(namedayJSON);\n        assertThat(namedayBundle.getNames()).isNotEmpty();\n    }\n\n    @Test\n    public void alexandrosNamedayIsReturnedCorrectly() {\n        NamedayBundle namedayBundle = NamedayJSONParser.getNamedaysFrom(namedayJSON);\n        NameCelebrations dates = namedayBundle.getDatesFor(\"Αλέξανδρος\");\n        assertThatContainsDate(dates, Date.Companion.on(30, AUGUST));\n    }\n\n    @Test\n    public void davidNamedayIsReturnedCorrectly() {\n        NamedayBundle namedayBundle = NamedayJSONParser.getNamedaysFrom(namedayJSON);\n        NameCelebrations dates = namedayBundle.getDatesFor(\"Δαβίδ\");\n        assertThatContainsDate(dates, Date.Companion.on(26, JUNE));\n    }\n\n    @Test\n    public void amaliaNamedayIsReturnedCorrectly() {\n        NamedayBundle namedayBundle = NamedayJSONParser.getNamedaysFrom(namedayJSON);\n        NameCelebrations dates = namedayBundle.getDatesFor(\"Αμαλία\");\n        assertThatContainsDate(dates, Date.Companion.on(10, JULY));\n    }\n\n    private static void assertThatContainsDate(NameCelebrations celebrations, Date date) {\n        Dates dates = celebrations.getDates();\n        int index = 0;\n        while (index < dates.size()) {\n            if (celebrations.getDate(index).equals(date)) {\n                return;\n            }\n            index++;\n        }\n\n        fail(\"Couldn't find date \" + date + \" inside \" + celebrations);\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/events/namedays/calendar/resource/RomanianEasterSpecialCalculatorTest.kt",
    "content": "package com.alexstyl.specialdates.events.namedays.calendar.resource\n\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.events.namedays.calendar.OrthodoxEasterCalculator\nimport org.fest.assertions.api.Assertions.assertThat\nimport org.junit.Test\n\nclass RomanianEasterSpecialCalculatorTest {\n\n    private var orthodoxEasterCalculator = OrthodoxEasterCalculator()\n\n    @Test\n    fun calculatesSundayBeforeEasterCorrectly() {\n        val calculator = RomanianEasterSpecialCalculator(orthodoxEasterCalculator)\n        val expectedDates = buildExpectedDates()\n        for (expectedDate in expectedDates) {\n            val actualDate = calculator.calculateSpecialRomanianDayForYear(expectedDate.year)\n            assertThat(expectedDate).isEqualTo(actualDate)\n        }\n    }\n\n    private fun buildExpectedDates(): List<Date> =\n            listOf(Date.on(9, 4, 2017),\n                    Date.on(1, 4, 2018),\n                    Date.on(21, 4, 2019),\n                    Date.on(12, 4, 2020),\n                    Date.on(25, 4, 2021),\n                    Date.on(17, 4, 2022))\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/events/namedays/calendar/resource/SoundNodeTest.kt",
    "content": "package com.alexstyl.specialdates.events.namedays.calendar.resource\n\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.Months.AUGUST\nimport com.alexstyl.specialdates.date.Months.MARCH\nimport com.alexstyl.specialdates.date.Months.OCTOBER\nimport com.alexstyl.specialdates.events.namedays.NameCelebrations\nimport org.fest.assertions.api.Assertions.assertThat\nimport org.junit.Test\n\nclass SoundNodeTest {\n\n    @Test\n    fun simpleCase() {\n        val node = SoundNode().apply {\n            addDate(\"A\", Date.on(30, AUGUST, 1990))\n        }\n\n        val returningDate = node.getDates(\"A\")\n\n        assertThat(returningDate).isEqualTo(NameCelebrations(\"A\", Date.on(30, AUGUST, 1990)))\n    }\n\n    @Test\n    fun whenAddingNameAndDateCombination_thenTheCorrectCombinationIsReturned() {\n        val node = SoundNode().apply {\n            addDate(\"Alex\", Date.on(30, AUGUST, 1990))\n        }\n\n        val returningDate = node.getDates(\"Alex\")\n\n        assertThat(returningDate).isEqualTo(NameCelebrations(\"Alex\", Date.on(30, AUGUST, 1990)))\n    }\n\n    @Test\n    fun addingMultipleNames_thenReturnCorrectDates() {\n        val node = SoundNode().apply {\n            addDate(\"Alex\", Date.on(30, AUGUST, 1990))\n            addDate(\"Alexandros\", Date.on(5, OCTOBER, 1990))\n            addDate(\"Banana\", Date.on(11, MARCH, 1990))\n        }\n\n        assertThat(node.getDates(\"Alex\")).isEqualTo(NameCelebrations(\"Alex\", Date.on(30, AUGUST, 1990)))\n        assertThat(node.getDates(\"Alexandros\")).isEqualTo(NameCelebrations(\"Alexandros\", Date.on(5, OCTOBER, 1990)))\n        assertThat(node.getDates(\"Banana\")).isEqualTo(NameCelebrations(\"Banana\", Date.on(11, MARCH, 1990)))\n    }\n\n\n    @Test\n    fun whenAddingNameAndDateCombination_thenTheAskingFor() {\n        val node = SoundNode().apply {\n            addDate(\"Alex\", Date.on(30, AUGUST, 1990))\n        }\n\n        val returningDate = node.getDates(\"Alexandros\")\n\n        assertThat(returningDate).isEqualTo(NameCelebrations(\"Alexandros\"))\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/events/namedays/calendar/resource/TestJSONResourceLoader.kt",
    "content": "package com.alexstyl.specialdates.events.namedays.calendar.resource\n\nimport com.alexstyl.specialdates.events.namedays.NamedayLocale\nimport org.json.JSONException\nimport org.json.JSONObject\nimport java.io.BufferedReader\nimport java.io.IOException\nimport java.io.InputStream\nimport java.io.InputStreamReader\n\nclass TestJSONResourceLoader : NamedayJSONResourceLoader {\n\n    @Throws(JSONException::class)\n    override fun loadJSON(locale: NamedayLocale): JSONObject {\n        var stream: InputStream? = null\n        try {\n            stream = CLASS_LOADER.getResourceAsStream(\"gr_namedays.json\")\n\n            val bufferedReader = BufferedReader(InputStreamReader(stream!!))\n            return JSONObject(bufferedReader.readLine())\n        } catch (e: IOException) {\n            throw JSONException(e.message)\n        } finally {\n            try {\n                stream?.close()\n            } catch (e: IOException) {\n                e.printStackTrace()\n            }\n\n        }\n    }\n\n    private val CLASS_LOADER = Thread.currentThread().contextClassLoader\n\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/events/namedays/calendar/resource/TestNamedayCalendarBuilder.java",
    "content": "package com.alexstyl.specialdates.events.namedays.calendar.resource;\n\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.events.namedays.NamedayLocale;\nimport com.alexstyl.specialdates.events.namedays.calendar.NamedayCalendar;\nimport com.alexstyl.specialdates.events.namedays.calendar.OrthodoxEasterCalculator;\n\npublic class TestNamedayCalendarBuilder {\n    private NamedayLocale locale = NamedayLocale.GREEK;\n    private int year = Date.Companion.getCURRENT_YEAR();\n    private final OrthodoxEasterCalculator orthodoxEasterCalculator = new OrthodoxEasterCalculator();\n    private SpecialNamedaysHandlerFactory factory = new SpecialNamedaysHandlerFactory(\n            orthodoxEasterCalculator,\n            new RomanianEasterSpecialCalculator(orthodoxEasterCalculator)\n    );\n\n    public TestNamedayCalendarBuilder forLocale(NamedayLocale locale) {\n        this.locale = locale;\n        return this;\n    }\n\n    public TestNamedayCalendarBuilder forYear(int year) {\n        this.year = year;\n        return this;\n    }\n\n    public NamedayCalendar build() {\n        NamedayJSONProvider jsonProvider = new NamedayJSONProvider(new TestJSONResourceLoader());\n        NamedayCalendarProvider namedayCalendarProvider = new NamedayCalendarProvider(jsonProvider, factory);\n        return namedayCalendarProvider.loadNamedayCalendarForLocale(locale, year);\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/events/peopleevents/ClosestEventsComparatorTest.java",
    "content": "package com.alexstyl.specialdates.events.peopleevents;\n\nimport com.alexstyl.specialdates.Optional;\nimport com.alexstyl.specialdates.date.ContactEvent;\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.date.Months;\n\nimport java.util.ArrayList;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.runners.MockitoJUnitRunner;\n\nimport static com.alexstyl.specialdates.date.Date.Companion;\nimport static com.alexstyl.specialdates.date.Months.FEBRUARY;\nimport static com.alexstyl.specialdates.date.Months.JANUARY;\nimport static org.fest.assertions.api.Assertions.assertThat;\n\n@RunWith(MockitoJUnitRunner.class)\npublic class ClosestEventsComparatorTest {\n\n    private ClosestEventsComparator comparator = new ClosestEventsComparator();\n\n    @Test\n    public void bothOptionalsReturnZero() {\n        assertThat(comparator.compare(absent(), absent())).isZero();\n    }\n\n    @Test\n    public void onlyAIsPresentWins() {\n        Optional<ContactEventsOnADate> optionalA = anOptional(Companion.on(1, JANUARY, 1990));\n        assertThat(comparator.compare(optionalA, absent())).isNegative();\n    }\n\n    @Test\n    public void onlyBIsPresentWins() {\n        Optional<ContactEventsOnADate> optionalB = anOptional(Companion.on(1, JANUARY, 1990));\n        assertThat(comparator.compare(absent(), optionalB)).isPositive();\n    }\n\n    @Test\n    public void aWinsB() {\n        Optional<ContactEventsOnADate> optionalA = anOptional(Companion.on(1, JANUARY, 1990));\n        Optional<ContactEventsOnADate> optionalB = anOptional(Companion.on(5, FEBRUARY, 1990));\n        assertThat(comparator.compare(optionalA, optionalB)).isNegative();\n    }\n\n    @Test\n    public void bWinsA() {\n        Optional<ContactEventsOnADate> optionalA = anOptional(Companion.on(5, FEBRUARY, 1990));\n        Optional<ContactEventsOnADate> optionalB = anOptional(Companion.on(1, JANUARY, 1990));\n        assertThat(comparator.compare(optionalA, optionalB)).isPositive();\n    }\n\n    @Test\n    public void aPresentButBAbsent_thenAWins() {\n        Optional<ContactEventsOnADate> optionalA = new Optional<>(ContactEventsOnADate.Companion.createFrom(Companion.on(1, JANUARY, 1990), new ArrayList<ContactEvent>()));\n        Optional<ContactEventsOnADate> optionalB = absent();\n\n        assertThat(comparator.compare(optionalA, optionalB)).isNegative();\n    }\n\n    @Test\n    public void sameDate_returnsZero() {\n        Optional<ContactEventsOnADate> optionalA = anOptional(Companion.on(5, Months.APRIL, 2016));\n        Optional<ContactEventsOnADate> optionalB = anOptional(Companion.on(5, Months.APRIL, 2016));\n\n        assertThat(comparator.compare(optionalA, optionalB)).isZero();\n    }\n\n    private static Optional<ContactEventsOnADate> anOptional(Date date) {\n        return new Optional<>(ContactEventsOnADate.Companion.createFrom(date, new ArrayList<ContactEvent>()));\n    }\n\n    private static Optional<ContactEventsOnADate> absent() {\n        return Optional.Companion.absent();\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/events/peopleevents/CompositePeopleEventsProviderTest.kt",
    "content": "package com.alexstyl.specialdates.events.peopleevents\n\nimport com.alexstyl.specialdates.TestContactEventsBuilder\nimport com.alexstyl.specialdates.contact.ContactFixture\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.Months.*\nimport org.fest.assertions.api.Assertions.assertThat\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.BDDMockito.given\nimport org.mockito.Mock\nimport org.mockito.runners.MockitoJUnitRunner\n\n@RunWith(MockitoJUnitRunner::class)\nclass CompositePeopleEventsProviderTest {\n\n    @Mock\n    private lateinit var mockDeviceEvents: PeopleEventsProvider\n    @Mock\n    private lateinit var mockPeopleDynamicNamedaysProvider: PeopleDynamicNamedaysProvider\n\n    private lateinit var peopleEventsProvider: CompositePeopleEventsProvider\n\n    @Before\n    fun setUp() {\n        peopleEventsProvider = CompositePeopleEventsProvider(\n                listOf(mockDeviceEvents, mockPeopleDynamicNamedaysProvider)\n        )\n    }\n\n    @Test\n    fun whenOnlyDeviceEventsExist_willReturnsOnlyThoseEvents() {\n        val date = Date.on(1, JANUARY, 2017)\n        val expectedEvents = TestContactEventsBuilder().addAnniversaryFor(PETER, date).build()\n\n        given(mockDeviceEvents.fetchEventsOn(date)).willReturn(ContactEventsOnADate.createFrom(date, expectedEvents))\n        mockPeopleDynamicNamedaysProvider.willReturnNoEventsOn(date)\n\n        val events = peopleEventsProvider.fetchEventsOn(date)\n        assertThat(events.events).containsOnly(expectedEvents[0])\n    }\n\n    @Test\n    fun whenOnlyNamedaysExist_willReturnsOnlyThoseEvents() {\n        val theDate = Date.on(1, JANUARY, 2017)\n\n        val expectedEvents = ContactEventsOnADate.createFrom(theDate, TestContactEventsBuilder().addNamedayFor(PETER, theDate).build())\n        given(mockPeopleDynamicNamedaysProvider.fetchEventsOn(theDate)).willReturn(expectedEvents)\n        mockDeviceEvents.willReturnNoEventsOn(theDate)\n\n        val actualEventsOnADate = peopleEventsProvider.fetchEventsOn(theDate)\n        assertThat(actualEventsOnADate).isEqualTo(expectedEvents)\n    }\n\n    @Test\n    fun whenBothDeviceAndNamedaysEventsExist_thenAllEventsAreReturnedCorrectly() {\n        val date = Date.on(1, JANUARY, 2017)\n        val expectedDynamicEvents = TestContactEventsBuilder().addNamedayFor(PETER, date).build()\n        val expectedStaticEvents = TestContactEventsBuilder().addAnniversaryFor(PETER, date).build()\n\n        given(mockPeopleDynamicNamedaysProvider.fetchEventsOn(date)).willReturn(ContactEventsOnADate.createFrom(date, expectedDynamicEvents))\n        given(mockDeviceEvents.fetchEventsOn(date)).willReturn(ContactEventsOnADate.createFrom(date, expectedStaticEvents))\n\n        val events = peopleEventsProvider.fetchEventsOn(date)\n        assertThat(events.events).containsAll(expectedDynamicEvents)\n        assertThat(events.events).containsAll(expectedStaticEvents)\n    }\n\n    @Test(expected = NoEventsFoundException::class)\n    @Throws(NoEventsFoundException::class)\n    fun whenNoEventsExist_thenThrowsException() {\n        val aDate = Date.on(1, JANUARY, 2017)\n\n        mockDeviceEvents.willReturnNoEventsOn(aDate)\n        mockPeopleDynamicNamedaysProvider.willReturnNoEventsOn(aDate)\n\n        peopleEventsProvider.findClosestEventDateOnOrAfter(aDate)\n    }\n\n    @Test\n    fun onlyDynamicEvents_returnsTheDynamicEvents() {\n        val aDate = Date.on(2, MARCH, 2017)\n\n        given(mockDeviceEvents.findClosestEventDateOnOrAfter(aDate)).willReturn(null)\n        given(mockDeviceEvents.fetchEventsOn(aDate)).willReturn(ContactEventsOnADate.createFrom(aDate, emptyList()))\n\n        given(mockPeopleDynamicNamedaysProvider.findClosestEventDateOnOrAfter(aDate)).willReturn(aDate)\n\n        val expectedEvents = TestContactEventsBuilder()\n                .addNamedayFor(PETER, aDate)\n                .build()\n        given(mockPeopleDynamicNamedaysProvider.fetchEventsOn(aDate)).willReturn(ContactEventsOnADate.createFrom(aDate, expectedEvents))\n\n        val actualEvents = peopleEventsProvider.findClosestEventDateOnOrAfter(aDate)\n        val events = peopleEventsProvider.fetchEventsOn(actualEvents!!)\n        assertThat(events).isEqualTo(ContactEventsOnADate.createFrom(aDate, expectedEvents))\n    }\n\n    companion object {\n        private val PETER = ContactFixture.aContactCalled(\"Peter\")\n    }\n\n    @Test\n    fun findClosestEventDateOnOrAfterReturnsTheClosest() {\n        val date = Date.on(5, JANUARY, 2018)\n\n        given(mockDeviceEvents.findClosestEventDateOnOrAfter(date)).willReturn(Date.on(29, DECEMBER, 2018))\n        given(mockPeopleDynamicNamedaysProvider.findClosestEventDateOnOrAfter(date)).willReturn(Date.on(6, JANUARY,2018))\n\n        assertThat(peopleEventsProvider.findClosestEventDateOnOrAfter(date)).isEqualTo(Date.on(6, JANUARY, 2018))\n    }\n}\n\n\nprivate fun PeopleEventsProvider.willReturnNoEventsOn(date: Date) {\n    given(fetchEventsOn(date)).willReturn(ContactEventsOnADate.createFrom(date, emptyList()))\n    given(findClosestEventDateOnOrAfter(date)).willThrow(NoEventsFoundException::class.java)\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/events/peopleevents/ContactEventsOnADateTest.kt",
    "content": "package com.alexstyl.specialdates.events.peopleevents\n\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.Months\nimport org.junit.Test\n\nclass ContactEventsOnADateTest {\n\n    @Test(expected = UnsupportedOperationException::class)\n    fun whenAddingTwoEvents_givenTheDateAreDifferent_thenThrowsException() {\n        eventOn(Date.on(13, Months.JANUARY, 1922)) +\n                eventOn(Date.on(1, Months.APRIL, 1922))\n    }\n\n    private fun eventOn(date: Date) = ContactEventsOnADate.createFrom(date, emptyList())\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/events/peopleevents/PeopleDynamicNamedaysProviderTest.kt",
    "content": "package com.alexstyl.specialdates.events.peopleevents\n\nimport com.alexstyl.specialdates.contact.Contact\nimport com.alexstyl.specialdates.contact.ContactFixture\nimport com.alexstyl.specialdates.contact.Contacts\nimport com.alexstyl.specialdates.contact.ContactsProvider\nimport com.alexstyl.specialdates.contact.ContactsProviderSource\nimport com.alexstyl.specialdates.date.TimePeriod\nimport com.alexstyl.specialdates.events.namedays.NamedayLocale\nimport com.alexstyl.specialdates.events.namedays.NamedayUserSettings\nimport com.alexstyl.specialdates.events.namedays.calendar.OrthodoxEasterCalculator\nimport com.alexstyl.specialdates.events.namedays.calendar.resource.NamedayCalendarProvider\nimport com.alexstyl.specialdates.events.namedays.calendar.resource.TestNamedayCalendarBuilder\nimport org.fest.assertions.api.Assertions.assertThat\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.BDDMockito.given\nimport org.mockito.Matchers.any\nimport org.mockito.Mock\nimport org.mockito.runners.MockitoJUnitRunner\n\n@RunWith(MockitoJUnitRunner::class)\nclass PeopleDynamicNamedaysProviderTest {\n\n    private lateinit var calculator: PeopleDynamicNamedaysProvider\n    @Mock\n    private lateinit var namedayCalendarProvider: NamedayCalendarProvider\n    @Mock\n    private lateinit var mockSettings: NamedayUserSettings\n    @Mock\n    private lateinit var mockSource: ContactsProviderSource\n    private val EASTER_CELEBRATING_CONTACT = ContactFixture.aContactCalled(\"Λάμπρος\")\n\n    @Before\n    fun setUp() {\n        val namedayCalendar = TestNamedayCalendarBuilder()\n                .forLocale(LOCALE)\n                .forYear(YEAR)\n                .build()\n\n        given(namedayCalendarProvider.loadNamedayCalendarForLocale(any(NamedayLocale::class.java), any(Int::class.java))).willReturn(namedayCalendar)\n        given(mockSettings.selectedLanguage).willReturn(LOCALE)\n        given(mockSettings.isEnabled).willReturn(true)\n        calculator = PeopleDynamicNamedaysProvider(mockSettings, namedayCalendarProvider,\n                ContactsProvider(mapOf(Pair(1, mockSource)))\n        )\n\n    }\n\n    @Test\n    fun gettingSpecialNamedaysOnSpecificDateOnlyReturnsTheEventsForThatDate() {\n        val testContacts = createSomeContacts()\n        testContacts.add(EASTER_CELEBRATING_CONTACT)\n        given(mockSource.allContacts).willReturn(Contacts(1, testContacts))\n\n        val orthodoxEasterCalculator = OrthodoxEasterCalculator()\n        val easterDate = orthodoxEasterCalculator.calculateEasterForYear(YEAR)\n        val contactEvents = calculator.fetchEventsBetween(TimePeriod.between(easterDate, easterDate))\n        assertThat(contactEvents).hasSize(1)\n        assertThat(contactEvents[0].contact).isEqualTo(EASTER_CELEBRATING_CONTACT)\n    }\n\n    private fun createSomeContacts(): MutableList<Contact> = arrayListOf(\n            ContactFixture.aContactCalled(\"Αβδηρος\"),\n            ContactFixture.aContactCalled(\"Αγις\")\n    )\n\n    companion object {\n\n        private val LOCALE = NamedayLocale.GREEK\n\n        private const val YEAR = 2016\n    }\n\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/facebook/friendimport/FacebookBirthdaysProviderTest.java",
    "content": "package com.alexstyl.specialdates.facebook.friendimport;\n\nimport com.alexstyl.specialdates.CrashAndErrorTracker;\nimport com.alexstyl.specialdates.date.ContactEvent;\nimport com.alexstyl.specialdates.date.DateParser;\n\nimport java.net.MalformedURLException;\nimport java.net.URL;\nimport java.util.List;\n\nimport org.junit.Test;\n\nimport static org.fest.assertions.api.Assertions.assertThat;\n\npublic class FacebookBirthdaysProviderTest {\n\n    private static final String CALENDAR_URL = \"https://www.facebook.com/ical/b.php?locale=en_US&uid=100010984206219&key=AQCdZHp_7d_O82DZ\";\n    private CrashAndErrorTracker tracker = new SystemLogTracker();\n    private DateParser parser = new DateParser(new SystemLogTracker());\n\n    @Test\n    public void parseMockCalendar() throws CalendarFetcherException, MalformedURLException {\n        FacebookContactFactory factory = new FacebookContactFactory(parser);\n        FacebookBirthdaysProvider fetcher = new FacebookBirthdaysProvider(new FacebookCalendarLoader(), new ContactEventSerialiser(factory, tracker));\n        URL url = new URL(CALENDAR_URL);\n\n        List<ContactEvent> contacts = fetcher.fetchCalendarFrom(url);\n        assertThat(contacts).isNotEmpty();\n    }\n\n    @Test\n    public void parsingRandomURLreturnsNoEvents() throws CalendarFetcherException, MalformedURLException {\n        FacebookContactFactory factory = new FacebookContactFactory(parser);\n        FacebookBirthdaysProvider fetcher = new FacebookBirthdaysProvider(new FacebookCalendarLoader(), new ContactEventSerialiser(factory, tracker));\n        URL url = new URL(\"https://www.google.com\");\n\n        List<ContactEvent> contactEvents = fetcher.fetchCalendarFrom(url);\n        assertThat(contactEvents.isEmpty());\n\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/facebook/friendimport/FacebookContactFactoryTest.java",
    "content": "package com.alexstyl.specialdates.facebook.friendimport;\n\nimport com.alexstyl.specialdates.contact.DisplayName;\nimport com.alexstyl.specialdates.contact.Contact;\nimport com.alexstyl.specialdates.date.ContactEvent;\nimport com.alexstyl.specialdates.date.DateParseException;\nimport com.alexstyl.specialdates.date.DateParser;\n\nimport java.util.HashMap;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.runners.MockitoJUnitRunner;\n\nimport static org.fest.assertions.api.Assertions.assertThat;\n\n@RunWith(MockitoJUnitRunner.class)\npublic class FacebookContactFactoryTest {\n\n    private FacebookContactFactory factory;\n\n    @Before\n    public void setUp() {\n        factory = new FacebookContactFactory(new DateParser(new SystemLogTracker()));\n    }\n\n    @Test\n    public void name() throws DateParseException, InvalidFacebookContactException {\n        HashMap<String, String> map = new HashMap<>();\n        map.put(\"UID\", \"b123124@facebook.com\");\n        map.put(\"DTSTART\", \"20180612\");\n        map.put(\"SUMMARY\", \"Thanasis Thomopoulos's birthday\");\n        ContactEvent contactEvent = factory.createContactFrom(map);\n        Contact contact = contactEvent.getContact();\n        assertThat(contact.getDisplayName()).isEqualTo(DisplayName.Companion.from(\"Thanasis Thomopoulos\"));\n        assertThat(contact.getContactID()).isEqualTo(123124);\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/facebook/friendimport/MockCalendarLoader.java",
    "content": "package com.alexstyl.specialdates.facebook.friendimport;\n\nimport java.io.BufferedInputStream;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.net.URL;\n\nclass MockCalendarLoader implements CalendarLoader {\n\n    @Override\n    public InputStream loadFrom(URL url) throws IOException {\n        FileInputStream stream = new FileInputStream(pathToMock());\n        return new BufferedInputStream(stream);\n    }\n\n    private static String pathToMock() {\n        return \"android_mobile\" + File.separator +\n                \"src\" + File.separator +\n                \"debug\" + File.separator +\n                \"assets\" + File.separator +\n                \"mock\" + File.separator +\n                \"facebook-calendar.ics\";\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/facebook/friendimport/SystemLogTracker.kt",
    "content": "package com.alexstyl.specialdates.facebook.friendimport\n\nimport com.alexstyl.specialdates.CrashAndErrorTracker\nimport com.alexstyl.specialdates.events.namedays.NamedayLocale\n\nclass SystemLogTracker : CrashAndErrorTracker {\n\n    override fun track(e: Throwable) {\n        e.printStackTrace()\n    }\n\n    override fun log(message: String) {\n        println(message)\n    }\n\n    override fun startTracking() {\n        // do nothing\n    }\n\n    override fun onNamedayLocaleChanged(locale: NamedayLocale) {\n        // do nothing\n    }\n\n    override fun updateLocaleUsed() {\n        // do nothing\n\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/person/AgeCalculatorTest.kt",
    "content": "package com.alexstyl.specialdates.person\n\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.Months\nimport org.fest.assertions.api.Assertions.assertThat\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.runners.MockitoJUnitRunner\n\n@RunWith(MockitoJUnitRunner::class)\nclass AgeCalculatorTest {\n\n    @Test\n    fun birthdayWithoutYear_returnsNoAge() {\n        val ageCalculator = AgeCalculator(Date.on(5, Months.MARCH, 2017))\n        val ageOf = ageCalculator.ageOf(Date.on(4, Months.MARCH))\n        assertThat(ageOf).isEqualTo(\"\")\n    }\n\n    @Test\n    fun birthdayBeforeToday() {\n        val ageCalculator = AgeCalculator(Date.on(5, Months.MARCH, 2017))\n        val ageOf = ageCalculator.ageOf(Date.on(4, Months.MARCH, 1990))\n        assertThat(ageOf).isEqualTo(\"27\")\n    }\n\n    @Test\n    fun birthdayAfterToday() {\n        val ageCalculator = AgeCalculator(Date.on(5, Months.MARCH, 2017))\n        val ageOf = ageCalculator.ageOf(Date.on(8, Months.MARCH, 1990))\n        assertThat(ageOf).isEqualTo(\"26\")\n    }\n\n    @Test\n    fun birthdayOnToday() {\n        val ageCalculator = AgeCalculator(Date.on(18, Months.AUGUST, 2017))\n        val ageOf = ageCalculator.ageOf(Date.on(18, Months.AUGUST, 2017))\n        assertThat(ageOf).isEqualTo(\"\")\n    }\n\n    @Test\n    fun dateOfBirthOnFuture() {\n        val ageCalculator = AgeCalculator(Date.on(17, Months.AUGUST, 2017))\n        val ageOf = ageCalculator.ageOf(Date.on(18, Months.AUGUST, 2017))\n        assertThat(ageOf).isEqualTo(\"\")\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/person/StarSignTest.kt",
    "content": "package com.alexstyl.specialdates.person\n\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.Months\nimport org.fest.assertions.api.Assertions\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.runners.MockitoJUnitRunner\n\n@RunWith(MockitoJUnitRunner::class)\nclass StarSignTest{\n    @Test\n    fun aquarius() {\n        var resultingStarSign = StarSign.forDateOfBirth(Date.on(1, Months.FEBRUARY))\n        Assertions.assertThat(resultingStarSign).isEqualTo(StarSign.AQUARIUS)\n    }\n\n    @Test\n    fun pisces() {\n        var resultingStarSign = StarSign.forDateOfBirth(Date.on(1, Months.MARCH))\n        Assertions.assertThat(resultingStarSign).isEqualTo(StarSign.PISCES)\n    }\n\n    @Test\n    fun aries() {\n        var resultingStarSign = StarSign.forDateOfBirth(Date.on(19, Months.APRIL))\n        Assertions.assertThat(resultingStarSign).isEqualTo(StarSign.ARIES)\n    }\n\n    @Test\n    fun taurus() {\n        var resultingStarSign = StarSign.forDateOfBirth(Date.on(30, Months.APRIL))\n        Assertions.assertThat(resultingStarSign).isEqualTo(StarSign.TAURUS)\n    }\n\n    @Test\n    fun gemini() {\n        var resultingStarSign = StarSign.forDateOfBirth(Date.on(19, Months.JUNE))\n        Assertions.assertThat(resultingStarSign).isEqualTo(StarSign.GEMINI)\n    }\n\n    @Test\n    fun cancer() {\n        var resultingStarSign = StarSign.forDateOfBirth(Date.on(20, Months.JULY))\n        Assertions.assertThat(resultingStarSign).isEqualTo(StarSign.CANCER)\n    }\n\n    @Test\n    fun leo() {\n        var resultingStarSign = StarSign.forDateOfBirth(Date.on(19, Months.AUGUST))\n        Assertions.assertThat(resultingStarSign).isEqualTo(StarSign.LEO)\n    }\n\n    @Test\n    fun virgo() {\n        var resultingStarSign = StarSign.forDateOfBirth(Date.on(23, Months.AUGUST))\n        Assertions.assertThat(resultingStarSign).isEqualTo(StarSign.VIRGO)\n    }\n\n    @Test\n    fun libra() {\n        var resultingStarSign = StarSign.forDateOfBirth(Date.on(23, Months.SEPTEMBER))\n        Assertions.assertThat(resultingStarSign).isEqualTo(StarSign.LIBRA)\n    }\n\n    @Test\n    fun scorpio() {\n        var resultingStarSign = StarSign.forDateOfBirth(Date.on(5, Months.NOVEMBER))\n        Assertions.assertThat(resultingStarSign).isEqualTo(StarSign.SCORPIO)\n    }\n\n    @Test\n    fun sagittarius() {\n        var resultingStarSign = StarSign.forDateOfBirth(Date.on(19, Months.DECEMBER))\n        Assertions.assertThat(resultingStarSign).isEqualTo(StarSign.SAGITTARIUS)\n    }\n\n\n    @Test\n    fun capricorn() {\n        var resultingStarSign = StarSign.forDateOfBirth(Date.on(8, Months.JANUARY))\n        Assertions.assertThat(resultingStarSign).isEqualTo(StarSign.CAPRICORN)\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/search/ContactEventTestBuilder.java",
    "content": "package com.alexstyl.specialdates.search;\n\nimport com.alexstyl.specialdates.Optional;\nimport com.alexstyl.specialdates.contact.Contact;\nimport com.alexstyl.specialdates.date.ContactEvent;\nimport com.alexstyl.specialdates.date.Date;\n\nimport static com.alexstyl.specialdates.events.peopleevents.StandardEventType.ANNIVERSARY;\nimport static com.alexstyl.specialdates.events.peopleevents.StandardEventType.BIRTHDAY;\nimport static com.alexstyl.specialdates.events.peopleevents.StandardEventType.NAMEDAY;\n\nfinal class ContactEventTestBuilder {\n\n    private static final Optional<Long> NO_DEVICE_EVENT_ID = Optional.Companion.absent();\n\n    private final Contact contact;\n\n    ContactEventTestBuilder(Contact contact) {\n        this.contact = contact;\n    }\n\n    ContactEvent buildBirthday(Date date) {\n        return new ContactEvent(NO_DEVICE_EVENT_ID, BIRTHDAY, date, contact);\n    }\n\n    ContactEvent buildNameday(Date date) {\n        return new ContactEvent(NO_DEVICE_EVENT_ID, NAMEDAY, date, contact);\n    }\n\n    ContactEvent buildAnniversary(Date date) {\n        return new ContactEvent(NO_DEVICE_EVENT_ID, ANNIVERSARY, date, contact);\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/search/EventLabelCreatorTest.java",
    "content": "package com.alexstyl.specialdates.search;\n\nimport com.alexstyl.specialdates.JavaStrings;\nimport com.alexstyl.specialdates.Optional;\nimport com.alexstyl.specialdates.TestDateLabelCreator;\nimport com.alexstyl.specialdates.contact.Contact;\nimport com.alexstyl.specialdates.contact.ContactFixture;\nimport com.alexstyl.specialdates.date.ContactEvent;\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.events.peopleevents.CustomEventType;\nimport com.alexstyl.specialdates.events.peopleevents.EventType;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.runners.MockitoJUnitRunner;\n\nimport static com.alexstyl.specialdates.date.Months.DECEMBER;\nimport static com.alexstyl.specialdates.events.peopleevents.StandardEventType.*;\nimport static org.fest.assertions.api.Assertions.assertThat;\n\n@RunWith(MockitoJUnitRunner.class)\npublic class EventLabelCreatorTest {\n\n    private ContactEventLabelCreator creator;\n    private Contact mockContact = ContactFixture.aContact();\n\n    @Before\n    public void setUp() {\n        creator = new ContactEventLabelCreator(Date.Companion.today(), new JavaStrings(), TestDateLabelCreator.Companion.forUS());\n    }\n\n    @Test\n    public void birthdayWithoutYearIsCalculatedCorrectly() {\n        Date date = Date.Companion.on(12, DECEMBER);\n        ContactEvent event = contactEventOn(date, BIRTHDAY);\n        String label = creator.createFor(event);\n\n        assertThat(label).isEqualTo(\"Birthday on December 12\");\n    }\n\n    @Test\n    public void birthdayWithYearIsCalculatedCorrectly() {\n        int age = Date.Companion.getCURRENT_YEAR() - 1990;\n        Date date = Date.Companion.on(12, DECEMBER, 1990);\n\n        ContactEvent event = contactEventOn(date, BIRTHDAY);\n        String label = creator.createFor(event);\n\n        assertThat(label).isEqualTo(\"Turns \" + age + \" on December 12\");\n    }\n\n    @Test\n    public void namedayIsCalculatedCorrectly() {\n        Date date = Date.Companion.on(12, DECEMBER);\n        ContactEvent event = contactEventOn(date, NAMEDAY);\n        String label = creator.createFor(event);\n\n        assertThat(label).isEqualTo(\"Nameday on December 12\");\n    }\n\n    @Test\n    public void anniversaryIsCalculatedCorrectly() {\n        Date date = Date.Companion.on(12, DECEMBER);\n        ContactEvent event = contactEventOn(date, ANNIVERSARY);\n        String label = creator.createFor(event);\n\n        assertThat(label).isEqualTo(\"Anniversary on December 12\");\n    }\n\n    @Test\n    public void otherIsCalculatedCorrectly() {\n        Date date = Date.Companion.on(12, DECEMBER);\n        ContactEvent event = contactEventOn(date, OTHER);\n        String label = creator.createFor(event);\n\n        assertThat(label).isEqualTo(\"Other on December 12\");\n    }\n\n    @Test\n    public void customIsCalculatedCorrectly() {\n        Date date = Date.Companion.on(12, DECEMBER);\n        ContactEvent event = contactEventOn(date, new CustomEventType(\"H4x\"));\n        String label = creator.createFor(event);\n\n        assertThat(label).isEqualTo(\"H4x on December 12\");\n    }\n\n    private ContactEvent contactEventOn(Date date, EventType eventType) {\n        return new ContactEvent(Optional.Companion.<Long>absent(), eventType, date, mockContact);\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/search/NameFilterTest.java",
    "content": "package com.alexstyl.specialdates.search;\n\nimport com.alexstyl.specialdates.SoundWordComparator;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport org.junit.Before;\nimport org.junit.Test;\n\nimport static org.fest.assertions.api.Assertions.assertThat;\n\npublic class NameFilterTest {\n\n    private NameFilter greekNameFilter;\n\n    @Before\n    public void setUp() {\n        List<String> allNames = new ArrayList<>();\n        allNames.add(\"Γιώργος\");\n        allNames.add(\"Αλέξανδρος\");\n        greekNameFilter = new NameFilter(allNames, new SoundWordComparator());\n\n    }\n\n    @Test\n    public void givenTheNameInGreeklish_thenTheNameIsReturned() {\n        List<String> giwrgos = greekNameFilter.performFiltering(\"Giwrgos\");\n        assertThat(giwrgos.get(0)).isEqualTo(\"Γιώργος\");\n    }\n\n    @Test\n    public void givenPartOfTheNameInGreeklish_thenTheNameIsReturned() {\n        List<String> giwrgos = greekNameFilter.performFiltering(\"Giwrgo\");\n        assertThat(giwrgos.get(0)).isEqualTo(\"Γιώργος\");\n    }\n\n    @Test\n    public void givenTheNameInGreek_thenTheNameIsReturned() {\n        List<String> giwrgos = greekNameFilter.performFiltering(\"Γιώργος\");\n        assertThat(giwrgos.get(0)).isEqualTo(\"Γιώργος\");\n    }\n\n    @Test\n    public void givenPartOfTheNameInGreek_thenTheNameIsReturned() {\n        List<String> giwrgos = greekNameFilter.performFiltering(\"Γιώργο\");\n        assertThat(giwrgos.get(0)).isEqualTo(\"Γιώργος\");\n    }\n\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/search/NameMatcherTest.java",
    "content": "package com.alexstyl.specialdates.search;\n\nimport com.alexstyl.specialdates.contact.DisplayName;\n\nimport org.junit.Test;\n\nimport static org.fest.assertions.api.Assertions.assertThat;\n\npublic class NameMatcherTest {\n\n    private static final String FULL_DISPLAY_NAME = \"Alex Styl\";\n    private static final String PART_OF_FULL_NAME = \"Alex St\";\n    private static final DisplayName DISPLAY_NAME = DisplayName.Companion.from(FULL_DISPLAY_NAME);\n\n    private static final String FIRST_LETTER_OF_FIRST_NAME = \"A\";\n    private static final String FIRST_LETTER_OF_LAST_NAME = \"S\";\n\n    private NameMatcher comparer = NameMatcher.INSTANCE;\n\n    @Test\n    public void testFirstLetterOfFirstName_returnsTrue() {\n        boolean matches = givenDisplayNameMatches(FIRST_LETTER_OF_FIRST_NAME);\n        assertThat(matches).isTrue();\n    }\n\n    @Test\n    public void testFirstLetterOfLastName_returnsTrue() {\n        boolean matches = givenDisplayNameMatches(FIRST_LETTER_OF_LAST_NAME);\n        assertThat(matches).isTrue();\n    }\n\n    @Test\n    public void testFullDisplayName_returnsTrue() {\n        boolean matches = givenDisplayNameMatches(FULL_DISPLAY_NAME);\n        assertThat(matches).isTrue();\n    }\n\n    @Test\n    public void testPartOfFullName_returnsTrue() {\n        boolean matches = givenDisplayNameMatches(PART_OF_FULL_NAME);\n        assertThat(matches).isTrue();\n    }\n\n    private boolean givenDisplayNameMatches(String query) {\n        return comparer.match(DISPLAY_NAME, query);\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/search/PeopleEventsSearchTest.kt",
    "content": "package com.alexstyl.specialdates.search\n\nimport com.alexstyl.specialdates.TestContactEventsBuilder\nimport com.alexstyl.specialdates.contact.ContactFixture\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.TimePeriod\nimport com.alexstyl.specialdates.events.peopleevents.PeopleEventsProvider\nimport org.fest.assertions.api.Assertions.assertThat\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.BDDMockito.given\nimport org.mockito.Mock\nimport org.mockito.runners.MockitoJUnitRunner\n\n@RunWith(MockitoJUnitRunner::class)\nclass PeopleEventsSearchTest {\n\n    private lateinit var search: PeopleEventsSearch\n    @Mock\n    private lateinit var mockProvider: PeopleEventsProvider\n\n    @Before\n    fun setUp() {\n        search = PeopleEventsSearch(mockProvider, NameMatcher.INSTANCE)\n        val contactEvents = TestContactEventsBuilder()\n                .addBirthdayFor(ALEX, JANUARY_1st)\n                .addAnniversaryFor(MARIA, JANUARY_1st)\n                .addNamedayFor(MIMOZA, JANUARY_1st)\n                .build()\n\n        given(mockProvider.fetchEventsBetween(aYearFromNow())).willReturn(contactEvents)\n    }\n\n    @Test\n    fun searchingByFirstLetter() {\n        val actual = search.searchForContacts(\"A\", 5)\n        val expected = ContactWithEvents(ALEX, listOf(ContactEventTestBuilder(ALEX).buildBirthday(JANUARY_1st)))\n\n        assertThat(actual).containsOnly(expected)\n    }\n\n    @Test\n    fun searchingByLastLetter() {\n        val actual = search.searchForContacts(\"S\", 5)\n        val expected = ContactWithEvents(ALEX, listOf(ContactEventTestBuilder(ALEX).buildBirthday(JANUARY_1st)))\n\n        assertThat(actual).containsOnly(expected)\n    }\n\n    @Test\n    fun searchingByFullName() {\n        val actual = search.searchForContacts(\"Alex Styl\", 5)\n        val expected = ContactWithEvents(ALEX, listOf(ContactEventTestBuilder(ALEX).buildBirthday(JANUARY_1st)))\n\n        assertThat(actual).containsOnly(expected)\n    }\n\n    @Test\n    fun multipleResults() {\n        val actual = search.searchForContacts(\"M\", 5)\n\n        val expected = ArrayList<ContactWithEvents>()\n        expected.add(ContactWithEvents(MIMOZA, ContactEventTestBuilder(MIMOZA).buildNameday(JANUARY_1st)))\n        expected.add(ContactWithEvents(MARIA, ContactEventTestBuilder(MARIA).buildAnniversary(JANUARY_1st)))\n\n        assertThat(actual).containsAll(expected)\n    }\n\n    @Test\n    fun requestOneResultReturnsOnlyOneResult() {\n        val actual = search.searchForContacts(\"M\", 1)\n\n        val expected = ArrayList<ContactWithEvents>()\n        expected.add(ContactWithEvents(MARIA, ContactEventTestBuilder(MARIA).buildAnniversary(JANUARY_1st)))\n\n        assertThat(actual).containsAll(expected)\n    }\n\n    companion object {\n\n        private val ALEX = ContactFixture.aContactCalled(\"Alex Styl\")\n        private val MARIA = ContactFixture.aContactCalled(\"Maria Papadopoulou\")\n        private val MIMOZA = ContactFixture.aContactCalled(\"Mimoza Dereks\")\n        private val JANUARY_1st = Date.startOfYear(2016)\n\n        private fun aYearFromNow(): TimePeriod {\n            val today = Date.today()\n            val aYearFromNow = today.addDay(364)\n            return TimePeriod.between(today, aYearFromNow)\n        }\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/timeofday/TimeOfDayTest.java",
    "content": "package com.alexstyl.specialdates.timeofday;\n\nimport com.alexstyl.specialdates.TimeOfDay;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.runners.MockitoJUnitRunner;\n\nimport static org.fest.assertions.api.Assertions.assertThat;\n\n@RunWith(MockitoJUnitRunner.class)\npublic class TimeOfDayTest {\n\n    @Test\n    public void toStringReturnsTheSpecifiedLabel() {\n        TimeOfDay timeOfDay = new TimeOfDay(5, 0);\n        assertThat(timeOfDay.toString()).isEqualTo(\"05:00\");\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/upcoming/MonthLabelsTest.java",
    "content": "package com.alexstyl.specialdates.upcoming;\n\nimport org.junit.Before;\nimport org.junit.Test;\n\nimport static com.alexstyl.specialdates.date.Months.DECEMBER;\nimport static com.alexstyl.specialdates.date.Months.JANUARY;\nimport static org.fest.assertions.api.Assertions.assertThat;\n\npublic class MonthLabelsTest {\n\n    private MonthLabels monthLabels;\n\n    private String[] months = {\"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n            \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"};\n\n    @Before\n    public void setup() {\n        monthLabels = new MonthLabels(months);\n    }\n\n    @Test\n    public void givenTheFirstMonthOfTheYear_thenTheCorrectLabelIsReturned() {\n        int index = JANUARY;\n        String zeroIndexedLabel = monthLabels.getMonthOfYear(index);\n        assertThat(zeroIndexedLabel).isEqualTo(\"January\");\n    }\n\n    @Test\n    public void givenTheLastMonthOfTheYear_thenTheCorrectLabelIsReturned() {\n        int index = DECEMBER;\n        String zeroIndexedLabel = monthLabels.getMonthOfYear(index);\n        assertThat(zeroIndexedLabel).isEqualTo(\"December\");\n    }\n\n    @Test\n    public void copyOfMonthCreatesCorrectCoppy() {\n        String[] copy = monthLabels.getMonthsOfYear();\n        assertThat(copy).isEqualTo(months);\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/upcoming/TimePeriodTest.java",
    "content": "package com.alexstyl.specialdates.upcoming;\n\nimport com.alexstyl.specialdates.date.Date;\nimport com.alexstyl.specialdates.date.TimePeriod;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.runners.MockitoJUnitRunner;\n\nimport static com.alexstyl.specialdates.date.Months.FEBRUARY;\nimport static org.fest.assertions.api.Assertions.assertThat;\nimport static org.fest.assertions.api.Assertions.fail;\n\n@RunWith(MockitoJUnitRunner.class)\npublic class TimePeriodTest {\n\n    @Test\n    public void dateBetweenPeriod() {\n        TimePeriod range = TimePeriod.Companion.between(\n                Date.Companion.startOfYear(2016),\n                Date.Companion.startOfYear(2017)\n        );\n        assertThat(range.containsDate(Date.Companion.on(1, FEBRUARY, 2016))).isTrue();\n    }\n\n    @Test\n    public void dateOutsideOfPeriod() {\n        TimePeriod range = TimePeriod.Companion.between(\n                Date.Companion.startOfYear(2016),\n                Date.Companion.startOfYear(2017)\n        );\n        assertThat(range.containsDate(Date.Companion.on(1, FEBRUARY, 1990))).isFalse();\n    }\n\n    @Test(expected = IllegalArgumentException.class)\n    public void invalidPeriodThrowsException() {\n        TimePeriod.Companion.between(\n                Date.Companion.startOfYear(3560),\n                Date.Companion.startOfYear(5)\n        );\n        fail(\"Should have thrown exception\");\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/upcoming/UpcomingEventsPresenterTest.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.Months\nimport com.alexstyl.specialdates.date.TimePeriod\nimport com.alexstyl.specialdates.events.peopleevents.UpcomingEventsSettings\nimport com.alexstyl.specialdates.permissions.MementoPermissions\nimport io.reactivex.schedulers.Schedulers\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.BDDMockito.given\nimport org.mockito.Mockito\nimport org.mockito.internal.verification.Times\nimport org.mockito.runners.MockitoJUnitRunner\n\n\n@RunWith(MockitoJUnitRunner::class)\nclass UpcomingEventsPresenterTest {\n\n    companion object {\n        private val STARTING_DATE = Date.on(1, Months.APRIL, 2017)\n    }\n\n    private val mockView = Mockito.mock(UpcomingListMVPView::class.java)\n    private val mockPermissions = Mockito.mock(MementoPermissions::class.java)\n    private val mockProvider = Mockito.mock(UpcomingEventsProvider::class.java)\n    private val mockSettings = Mockito.mock(UpcomingEventsSettings::class.java)\n\n    private lateinit var upcomingEventsPresenter: UpcomingEventsPresenter\n\n    @Before\n    fun setUp() {\n        upcomingEventsPresenter = UpcomingEventsPresenter(\n                STARTING_DATE,\n                mockPermissions,\n                mockProvider,\n                Schedulers.trampoline(),\n                Schedulers.trampoline()\n        )\n        given(mockSettings.hasBeenInitialised()).willReturn(true)\n        given(mockView.isShowingNoEvents).willReturn(true) // start each test with from scratch\n        given(mockPermissions.canReadAndWriteContacts()).willReturn(true)\n    }\n\n    @Test\n    fun whenStartPresentingWithoutPermission_showsLoading() {\n        given(mockPermissions.canReadAndWriteContacts()).willReturn(false)\n\n        upcomingEventsPresenter.startPresentingInto(mockView)\n\n        Mockito.verify(mockView).showLoading()\n    }\n\n    @Test\n    fun whenStartPresentingWithPermission_showLoading() {\n        given(mockPermissions.canReadAndWriteContacts()).willReturn(true)\n\n        upcomingEventsPresenter.startPresentingInto(mockView)\n\n        Mockito.verify(mockView).showLoading()\n    }\n\n    @Test\n    fun whenStartPresentingWithPermission_showEventsAfterDoneLoading() {\n        val theDate = Date.on(1, Months.MARCH, 2017)\n        val expectedEvents = arrayListOf<UpcomingRowViewModel>()\n        given(mockProvider.calculateEventsBetween(TimePeriod.aYearFrom(theDate))).willReturn(expectedEvents)\n\n        upcomingEventsPresenter.startPresentingInto(mockView)\n\n        Mockito.verify(mockView).showLoading()\n        Mockito.verify(mockView).display(expectedEvents)\n    }\n\n    @Test\n    fun givenEventsWereUpdated_whenAskedToUpdate_thenNewEventsArePushedToTheView() {\n        val initialEvents = arrayListOf<UpcomingRowViewModel>()\n        given(mockProvider.calculateEventsBetween(TimePeriod.aYearFrom(STARTING_DATE))).willReturn(initialEvents)\n\n        upcomingEventsPresenter.startPresentingInto(mockView)\n\n        val updatedEvents = arrayListOf<UpcomingRowViewModel>(DateHeaderViewModel(\"February 2017\", 2))\n        given(mockProvider.calculateEventsBetween(TimePeriod.aYearFrom(STARTING_DATE))).willReturn(updatedEvents)\n        upcomingEventsPresenter.refreshEvents()\n\n        Mockito.verify(mockView, Times(1)).display(initialEvents)\n        Mockito.verify(mockView, Times(1)).display(updatedEvents)\n    }\n}\n\n\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/upcoming/UpcomingRowViewModelsBuilderTest.kt",
    "content": "package com.alexstyl.specialdates.upcoming\n\nimport com.alexstyl.TestColors\nimport com.alexstyl.resources.Colors\nimport com.alexstyl.specialdates.JavaStrings\nimport com.alexstyl.specialdates.Optional\nimport com.alexstyl.specialdates.contact.ContactFixture.aContact\nimport com.alexstyl.specialdates.date.ContactEvent\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.Months\nimport com.alexstyl.specialdates.date.Months.FEBRUARY\nimport com.alexstyl.specialdates.date.Months.JANUARY\nimport com.alexstyl.specialdates.date.TimePeriod\nimport com.alexstyl.specialdates.events.bankholidays.BankHoliday\nimport com.alexstyl.specialdates.events.namedays.NamesInADate\nimport com.alexstyl.specialdates.events.peopleevents.StandardEventType\nimport org.fest.assertions.api.Assertions.assertThat\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.BDDMockito.given\nimport org.mockito.Mock\nimport org.mockito.runners.MockitoJUnitRunner\nimport java.util.ArrayList\nimport java.util.Arrays.asList\n\n@RunWith(MockitoJUnitRunner::class)\nclass UpcomingRowViewModelsBuilderTest {\n\n    private var upcomingEventRowViewModelFactory: UpcomingEventRowViewModelFactory? = null\n    private val mockStrings = JavaStrings()\n\n    @Mock\n    private val mockColors: Colors? = TestColors()\n    private val mockDateStringCreator = DateStringCreator()\n\n    @Before\n    fun setUp() {\n        given(mockColors!!.getTodayHeaderTextColor()).willReturn(5)\n        val today = Date.today()\n        upcomingEventRowViewModelFactory = UpcomingEventRowViewModelFactory(\n                today,\n                mockColors,\n                mockDateStringCreator,\n                ContactViewModelFactory(mockColors, mockStrings)\n        )\n\n    }\n\n    @Test\n    fun givenASingleContactEvent_thenCreatesADateHeaderPlusAContactEvent() {\n\n        val viewModels = builderFor(entireYear(2016))\n                .withContactEvents(asList(aContactEventOn(Date.on(1, JANUARY, 2016))))\n                .build()\n\n        assertThat(viewModels.size).isEqualTo(2)\n        assertThat(viewModels[0]).isInstanceOf(DateHeaderViewModel::class.java)\n        assertThat(viewModels[1]).isInstanceOf(UpcomingContactEventViewModel::class.java)\n    }\n\n    @Test\n    fun givenTwoContactEvents_whenBothAreOnTheSameDate_thenCreatesADateHeaderPlusTwoContactEvents() {\n        val viewModels = builderFor(entireYear(1990))\n                .withContactEvents(asList(\n                        aContactEventOn(Date.on(1, FEBRUARY, 1990)),\n                        aContactEventOn(Date.on(1, FEBRUARY, 1990))\n                ))\n                .build()\n\n        assertThat(viewModels.size).isEqualTo(3)\n        assertThat(viewModels[0]).isInstanceOf(DateHeaderViewModel::class.java)\n        assertThat(viewModels[1]).isInstanceOf(UpcomingContactEventViewModel::class.java)\n        assertThat(viewModels[2]).isInstanceOf(UpcomingContactEventViewModel::class.java)\n    }\n\n    @Test\n    fun givenTwoContactEvents_whenBothAreOnDifferentDate_thenCreatesADateHeaderAndAContactEventForEachOne() {\n        val viewModels = builderFor(entireYear(1990))\n                .withContactEvents(asList(\n                        aContactEventOn(Date.on(1, FEBRUARY, 1990)),\n                        aContactEventOn(Date.on(3, FEBRUARY, 1990))\n                ))\n                .build()\n\n        assertThat(viewModels.size).isEqualTo(4)\n        assertThat(viewModels[0]).isInstanceOf(DateHeaderViewModel::class.java)\n        assertThat(viewModels[1]).isInstanceOf(UpcomingContactEventViewModel::class.java)\n        assertThat(viewModels[2]).isInstanceOf(DateHeaderViewModel::class.java)\n        assertThat(viewModels[3]).isInstanceOf(UpcomingContactEventViewModel::class.java)\n    }\n\n    @Test\n    fun givenABankHoliday_thenCreatesADateHeaderPlusABankholidayModel() {\n        val viewModels = builderFor(TimePeriod.between(aBankHoliday().date, aBankHoliday().date))\n                .withBankHolidays(asList(aBankHoliday()))\n                .build()\n\n        assertThat(viewModels.size).isEqualTo(2)\n        assertThat(viewModels[0]).isInstanceOf(DateHeaderViewModel::class.java)\n        assertThat(viewModels[1]).isInstanceOf(BankHolidayViewModel::class.java)\n    }\n\n    @Test\n    fun givenANameday_thenCreatesADateHeaderPlusANamedayModel() {\n        val date = Date.on(1, Months.APRIL, 2017)\n        val namedays = namedayOf(date, \"Maria\")\n\n        val viewModels = builderFor(TimePeriod.between(date, date))\n                .withNamedays(namedays)\n                .build()\n\n        assertThat(viewModels.size).isEqualTo(2)\n        assertThat(viewModels[0]).isInstanceOf(DateHeaderViewModel::class.java)\n        assertThat(viewModels[1]).isInstanceOf(UpcomingNamedaysViewModel::class.java)\n    }\n\n    @Test\n    fun theDisplayOrderIsCorrect() {\n        val date = Date.on(1, Months.APRIL, 2017)\n\n        val bankHoliday = BankHoliday(\"A bank holiday\", date)\n        val bankHolidays = listOf(bankHoliday)\n        val namedays = namedayOf(date, \"Maria\")\n\n        val viewModels = builderWithAds(entireYear(2017))\n                .withContactEvents(asList(\n                        aContactEventOn(Date.on(1, Months.APRIL, 2017)),\n                        aContactEventOn(Date.on(2, Months.APRIL, 2017))\n                ))\n                .withNamedays(namedays)\n                .withBankHolidays(bankHolidays)\n                .build()\n\n        assertListContainsOrderedItems(viewModels, asList(\n                DateHeaderViewModel::class.java,\n                BankHolidayViewModel::class.java,\n                UpcomingNamedaysViewModel::class.java,\n                UpcomingContactEventViewModel::class.java,\n                DateHeaderViewModel::class.java,\n                UpcomingContactEventViewModel::class.java\n        ))\n    }\n\n    private fun assertListContainsOrderedItems(viewModels: List<UpcomingRowViewModel>,\n                                               classes: List<Class<out UpcomingRowViewModel>>) {\n        classes.forEachIndexed { index, clazz ->\n            assertThat(viewModels[index]).isInstanceOf(clazz)\n        }\n        assertThat(viewModels.size).isEqualTo(classes.size)\n    }\n\n    private fun namedayOf(date: Date, maria: String): List<NamesInADate> {\n        val namedays = ArrayList<NamesInADate>()\n        namedays.add(NamesInADate(date, arrayListOf(maria)))\n        return namedays\n    }\n\n    private fun builderFor(timePeriod: TimePeriod): UpcomingRowViewModelsBuilder {\n        return UpcomingRowViewModelsBuilder(timePeriod, upcomingEventRowViewModelFactory!!)\n    }\n\n    private fun builderWithAds(timePeriod: TimePeriod): UpcomingRowViewModelsBuilder {\n        return UpcomingRowViewModelsBuilder(timePeriod, upcomingEventRowViewModelFactory!!)\n    }\n\n\n    private fun aBankHoliday(): BankHoliday {\n        return BankHoliday(\"A bank holiday\", Date.on(1, JANUARY, 1990))\n    }\n\n    private fun aContactEventOn(date: Date): ContactEvent {\n        return ContactEvent(NO_DEVICE_EVENT_ID, StandardEventType.BIRTHDAY, date, aContact())\n    }\n\n    private fun entireYear(year: Int): TimePeriod {\n        return TimePeriod.between(Date.startOfYear(year), Date.endOfYear(year))\n    }\n\n    companion object {\n        private val NO_DEVICE_EVENT_ID = Optional.absent<Long>()\n    }\n\n}\n\n\nclass DateStringCreator : UpcomingDateStringCreator {\n    override fun createLabelFor(date: Date): String = \"Header Label\"\n\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/upcoming/widget/today/PercentToValueConverterTest.java",
    "content": "package com.alexstyl.specialdates.upcoming.widget.today;\n\nimport org.junit.Test;\n\nimport static org.fest.assertions.api.Assertions.assertThat;\n\npublic class PercentToValueConverterTest {\n\n    // 0/5 -> 0.0\n    // 1/5 -> 0.25\n    // 2/5 -> 0.50\n    // 3/5 -> 0.75\n    // 5/5 -> 1.00\n\n    private final PercentToValueConverter converter = new PercentToValueConverter();\n\n    @Test\n    public void testPercentToValue() {\n        assertThat(converter.percentToProgress(0)).isEqualTo(0);\n        assertThat(converter.percentToProgress(0.25f)).isEqualTo(1);\n        assertThat(converter.percentToProgress(0.50f)).isEqualTo(2);\n        assertThat(converter.percentToProgress(0.75f)).isEqualTo(3);\n        assertThat(converter.percentToProgress(1.0f)).isEqualTo(4);\n    }\n\n    @Test\n    public void testValueToPercentage() {\n        assertThat(converter.progressToPercent(0)).isEqualTo(0);\n        assertThat(converter.progressToPercent(1)).isEqualTo(0.25f);\n        assertThat(converter.progressToPercent(2)).isEqualTo(0.50f);\n        assertThat(converter.progressToPercent(3)).isEqualTo(0.75f);\n        assertThat(converter.progressToPercent(4)).isEqualTo(1.00f);\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/util/DateParserTest.kt",
    "content": "package com.alexstyl.specialdates.util\n\nimport com.alexstyl.specialdates.date.Date\nimport com.alexstyl.specialdates.date.DateParser\nimport com.alexstyl.specialdates.date.Months.FEBRUARY\nimport com.alexstyl.specialdates.date.Months.JANUARY\nimport com.alexstyl.specialdates.date.Months.MARCH\nimport com.alexstyl.specialdates.date.Months.OCTOBER\nimport com.alexstyl.specialdates.facebook.friendimport.SystemLogTracker\nimport org.fest.assertions.api.Assertions.assertThat\nimport org.junit.Test\n\nclass DateParserTest {\n\n    private val dateParser = DateParser(SystemLogTracker())\n\n    @Test\n    fun dateWithSlashes() {\n        val dateDashes = \"13/Jan/1972\"\n        val parsed = dateParser.parse(dateDashes)\n        assertThat(parsed).isEqualTo(Date.on(13, JANUARY, 1972))\n    }\n\n    @Test\n    fun longDate() {\n        val dateDashes = \"1949-02-14T00:00:00Z\"\n        val parsed = dateParser.parse(dateDashes)\n        assertThat(parsed).isEqualTo(Date.on(14, FEBRUARY, 1949))\n    }\n\n    @Test\n    fun longDate2() {\n        val dateDashes = \"20151026T083936Z\"\n        val parsed = dateParser.parse(dateDashes)\n        assertThat(parsed).isEqualTo(Date.on(26, OCTOBER, 2015))\n    }\n\n    @Test\n    fun datesWithDashes() {\n        val dateDashes = \"2016-03-29\"\n        val parsed = dateParser.parse(dateDashes)\n        assertThat(parsed).isEqualTo(Date.on(29, MARCH, 2016))\n    }\n\n    @Test\n    fun datesWithDashesWithoutYear() {\n        val dateDashes = \"--03-29\"\n        val parsed = dateParser.parse(dateDashes)\n        assertThat(parsed).isEqualTo(Date.on(29, MARCH))\n    }\n\n    @Test\n    fun noYear_on_29th_Of_February() {\n        val dateDashes = \"--02-29\"\n        val parsed = dateParser.parse(dateDashes)\n        assertThat(parsed).isEqualTo(Date.on(29, FEBRUARY))\n    }\n\n    @Test(expected = NullPointerException::class)\n    fun throwsExceptionWhenNullIsPassed() {\n        dateParser.parse(null!!)\n    }\n}\n"
  },
  {
    "path": "memento/src/test/java/com/alexstyl/specialdates/util/HashMapListTest.java",
    "content": "package com.alexstyl.specialdates.util;\n\nimport java.util.List;\n\nimport org.junit.Test;\n\nimport static org.fest.assertions.api.Assertions.assertThat;\n\npublic class HashMapListTest {\n\n    @Test\n    public void name() throws Exception {\n        HashMapList<Integer, Integer> hashMapList = new HashMapList<>();\n        hashMapList.addValue(1, 5);\n        List<Integer> integers = hashMapList.get(1);\n        assertThat(integers.get(0)).isEqualTo(5);\n    }\n}\n"
  },
  {
    "path": "memento/src/test/resources/gr_namedays.json",
    "content": "{\"data\":[{\"names\":[\"Αχιλλέας\",\"Αχιλλεύς\"],\"date\":\"24\\/04\"},{\"names\":[\"Αχίλιος\",\"Αχίλλιος\",\"Αχίλειος\",\"Αχίλλειος\"],\"date\":\"15\\/05\"},{\"names\":[\"Αχμέτ\"],\"date\":\"24\\/12\"},{\"names\":[\"Αγγελος\",\"Αγγελής\",\"Αγγελική\",\"Αντζελα\",\"Ατζελα\",\"Αντζυ\",\"Αγγέλα\",\"Αγγέλλω\",\"Αγγελίνα\",\"Αγγελικούλα\",\"Κούλα\"],\"date\":\"08\\/11\"},{\"names\":[\"Αγάπη\",\"Αγάπιος\"],\"date\":\"17\\/09\"},{\"names\":[\"Αγαπητός\"],\"date\":\"18\\/02\"},{\"names\":[\"Αγάπιος\"],\"date\":\"15\\/03\"},{\"names\":[\"Αγαθάγγελος\",\"Αγαθαγγέλα\",\"Αγαθαγγέλη\"],\"date\":\"23\\/01\"},{\"names\":[\"Αγαθή\",\"Αγαθούλα\",\"Αγαθώ\",\"Αγαθία\",\"Αγαθίτσα\"],\"date\":\"05\\/02\"},{\"names\":[\"Αγαθόκλεια\",\"Αγαθοκλής\",\"Αγαθοκλέας\",\"Αγαθόκλεος\"],\"date\":\"17\\/09\"},{\"names\":[\"Αγαθονίκη\"],\"date\":\"13\\/10\"},{\"names\":[\"Αγαθόνικος\"],\"date\":\"22\\/08\"},{\"names\":[\"Αγάθων\"],\"date\":\"08\\/01\"},{\"names\":[\"Αδαμάντιος\",\"Αδαμαντία\",\"Αμάντα\"],\"date\":\"01\\/09\"},{\"names\":[\"Αβέρκιος\",\"Αβερκία\"],\"date\":\"22\\/10\"},{\"names\":[\"Αγλαία\"],\"date\":\"19\\/12\"},{\"names\":[\"Αγνή\",\"Αγνούλα\"],\"date\":\"21\\/01\"},{\"names\":[\"Αβραάμ\",\"Αβραμία\"],\"date\":\"29\\/10\"},{\"names\":[\"Αδριανή\",\"Αδριάνα\",\"Αντριάνα\",\"Ανδριάννα\",\"Ανδριαννή\"],\"date\":\"26\\/08\"},{\"names\":[\"Αδριανός\"],\"date\":\"26\\/08\"},{\"names\":[\"Αγριππίνα\"],\"date\":\"23\\/06\"},{\"names\":[\"Αέτιος\",\"Αετός\",\"Αέτης\",\"Αετίς\",\"Αετίνα\",\"Αετίων\"],\"date\":\"09\\/03\"},{\"names\":[\"Απελλής\"],\"date\":\"31\\/10\"},{\"names\":[\"Απόλλων\"],\"date\":\"05\\/06\"},{\"names\":[\"Απολλωνία\"],\"date\":\"30\\/10\"},{\"names\":[\"Απόστολος\",\"Αποστόλης\",\"Τόλης\",\"Αποστολία\",\"Λία\",\"Αποστολίνα\",\"Πολίνα\"],\"date\":\"30\\/06\"},{\"names\":[\"Απόστολος\",\"Αποστόλης\",\"Τόλης\",\"Αποστολία\",\"Λία\",\"Αποστολίνα\",\"Πολίνα\"],\"date\":\"16\\/08\"},{\"names\":[\"Ακάκιος\"],\"date\":\"12\\/04\"},{\"names\":[\"Ακάκιος\",\"Κάχι\",\"Κάκι\"],\"date\":\"28\\/07\"},{\"names\":[\"Αλεξάνδρα\",\"Αλεξάντρα\",\"Αλέκα\"],\"date\":\"17\\/07\"},{\"names\":[\"Αλεξάνδρα\",\"Αλεξάντρα\",\"Αλέκα\"],\"date\":\"21\\/04\"},{\"names\":[\"Αλέξανδρος\",\"Αλέξαντρος\",\"Αλέκος\",\"Αλέξης\"],\"date\":\"30\\/08\"},{\"names\":[\"Αθανάσιος\",\"Αθανασία\",\"Θανάσης\",\"Νάσια\",\"Νάνσυ\",\"Νάσος\",\"Θανάσος\",\"Θανασάκης\",\"Σάκης\",\"Θάνος\",\"Θανασία\",\"Θανασούλα\",\"Σούλα\",\"Νάσα\"],\"date\":\"18\\/01\"},{\"names\":[\"Αλέξιος\",\"Αλεξία\",\"Αλέξης\",\"Αλέκος\",\"Αλέξα\"],\"date\":\"17\\/03\"},{\"names\":[\"Αθηνά\"],\"date\":\"01\\/09\"},{\"names\":[\"Αθηναγόρας\"],\"date\":\"24\\/07\"},{\"names\":[\"Αθηνόδωρος\",\"Αθηνόδωρας\",\"Αθηνοδωρής\",\"Δώρης\",\"Αθηνοδώρα\"],\"date\":\"07\\/11\"},{\"names\":[\"Αικατερίνα\",\"Κατερίνα\",\"Αικατερίνη\",\"Καίτη\",\"Κατίνα\",\"Κατερινιώ\",\"Κατινιώ\",\"Κατίνγκω\",\"Κατίγκα\",\"Τίγκα\",\"Κάτια\",\"Ρίνα\",\"Καλοτίνα\",\"Κάρεν\"],\"date\":\"25\\/11\"},{\"names\":[\"Αλκιβιάδης\",\"Αλκης\",\"Αλτσος\"],\"date\":\"16\\/08\"},{\"names\":[\"Αλίκη\"],\"date\":\"17\\/07\"},{\"names\":[\"Ακίνδυνος\",\"Ακίνδυνη\"],\"date\":\"02\\/11\"},{\"names\":[\"Αιμιλιανός\",\"Αιμιλιανή\"],\"date\":\"18\\/07\"},{\"names\":[\"Αιμίλιος\",\"Αιμιλία\",\"Εμυ\",\"Εμιλία\",\"Εμιλυ\",\"Εμμα\",\"Μίλιος\",\"Μίλια\"],\"date\":\"22\\/05\"},{\"names\":[\"Ακριβή\"],\"date\":\"01\\/09\"},{\"names\":[\"Αλφαίος\"],\"date\":\"26\\/05\"},{\"names\":[\"Αλύπιος\",\"Αλυπία\"],\"date\":\"27\\/05\"},{\"names\":[\"Ακύλας\"],\"date\":\"14\\/07\"},{\"names\":[\"Ακυλίνα\",\"Ακυλίνη\",\"Ακυλήνη\"],\"date\":\"27\\/09\"},{\"names\":[\"Αιτωλία\"],\"date\":\"24\\/08\"},{\"names\":[\"Αμαλία\",\"Αμελί\"],\"date\":\"10\\/07\"},{\"names\":[\"Αναίς\"],\"date\":\"09\\/12\"},{\"names\":[\"Αναίς\"],\"date\":\"25\\/07\"},{\"names\":[\"Ανεμπόδιστος\",\"Ανεμπόδιστη\"],\"date\":\"02\\/11\"},{\"names\":[\"Ανανίας\",\"Νίνος\"],\"date\":\"01\\/10\"},{\"names\":[\"Αναξιμένης\",\"Μένης\"],\"date\":\"10\\/04\"},{\"names\":[\"Ανδρέας\",\"Αντρέας\",\"Ανδρίκος\",\"Αντρίκος\",\"Ανδρούλα\",\"Αντρούλα\",\"Ανδρίτσα\",\"Αντρίτσα\"],\"date\":\"30\\/11\"},{\"names\":[\"Ανάργυρος\",\"Ανάργυρη\",\"Αναργυρούλα\"],\"date\":\"28\\/06\"},{\"names\":[\"Ανάργυρος\",\"Ανάργυρη\",\"Αναργυρούλα\"],\"date\":\"01\\/07\"},{\"names\":[\"Ανάργυρος\",\"Ανάργυρη\",\"Αναργυρούλα\"],\"date\":\"01\\/11\"},{\"names\":[\"Ανδρομάχη\",\"Μάχη\",\"Μαχούλα\"],\"date\":\"12\\/10\"},{\"names\":[\"Ανδρόμαχος\",\"Μάχος\"],\"date\":\"12\\/10\"},{\"names\":[\"Ανδρόνικος\",\"Ανδρονίκη\"],\"date\":\"17\\/05\"},{\"names\":[\"Ανδρόνικος\",\"Ανδρονίκη\"],\"date\":\"30\\/07\"},{\"names\":[\"Αμβρόσιος\",\"Αμβρόσης\",\"Αμβροσία\"],\"date\":\"07\\/12\"},{\"names\":[\"Ανατολή\"],\"date\":\"26\\/02\"},{\"names\":[\"Ανατόλιος\"],\"date\":\"03\\/07\"},{\"names\":[\"Αναστασία\",\"Τασία\",\"Σία\",\"Τατία\",\"Τάσα\",\"Τέσα\",\"Τασούλα\",\"Τασσώ\"],\"date\":\"22\\/12\"},{\"names\":[],\"date\":\"12\\/04\"},{\"names\":[\"Αναστάσιος\",\"Αναστασία\",\"Τάσος\",\"Αναστάσης\",\"Τασία\",\"Σία\",\"Τατία\",\"Τάσα\",\"Τέσα\",\"Τασούλα\",\"Τασσώ\"],\"date\":\"22\\/01\"},{\"names\":[\"Αμπλία\",\"Αμπλίος\"],\"date\":\"31\\/10\"},{\"names\":[\"Ανθή\",\"Ανθούλα\",\"Ανθια\",\"Ανθεια\"],\"date\":\"15\\/12\"},{\"names\":[\"Ανθιμος\",\"Ανθιμη\"],\"date\":\"03\\/09\"},{\"names\":[\"Ανθούσα\",\"Ανθούση\"],\"date\":\"22\\/02\"},{\"names\":[\"Αννα\",\"Αννούλα\",\"Αννίτα\",\"Ανίτα\",\"Ανέτα\",\"Αννέτα\",\"Ανναμπέλλα\",\"Ανναμαρία\",\"Ανέζα\",\"Ανεζούλα\"],\"date\":\"09\\/12\"},{\"names\":[\"Αννα\",\"Αννούλα\",\"Αννίτα\",\"Ανίτα\",\"Ανέτα\",\"Αννέτα\",\"Ανναμπέλλα\",\"Ανναμαρία\"],\"date\":\"25\\/07\"},{\"names\":[\"Αντιγόνη\",\"Γόνη\"],\"date\":\"01\\/09\"},{\"names\":[\"Αντίγονος\"],\"date\":\"17\\/10\"},{\"names\":[\"Αμφιλόχιος\",\"Αμφιλοχία\"],\"date\":\"23\\/11\"},{\"names\":[\"Αντίπας\",\"Αντύπας\"],\"date\":\"11\\/04\"},{\"names\":[\"Ανύσιος\",\"Ανυσία\"],\"date\":\"30\\/12\"},{\"names\":[\"Αντώνιος\",\"Αντώνης\",\"Αντώνας\",\"Τόνης\",\"Τόνυ\",\"Αντωνάκος\",\"Νάκος\",\"Αντωνάκης\",\"Αντωνία\",\"Αντωνούλα\",\"Τόνια\"],\"date\":\"17\\/01\"},{\"names\":[\"Αρχέλαος\"],\"date\":\"05\\/03\"},{\"names\":[\"Αρχοντή\",\"Αρχοντία\",\"Αρχοντούλα\",\"Αρχόντισσα\",\"Αρχόντω\"],\"date\":\"03\\/09\"},{\"names\":[\"Αρχοντίων\",\"Αρχοντίωνας\"],\"date\":\"03\\/09\"},{\"names\":[\"Αρετή\",\"Αρετούσα\"],\"date\":\"01\\/12\"},{\"names\":[\"Αργύρης\",\"Αργυρός\",\"Αργύριος\"],\"date\":\"11\\/05\"},{\"names\":[\"Αργυρή\",\"Αργυρούλα\",\"Ρούλα\",\"Αργυρώ\"],\"date\":\"30\\/04\"},{\"names\":[\"Αρης\"],\"date\":\"13\\/12\"},{\"names\":[\"Αρης\"],\"date\":\"19\\/12\"},{\"names\":[\"Αρκαδία\",\"Αρκάδα\"],\"date\":\"27\\/08\"},{\"names\":[\"Αρκάδιος\",\"Αρκάδης\"],\"date\":\"27\\/08\"},{\"names\":[\"Αρκάδιος\",\"Αρκαδία\"],\"date\":\"29\\/08\"},{\"names\":[\"Αριάδνη\",\"Αριάνα\"],\"date\":\"18\\/09\"},{\"names\":[\"Αριστέα\",\"Αρίστη\",\"Αρέστια\"],\"date\":\"03\\/09\"},{\"names\":[\"Αριστείδης\",\"Αρίστος\",\"Αριστέα\",\"Αρης\",\"Αριστούλα\",\"Αριστίνα\",\"Αρίστη\",\"Αρίστω\"],\"date\":\"13\\/09\"},{\"names\":[\"Αρίσταρχος\"],\"date\":\"14\\/04\"},{\"names\":[\"Αριστίων\",\"Αριστίωνας\",\"Αριστέας\",\"Αρέστης\"],\"date\":\"03\\/09\"},{\"names\":[\"Αριστόβουλος\",\"Αριστοβούλη\"],\"date\":\"31\\/10\"},{\"names\":[\"Αριστοκλής\",\"Αριστοκλέας\",\"Αριστόκλεος\"],\"date\":\"23\\/06\"},{\"names\":[\"Αριστοτέλης\",\"Τέλης\"],\"date\":\"14\\/05\"},{\"names\":[\"Αρμόδιος\"],\"date\":\"11\\/05\"},{\"names\":[\"Αρριανός\",\"Αριανός\",\"Αρρειανός\",\"Αρειανός\",\"Αρριανή\"],\"date\":\"14\\/12\"},{\"names\":[\"Αρτέμιος\",\"Αρτέμης\"],\"date\":\"20\\/10\"},{\"names\":[\"Αρσένιος\",\"Αρσένης\",\"Αρσενία\",\"Αρσίνα\"],\"date\":\"18\\/08\"},{\"names\":[\"Αρσένιος\",\"Αρσένης\",\"Αρσενία\",\"Αρσίνα\"],\"date\":\"10\\/11\"},{\"names\":[\"Αρτεμις\",\"Αρτεμία\",\"Αρτέμη\",\"Αρτεμισία\",\"Αρτέμιδα\"],\"date\":\"20\\/10\"},{\"names\":[\"Αρσινόη\"],\"date\":\"10\\/11\"},{\"names\":[\"Αυγερινός\",\"Αυγέρης\",\"Αυγίτης\",\"Αυγέρας\",\"Αυγέρου\",\"Αυγερινή\",\"Αβα\"],\"date\":\"02\\/05\"},{\"names\":[\"Αυγή\",\"Αυγούλα\"],\"date\":\"11\\/02\"},{\"names\":[\"Αυγούστα\",\"Αυγουστία\",\"Αυγουστίνα\"],\"date\":\"15\\/06\"},{\"names\":[\"Αυγουστίνος\",\"Αύγουστος\",\"Αυγουστής\"],\"date\":\"15\\/06\"},{\"names\":[\"Ασημάκης\"],\"date\":\"03\\/02\"},{\"names\":[\"Ασημάκης\"],\"date\":\"30\\/04\"},{\"names\":[\"Ασημίνα\"],\"date\":\"03\\/02\"},{\"names\":[\"Ασημίνα\"],\"date\":\"30\\/04\"},{\"names\":[\"Ασπασία\"],\"date\":\"01\\/09\"},{\"names\":[\"Ασκληπιός\",\"Ασκληπιάς\",\"Ασκληπιάδα\"],\"date\":\"27\\/02\"},{\"names\":[\"Αφθόνιος\",\"Αφθονία\"],\"date\":\"02\\/11\"},{\"names\":[\"Αυξέντιος\",\"Αυξέντης\",\"Αυξεντία\",\"Αυξεντούλα\"],\"date\":\"28\\/07\"},{\"names\":[\"Αύρα\"],\"date\":\"30\\/01\"},{\"names\":[\"Αφροδίτη\",\"Φρέγια\"],\"date\":\"01\\/09\"},{\"names\":[\"Αφροδίσιος\",\"Αφροδισία\"],\"date\":\"21\\/06\"},{\"names\":[\"Αστέριος\",\"Αστέρης\",\"Αστρης\"],\"date\":\"07\\/08\"},{\"names\":[\"Αστέριος\",\"Αστέρης\",\"Αστρης\"],\"date\":\"30\\/10\"},{\"names\":[\"Αστέρω\",\"Αστερία\",\"Αστρούλα\"],\"date\":\"07\\/08\"},{\"names\":[\"Αστέρω\",\"Αστερία\",\"Αστρούλα\"],\"date\":\"30\\/10\"},{\"names\":[\"Αστρινή\",\"Αστερινή\",\"Αστρινός\",\"Αστερινός\"],\"date\":\"07\\/08\"},{\"names\":[\"Βάκχος\",\"Βάκχη\",\"Βακχία\"],\"date\":\"07\\/10\"},{\"names\":[\"Βαλεντίων\",\"Βαλεντίνος\",\"Βαλεντίνο\",\"Ντίνος\",\"Βαλεντίνη\",\"Βαλεντίνα\",\"Ντίνα\"],\"date\":\"14\\/02\"},{\"names\":[\"Βαλάντιος\",\"Βαλάντης\"],\"date\":\"12\\/10\"},{\"names\":[\"Βαλεριανός\",\"Βαλεριάνα\",\"Βαλέρια\",\"Βαλέριος\",\"Βαλέρης\",\"Βάλιος\",\"Βάλια\"],\"date\":\"22\\/11\"},{\"names\":[\"Βενέδικτος\",\"Βενεδίκτη\",\"Βενεδικτίνη\",\"Βενεδικτίνα\"],\"date\":\"14\\/03\"},{\"names\":[\"Βενιαμίν\"],\"date\":\"29\\/12\"},{\"names\":[\"Βαρβάρα\",\"Βαρβάρω\",\"Βαρβαρούλα\",\"Ρούλα\",\"Βαρβαρίτσα\",\"Ρίτσα\"],\"date\":\"04\\/12\"},{\"names\":[\"Βερενίκη\"],\"date\":\"12\\/07\"},{\"names\":[\"Βερίνα\",\"Βερίνη\",\"Βέρα\",\"Βερούλα\",\"Βερούλη\"],\"date\":\"04\\/10\"},{\"names\":[\"Βαρθολομαίος\"],\"date\":\"11\\/06\"},{\"names\":[\"Βαρθολομαίος\"],\"date\":\"25\\/08\"},{\"names\":[\"Βαρνάβας\"],\"date\":\"11\\/06\"},{\"names\":[\"Βερονίκη\",\"Βερόνικα\",\"Βερούλα\",\"Βέρα\"],\"date\":\"12\\/07\"},{\"names\":[\"Βαρσαμία\",\"Βαρσάμω\",\"Βαλσάμω\",\"Βαλσαμία\",\"Βαρσιμαίος\",\"Βαρσάμης\",\"Βαλσάμης\"],\"date\":\"29\\/01\"},{\"names\":[\"Βασίλειος\",\"Βασίλης\",\"Βάσος\",\"Βασίλας\",\"Βασιλάκης\",\"Μπίλλης\",\"Μπίλης\",\"Βίλυ\"],\"date\":\"01\\/01\"},{\"names\":[\"Βασιλική\",\"Βασιλεία\",\"Βασιλίνα\",\"Βασιλικούλα\",\"Βάσω\",\"Βάσια\",\"Βασούλα\",\"Βίκυ\"],\"date\":\"01\\/01\"},{\"names\":[\"Βασίλισσα\"],\"date\":\"08\\/01\"},{\"names\":[\"Βήλη\",\"Βίλια\"],\"date\":\"28\\/10\"},{\"names\":[\"Βηθλεέμ\"],\"date\":\"25\\/12\"},{\"names\":[\"Βησσαρίων\",\"Βησσαρίωνας\"],\"date\":\"15\\/09\"},{\"names\":[\"Βλαδίμηρος\",\"Βλαντίμηρος\"],\"date\":\"15\\/07\"},{\"names\":[\"Βιβιανός\",\"Βιβιάνα\",\"Βιβιανή\",\"Βίβιαν\",\"Βιβή\"],\"date\":\"09\\/03\"},{\"names\":[\"Βίβος\",\"Βιβή\"],\"date\":\"06\\/09\"},{\"names\":[\"Βλάσιος\",\"Βλάσος\",\"Βλάσης\",\"Βλασία\",\"Βλασούλα\"],\"date\":\"11\\/02\"},{\"names\":[\"Βικέντιος\",\"Βικέντης\",\"Βικεντία\"],\"date\":\"11\\/11\"},{\"names\":[\"Βίκτωρ\",\"Βίκτορας\",\"Βικτωρία\",\"Βικτορία\"],\"date\":\"11\\/11\"},{\"names\":[\"Βιργινία\"],\"date\":\"21\\/11\"},{\"names\":[\"Γεδεών\"],\"date\":\"30\\/12\"},{\"names\":[\"Γαβριέλα\",\"Γαβρίλα\",\"Γαβριηλίτσα\",\"Γαβριλίτσα\",\"Αραβέλα\"],\"date\":\"08\\/11\"},{\"names\":[\"Γαβριήλ\",\"Γαβρίλος\",\"Γαβρίλης\"],\"date\":\"08\\/11\"},{\"names\":[\"Γαλακτίων\",\"Γαλακτίωνας\",\"Γαλάτιος\",\"Γαλάτης\",\"Γαλακτία\",\"Γαλατεία\",\"Γαλάτια\"],\"date\":\"05\\/11\"},{\"names\":[\"Γαλάτεια\",\"Γαλατία\"],\"date\":\"18\\/05\"},{\"names\":[\"Γαλήνη\"],\"date\":\"16\\/04\"},{\"names\":[\"Γαληνός\"],\"date\":\"16\\/04\"},{\"names\":[\"Γενέθλιος\"],\"date\":\"08\\/09\"},{\"names\":[\"Γεννάδιος\",\"Γενάδιος\"],\"date\":\"17\\/11\"},{\"names\":[\"Γενοβέφα\",\"Γενεβιέβη\"],\"date\":\"03\\/01\"},{\"names\":[],\"date\":\"24\\/06\"},{\"names\":[\"Γερβάσιος\",\"Γερβασία\"],\"date\":\"14\\/10\"},{\"names\":[\"Γεράκης\",\"Γερακίνα\"],\"date\":\"01\\/06\"},{\"names\":[\"Γεράσιμος\",\"Μάκης\",\"Μικές\",\"Μίκης\"],\"date\":\"16\\/08\"},{\"names\":[\"Γεράσιμος\",\"Μάκης\",\"Μικές\",\"Μίκης\"],\"date\":\"20\\/10\"},{\"names\":[\"Γεράσιμος\",\"Μάκης\",\"Μικές\",\"Μίκης\"],\"date\":\"04\\/03\"},{\"names\":[\"Γερμανός\"],\"date\":\"28\\/06\"},{\"names\":[\"Γερόντιος\",\"Γερoντιος\"],\"date\":\"13\\/04\"},{\"names\":[\"Γερτρούδη\"],\"date\":\"17\\/03\"},{\"names\":[\"Γαρυφαλλιά\",\"Γαριφαλιά\"],\"date\":\"19\\/07\"},{\"names\":[\"Γεσθημανή\",\"Ιεσθημανή\",\"Γεθσημανή\"],\"date\":\"15\\/08\"},{\"names\":[\"Γιάννα\",\"Γιαννούλα\",\"Γιανγκούλα\"],\"date\":\"07\\/01\"},{\"names\":[\"Γιάννης\",\"Τζαννής\",\"Τζανής\",\"Γιαννιός\",\"Γιάννος\",\"Γιάνναρος\",\"Γιανναράς\",\"Γιάνγκος\",\"Γιανγκούλας\",\"Γιαννάκης\",\"Γιάγκος\"],\"date\":\"07\\/01\"},{\"names\":[\"Γκασπάρ\",\"Γκάσπαρος\"],\"date\":\"25\\/12\"},{\"names\":[\"Γλαφύρα\",\"Γλαφυρή\",\"Γλαφυρούλα\",\"Γλαφυρός\"],\"date\":\"26\\/04\"},{\"names\":[\"Γλυκερία\",\"Γλυκερή\",\"Γλυκέρω\",\"Γλυκερίτσα\"],\"date\":\"13\\/05\"},{\"names\":[\"Γλυκέριος\",\"Γλυκερός\"],\"date\":\"03\\/12\"},{\"names\":[\"Γλύκων\",\"Γλυκός\"],\"date\":\"26\\/10\"},{\"names\":[\"Γρηγόρης\",\"Γρηγορία\",\"Γρηγόριος\",\"Γόλης\"],\"date\":\"25\\/01\"},{\"names\":[\"Γρηγόρης\",\"Γρηγορία\",\"Γρηγόριος\",\"Γόλης\"],\"date\":\"14\\/11\"},{\"names\":[],\"date\":\"08\\/03\"},{\"names\":[\"Δαβίδ\",\"Δαυίδ\"],\"date\":\"26\\/06\"},{\"names\":[],\"date\":\"01\\/11\"},{\"names\":[],\"date\":\"13\\/12\"},{\"names\":[],\"date\":\"18\\/04\"},{\"names\":[\"Δεναχίς\",\"Δεναχίδα\"],\"date\":\"20\\/11\"},{\"names\":[\"Δαμασκηνός\",\"Δαμασκηνή\"],\"date\":\"13\\/11\"},{\"names\":[\"Δαμιανός\",\"Δαμιανή\"],\"date\":\"01\\/07\"},{\"names\":[\"Δαμιανός\",\"Δαμιανή\"],\"date\":\"01\\/11\"},{\"names\":[\"Δανιήλ\",\"Δανιήλος\",\"Δανιέλος\",\"Δανιήλα\",\"Δανιέλα\",\"Δανιηλίτσα\"],\"date\":\"17\\/12\"},{\"names\":[\"Δάμων\",\"Δάμωνας\"],\"date\":\"28\\/08\"},{\"names\":[\"Δαρεία\",\"Δάρα\",\"Δάρω\"],\"date\":\"19\\/03\"},{\"names\":[\"Δεσποινούλα\",\"Δέσπω\",\"Δεσπούλα\",\"Δεσποίνου\",\"Δεσποίνω\",\"Δεσποινιώ\",\"Ντέπη\",\"Πέπη\",\"Ζέπω\",\"Πιπίνα\",\"Δεσποινα\"],\"date\":\"21\\/11\"},{\"names\":[\"Δέσπω\",\"Δεσποίνου\",\"Δεσποινιώ\",\"Ντέπη\",\"Πέπη\",\"Ζέπω\",\"Πιπίνα\",\"Δεσποινα\"],\"date\":\"15\\/08\"},{\"names\":[\"Δεσποινούλα\",\"Δέσπω\",\"Δεσπούλα\",\"Δεσποίνου\",\"Δεσποίνω\",\"Δεσποινιώ\",\"Ντέπη\",\"Πέπη\",\"Ζέπω\",\"Πιπίνα\",\"Δεσποινα\"],\"date\":\"08\\/09\"},{\"names\":[\"Δήμητρα\",\"Δημητρούλα\",\"Δημητρία\",\"Μιμή\",\"Μιμίκα\",\"Ντίμι\"],\"date\":\"26\\/10\"},{\"names\":[\"Δημήτριος\",\"Δημήτρης\",\"Δημητρός\",\"Δήμος\",\"Μίμης\",\"Δημητράκης\",\"Τζίμης\",\"Τζιμάκος\",\"Μήτσος\",\"Μητσάκος\",\"Μήτρος\"],\"date\":\"26\\/10\"},{\"names\":[\"Δημήτριος\",\"Δημήτρης\",\"Μήτρος\"],\"date\":\"28\\/05\"},{\"names\":[\"Δημοκλής\",\"Δήμος\",\"Δημόκλεια\"],\"date\":\"10\\/04\"},{\"names\":[\"Δημοσθένης\",\"Δήμος\"],\"date\":\"10\\/04\"},{\"names\":[\"Αδαμαντία\",\"Αντα\",\"Διαμάντω\"],\"date\":\"01\\/09\"},{\"names\":[\"Διογένης\"],\"date\":\"05\\/12\"},{\"names\":[\"Διομήδης\"],\"date\":\"16\\/08\"},{\"names\":[\"Διονύσιος\",\"Νύσης\",\"Διονύσης\",\"Νιόνιος\",\"Διονυσία\",\"Διονυσούλα\",\"Νύσα\",\"Ντένης\",\"Ντενίζ\",\"Σίσσυ\"],\"date\":\"03\\/10\"},{\"names\":[\"Διονύσιος\",\"Νύσης\",\"Διονύσης\",\"Νιόνιος\",\"Διονυσία\",\"Διονυσούλα\",\"Νύσα\",\"Ντένης\",\"Ντενίζ\",\"Σίσσυ\"],\"date\":\"17\\/12\"},{\"names\":[\"Διονύσιος\",\"Νύσης\",\"Διονύσης\",\"Νιόνιος\",\"Διονυσία\",\"Διονυσούλα\",\"Νύσα\",\"Ντένης\",\"Ντενίζ\",\"Σίσσυ\"],\"date\":\"10\\/04\"},{\"names\":[\"Διονύσιος\",\"Νύσης\",\"Διονύσης\",\"Νιόνιος\",\"Διονυσία\",\"Διονυσούλα\",\"Νύσα\",\"Ντένης\",\"Ντενίζ\",\"Σίσσυ\"],\"date\":\"23\\/01\"},{\"names\":[\"Διόνυσος\"],\"date\":\"01\\/11\"},{\"names\":[\"Διός\",\"Δίας\"],\"date\":\"19\\/07\"},{\"names\":[\"Διοσκουρίδης\",\"Διοσκορίδης\",\"Διόσκορος\"],\"date\":\"11\\/05\"},{\"names\":[\"Διοσκουρίδης\"],\"date\":\"28\\/05\"},{\"names\":[\"Διώνη\",\"Διόνη\"],\"date\":\"01\\/09\"},{\"names\":[\"Δονάτος\",\"Δονάτα\",\"Ντονάτα\",\"Ντονατέλα\"],\"date\":\"30\\/04\"},{\"names\":[\"Δομινίκη\",\"Δομνίκα\",\"Δομνίκη\"],\"date\":\"08\\/01\"},{\"names\":[\"Δόμνα\"],\"date\":\"28\\/12\"},{\"names\":[\"Δούκας\",\"Δούκισσα\",\"Δουκίτσα\"],\"date\":\"24\\/04\"},{\"names\":[\"Δράκων\",\"Δράκοντας\",\"Δράκος\",\"Δρακούλης\",\"Δρακούλα\"],\"date\":\"11\\/11\"},{\"names\":[\"Δρόσος\"],\"date\":\"22\\/03\"},{\"names\":[\"Δρόσος\"],\"date\":\"28\\/07\"},{\"names\":[\"Δροσίς\",\"Δροσίδα\",\"Δροσούλα\",\"Δροσία\",\"Δρόσω\",\"Δροσοσταλία\",\"Δροσοσταλίδα\"],\"date\":\"22\\/03\"},{\"names\":[\"Δροσίς\",\"Δροσίδα\",\"Δροσούλα\",\"Δροσία\",\"Δρόσω\",\"Δροσοσταλία\",\"Δροσοσταλίδα\"],\"date\":\"28\\/07\"},{\"names\":[\"Δωδώνη\"],\"date\":\"01\\/09\"},{\"names\":[\"Δωρόθεος\",\"Δωροθέα\",\"Δωροθέη\",\"Δωρούλα\",\"Δώρα\"],\"date\":\"05\\/06\"},{\"names\":[\"Εδουάρδος\",\"Εντυ\",\"Εντουαρντ\"],\"date\":\"18\\/03\"},{\"names\":[\"Επαμεινώνδας\"],\"date\":\"10\\/04\"},{\"names\":[],\"date\":\"28\\/10\"},{\"names\":[\"Επίχαρις\",\"Επιχάρια\"],\"date\":\"27\\/09\"},{\"names\":[\"Επιφάνειος\",\"Επιφάνιος\",\"Επιφανία\"],\"date\":\"12\\/05\"},{\"names\":[\"Επιστήμη\"],\"date\":\"05\\/11\"},{\"names\":[\"Ελένη\",\"Ελενα\",\"Ελεάννα\",\"Ελεάνα\",\"Λένα\",\"Ελενιώ\",\"Ελενίτσα\",\"Λενίτσα\",\"Λένγκω\",\"Λενιώ\",\"Ελεωνόρα\",\"Ελεονόρα\",\"Ελεονώρα\",\"Νόρα\",\"Μαριλένα\"],\"date\":\"21\\/05\"},{\"names\":[\"Ελενος\",\"Λένος\"],\"date\":\"23\\/11\"},{\"names\":[\"Ελέσα\",\"Ελέσσα\"],\"date\":\"01\\/08\"},{\"names\":[\"Ελευθέριος\",\"Λευθέρης\",\"Λευτέρης\",\"Λεφτέρης\",\"Ελευθερία\",\"Λευθερία\",\"Λευτερία\",\"Ρία\"],\"date\":\"15\\/12\"},{\"names\":[\"Ελπίδα\"],\"date\":\"17\\/09\"},{\"names\":[\"Ελπιδηφόρος\",\"Ελπιδηφόρα\",\"Ελπιδοφόρος\",\"Ελπιδοφόρα\"],\"date\":\"02\\/11\"},{\"names\":[\"Ελπινίκη\"],\"date\":\"01\\/09\"},{\"names\":[\"Ελλάδιος\",\"Ελλάδης\"],\"date\":\"09\\/11\"},{\"names\":[\"Ελισάβετ\",\"Ελίζα\",\"Λίζα\",\"Λιζέτα\",\"Ζέτα\",\"Ζέττα\",\"Ελλη\",\"Βέτα\"],\"date\":\"24\\/04\"},{\"names\":[\"Ελισσαίος\",\"Ελισσώ\",\"Ελισώ\"],\"date\":\"14\\/06\"},{\"names\":[\"Εθνεγερσία\"],\"date\":\"25\\/03\"},{\"names\":[\"Ειρηναίος\",\"Ειρηναία\"],\"date\":\"05\\/05\"},{\"names\":[\"Ειρήναρχος\"],\"date\":\"28\\/11\"},{\"names\":[\"Ειρήνη\",\"Ειρήνα\",\"Ρένα\",\"Ρήνα\",\"Ρηνιώ\",\"Ρηνούλα\",\"Ειρήνγκω\",\"Ρένια\"],\"date\":\"05\\/05\"},{\"names\":[],\"date\":\"14\\/04\"},{\"names\":[\"Ειρήνη\",\"Ειρήνα\",\"Ρένα\",\"Ρήνα\",\"Ρηνιώ\",\"Ρηνούλα\",\"Ειρήνγκω\"],\"date\":\"28\\/07\"},{\"names\":[\"Ελώνα\",\"Ελλώνα\",\"Ελόνα\"],\"date\":\"15\\/08\"},{\"names\":[\"Εξακουστοδιανός\",\"Εξακουστωδιανός\",\"Εξακουστός\",\"Ξακουστός\",\"Ξακουστή\"],\"date\":\"04\\/08\"},{\"names\":[\"Εμμέλεια\",\"Εμυ\"],\"date\":\"01\\/01\"},{\"names\":[\"Εμμέλεια\",\"Εμυ\",\"Αμυ\"],\"date\":\"30\\/05\"},{\"names\":[\"Εμμανουέλα\",\"Εμμανουέλλα\",\"Μανουέλα\",\"Μανωλία\",\"Μανώλα\",\"Εμμα\"],\"date\":\"25\\/12\"},{\"names\":[\"Εμμανουέλλα\",\"Εμμανουέλα\",\"Μανουέλα\",\"Μανωλία\",\"Μανώλα\",\"Εμμα\"],\"date\":\"26\\/12\"},{\"names\":[\"Εμμανουήλ\",\"Μανώλης\",\"Μανωλιός\",\"Μανώλας\",\"Μανόλης\",\"Μανουήλ\",\"Μάνος\",\"Μανούσος\",\"Μανουσάκης\",\"Μανουσάκι\"],\"date\":\"25\\/12\"},{\"names\":[\"Εμμανουήλ\",\"Μανώλης\",\"Μανωλιός\",\"Μανώλας\",\"Μανόλης\",\"Μανουήλ\",\"Μάνος\",\"Μανούσος\",\"Μανουσάκης\",\"Μανουσάκι\"],\"date\":\"26\\/12\"},{\"names\":[\"Ενόη\"],\"date\":\"20\\/10\"},{\"names\":[\"Ερασμία\"],\"date\":\"01\\/09\"},{\"names\":[\"Ερασμος\"],\"date\":\"18\\/06\"},{\"names\":[\"Εράστη\"],\"date\":\"10\\/09\"},{\"names\":[\"Εραστος\"],\"date\":\"10\\/09\"},{\"names\":[\"Ερατώ\",\"Τέτη\"],\"date\":\"01\\/09\"},{\"names\":[\"Ερμείας\",\"Ερμεία\"],\"date\":\"31\\/05\"},{\"names\":[\"Ερμαίος\",\"Ερμαίας\"],\"date\":\"04\\/11\"},{\"names\":[\"Ερνέστος\",\"Ερνεστίνη\",\"Ερνεστίνα\",\"Ερνέστα\"],\"date\":\"07\\/11\"},{\"names\":[\"Ερμής\"],\"date\":\"08\\/03\"},{\"names\":[\"Ερμιόνη\",\"Ερμίνα\"],\"date\":\"04\\/09\"},{\"names\":[\"Ερμόλαος\",\"Ερμολία\",\"Λία\"],\"date\":\"26\\/07\"},{\"names\":[\"Ερμύλλος\",\"Ερμίλλος\",\"Ερμύλλη\",\"Ερμίλλη\",\"Ερμύλα\"],\"date\":\"13\\/01\"},{\"names\":[\"Ερση\"],\"date\":\"26\\/07\"},{\"names\":[\"Ερως\",\"Ερωτας\"],\"date\":\"25\\/06\"},{\"names\":[\"Ερωτηΐς\",\"Ερωτηΐδα\"],\"date\":\"06\\/10\"},{\"names\":[\"Ευάγγελος\",\"Ευαγγελία\",\"Βαγγέλης\",\"Βαγγέλας\",\"Βάγγος\",\"Αγγελής\",\"Βαγγελιώ\",\"Βαγγελίτσα\",\"Βαγγελή\",\"Βαγγελίνα\",\"Βάγγια\",\"Λίτσα\",\"Εύα\",\"Κέλλυ\",\"Λιλή\",\"Λιλίκα\"],\"date\":\"25\\/03\"},{\"names\":[\"Ευγενία\",\"Ευγενούλα\",\"Ευγενίτσα\",\"Τζένη\",\"Τζενούλα\",\"Ευγενίκη\"],\"date\":\"24\\/12\"},{\"names\":[\"Ευγένιος\",\"Ευγένης\"],\"date\":\"21\\/01\"},{\"names\":[\"Ευγένιος\",\"Ευγένης\"],\"date\":\"07\\/03\"},{\"names\":[\"Ευέλπιστος\",\"Ευελπίστη\"],\"date\":\"01\\/06\"},{\"names\":[\"Ευάνθης\"],\"date\":\"11\\/09\"},{\"names\":[\"Ευανθία\",\"Εύα\"],\"date\":\"11\\/09\"},{\"names\":[\"Ευδοκία\",\"Ευδοκή\"],\"date\":\"01\\/03\"},{\"names\":[\"Ετεοκλής\"],\"date\":\"10\\/04\"},{\"names\":[\"Ευδόκιμος\",\"Ευδόκιμη\"],\"date\":\"31\\/07\"},{\"names\":[\"Ευδοξία\",\"Ευδοξούλα\",\"Δόξα\",\"Δοξούλα\"],\"date\":\"31\\/01\"},{\"names\":[\"Ευδόξιος\",\"Ευδόξης\",\"Δόξης\"],\"date\":\"06\\/09\"},{\"names\":[\"Εσπερος\",\"Εσπέρα\",\"Εσπερία\"],\"date\":\"02\\/05\"},{\"names\":[\"Εύπλους\",\"Εύπλος\",\"Εύπλοος\"],\"date\":\"11\\/08\"},{\"names\":[\"Ευπρέπιος\",\"Ευπρέπειος\",\"Ευπρεπής\",\"Ευπρεπία\"],\"date\":\"17\\/10\"},{\"names\":[\"Ευπραξία\",\"Ευπραξούλα\",\"Πραξούλα\",\"Ευπράξιος\",\"Εύπραξος\"],\"date\":\"25\\/07\"},{\"names\":[\"Ευθαλία\",\"Ευθαλίτσα\",\"Ευθαλιώ\",\"Θάλια\",\"Θάλεια\",\"Θαλίτσα\",\"Θαλιώ\"],\"date\":\"02\\/03\"},{\"names\":[\"Ευλάλιος\",\"Ευλαλία\"],\"date\":\"30\\/08\"},{\"names\":[\"Ευλαμπία\",\"Ευλαμπή\",\"Ευλάμπω\",\"Λαμπή\",\"Λαμπίνα\",\"Λαμπία\",\"Λάμπω\"],\"date\":\"10\\/10\"},{\"names\":[\"Ευλάμπιος\",\"Λάμπης\",\"Ευλάμπης\"],\"date\":\"10\\/10\"},{\"names\":[\"Εύκλεος\",\"Ευκλεή\",\"Ευκλέα\"],\"date\":\"01\\/08\"},{\"names\":[\"Ευλόγιος\",\"Ευλογής\",\"Ευλογία\",\"Ευλογούλα\",\"Ευλογίτσα\"],\"date\":\"05\\/03\"},{\"names\":[\"Ευκράτης\",\"Εύκρατος\",\"Ευκρατάς\",\"Ευκρατία\",\"Ευκρατούλα\",\"Ευκρασία\"],\"date\":\"21\\/10\"},{\"names\":[\"Ευθύμιος\",\"Ευθύμης\",\"Θύμιος\",\"Θέμης\",\"Ευθυμία\",\"Ευθυμούλα\"],\"date\":\"20\\/01\"},{\"names\":[\"Ευμένιος\",\"Ευμένης\",\"Ευμενία\"],\"date\":\"18\\/09\"},{\"names\":[\"Ευνίκη\",\"Ευνίκα\"],\"date\":\"28\\/10\"},{\"names\":[\"Ευνίκη\",\"Ευνίκα\"],\"date\":\"28\\/10\"},{\"names\":[\"Ευμορφία\",\"Εμμυ\"],\"date\":\"06\\/08\"},{\"names\":[\"Εφραίμ\"],\"date\":\"05\\/05\"},{\"names\":[\"Ευσέβιος\",\"Ευσεβής\",\"Ευσεβεία\",\"Σέβη\",\"Ευσεβούλα\",\"Σεβούλα\"],\"date\":\"22\\/06\"},{\"names\":[\"Ευσέβιος\",\"Ευσεβής\",\"Ευσεβεία\",\"Σέβη\",\"Ευσεβούλα\",\"Σεβούλα\"],\"date\":\"15\\/02\"},{\"names\":[\"Ευτέρπη\"],\"date\":\"01\\/09\"},{\"names\":[\"Ευφημία\",\"Εύφη\",\"Εύφημη\",\"Εύφημος\",\"Ευφημούλα\",\"Ευφούλα\",\"Φούλα\"],\"date\":\"11\\/07\"},{\"names\":[\"Ευφημία\",\"Εύφη\",\"Εύφημη\",\"Εύφημος\",\"Ευφημούλα\",\"Ευφούλα\",\"Φούλα\"],\"date\":\"16\\/09\"},{\"names\":[\"Ευφραίμ\",\"Ευφραίμιος\",\"Ευφραίμης\",\"Ευφραιμάκης\",\"Ευφραιμία\",\"Ευφραιμίτσα\"],\"date\":\"05\\/05\"},{\"names\":[\"Ευφρασία\",\"Ευφρασίτσα\"],\"date\":\"19\\/01\"},{\"names\":[\"Ευφράσιος\",\"Ευφράσης\",\"Ευφράσας\",\"Φράσας\",\"Φράσιος\",\"Φράσης\"],\"date\":\"14\\/03\"},{\"names\":[\"Ευφροσύνη\",\"Ευφροσύνα\",\"Φροσύνη\",\"Φρόσω\",\"Φροσούλα\",\"Φροσού\"],\"date\":\"25\\/09\"},{\"names\":[\"Ευφρόσυνος\",\"Φρόσυνος\"],\"date\":\"11\\/09\"},{\"names\":[\"Ευψύχιος\",\"Εύψυχος\",\"Ευψυχής\",\"Ευψυχία\",\"Ευψυχούλα\",\"Ευψυχίτσα\",\"Ψυχούλα\",\"Ψυχίτσα\"],\"date\":\"09\\/04\"},{\"names\":[\"Ευτύχιος\",\"Ευτύχης\",\"Ευτυχία\",\"Ευτυχούλα\",\"Ευτυχίτσα\",\"Εφη\"],\"date\":\"06\\/04\"},{\"names\":[\"Ευτύχιος\",\"Ευτύχης\",\"Ευτυχία\",\"Ευτυχούλα\",\"Εφη\"],\"date\":\"24\\/08\"},{\"names\":[\"Ευστάθιος\",\"Στάθης\",\"Σταθάς\",\"Σταθάκος\",\"Ευσταθία\",\"Σταθία\",\"Ευσταθούλα\",\"Σταθούλα\"],\"date\":\"20\\/09\"},{\"names\":[\"Ευστρατία\",\"Ευστράτιος\",\"Στράτος\"],\"date\":\"08\\/11\"},{\"names\":[\"Ευστράτιος\",\"Ευστράτης\",\"Ευστρατάς\",\"Στρατάς\",\"Στρατής\",\"Στράτος\",\"Ευστρατία\",\"Ευστρατούλα\",\"Στρατούλα\",\"Στράτα\"],\"date\":\"13\\/12\"},{\"names\":[\"Ζαχαρίας\",\"Ζάχαρης\",\"Ζάχαρος\",\"Ζαχάρω\",\"Ζαχαρούλα\",\"Ζαχαρίτσα\",\"Ζαχαρένια\",\"Ζάκι\",\"Ζάκης\"],\"date\":\"08\\/02\"},{\"names\":[\"Ζαχαρίας\",\"Ζάχαρης\",\"Ζάχαρος\",\"Ζαχάρω\",\"Ζαχαρούλα\",\"Ζαχαρίτσα\",\"Ζαχαρένια\",\"Ζάκι\",\"Ζάκης\"],\"date\":\"05\\/09\"},{\"names\":[\"Ζακχαίος\",\"Ζάκχος\",\"Ζάχος\"],\"date\":\"20\\/04\"},{\"names\":[\"Ζαννέτος\",\"Ζαννέτα\",\"Ζανέτ\",\"Ζαννέττος\",\"Ζαννέττα\"],\"date\":\"07\\/01\"},{\"names\":[\"Ζηνάς\",\"Ζένας\",\"Ζένος\",\"Ζήνα\",\"Ζένα\",\"Ζένια\"],\"date\":\"22\\/06\"},{\"names\":[\"Ζηναΐς\",\"Ζηναΐδα\"],\"date\":\"07\\/06\"},{\"names\":[\"Ζηνοβία\",\"Ζήνα\",\"Τζήνα\",\"Τζίνα\",\"Ζελίνα\"],\"date\":\"30\\/10\"},{\"names\":[\"Ζηνόβιος\",\"Ζηνοβής\",\"Ζήνος\",\"Τζήνος\",\"Τζίνα\",\"Τζήνα\"],\"date\":\"30\\/10\"},{\"names\":[\"Ζήνων\"],\"date\":\"10\\/04\"},{\"names\":[\"Ζήνων\"],\"date\":\"27\\/09\"},{\"names\":[\"Ζουμπουλιά\"],\"date\":\"03\\/07\"},{\"names\":[\"Ζωγραφιά\"],\"date\":\"22\\/09\"},{\"names\":[\"Ζωΐλα\",\"Ζωίλος\"],\"date\":\"22\\/12\"},{\"names\":[\"Ζωσιμάς\",\"Ζωσιμίνα\"],\"date\":\"24\\/01\"},{\"names\":[\"Ζώσιμος\",\"Ζωσής\",\"Ζώσα\",\"Ζήσιμος\",\"Ζήσης\",\"Ζωσιμαίος\",\"Ζωσιμαία\"],\"date\":\"19\\/06\"},{\"names\":[\"Ηλιανός\",\"Ηλιανή\",\"Ηλιάνα\",\"Λιάνα\"],\"date\":\"09\\/03\"},{\"names\":[\"Ηλίας\",\"Λιάς\",\"Ηλιάκος\",\"Λιάκος\",\"Λίτσος\",\"Λιάκουρας\",\"Ηλιάνα\",\"Λιάνα\"],\"date\":\"20\\/07\"},{\"names\":[\"Ηλιόδωρος\",\"Ηλιοδώρα\",\"Ελεοδώρα\",\"Ελντα\"],\"date\":\"20\\/08\"},{\"names\":[\"Ηλιοστάλακτη\"],\"date\":\"15\\/08\"},{\"names\":[\"Ηλιόφωτος\"],\"date\":\"13\\/07\"},{\"names\":[\"Ηρακλής\",\"Ηρακλεία\"],\"date\":\"10\\/04\"},{\"names\":[\"Ηρώ\"],\"date\":\"10\\/08\"},{\"names\":[\"Ηρωδίων\",\"Ροδίων\",\"Ηρωδιάς\",\"Ηρωδιάδα\"],\"date\":\"10\\/11\"},{\"names\":[\"Ηρων\"],\"date\":\"10\\/08\"},{\"names\":[\"Ησαΐας\",\"Ησαΐα\",\"Ησαΐτσα\",\"Σίτσα\"],\"date\":\"09\\/05\"},{\"names\":[\"Ηφαιστίων\"],\"date\":\"10\\/04\"},{\"names\":[\"Ησύχιος\",\"Ησύχης\",\"Ησυχία\"],\"date\":\"06\\/03\"},{\"names\":[\"Θεαγένης\",\"Θεαγένιος\",\"Θεαγενεία\",\"Θεαγενία\"],\"date\":\"07\\/11\"},{\"names\":[\"Θεανώ\"],\"date\":\"01\\/09\"},{\"names\":[\"Θάλεια\"],\"date\":\"01\\/09\"},{\"names\":[\"Θαλάσσιος\",\"Θαλάσσης\",\"Θαλασσία\",\"Θάλασσα\",\"Θαλασσινή\"],\"date\":\"22\\/02\"},{\"names\":[\"Θαλλός\",\"Θαλλής\",\"Θαλής\",\"Θάλλεια\",\"Θάλεια\",\"Θάλλω\"],\"date\":\"11\\/03\"},{\"names\":[\"Θέκλα\"],\"date\":\"24\\/09\"},{\"names\":[],\"date\":\"15\\/04\"},{\"names\":[\"Θεοχάρης\",\"Θεοχαρούλα\",\"Χαρούλα\"],\"date\":\"20\\/08\"},{\"names\":[\"Θεμέλιος\",\"Θεμέλη\",\"Θεμελίνα\"],\"date\":\"07\\/11\"},{\"names\":[\"Θεόδοτος\",\"Θεοδότης\",\"Θεοδότη\"],\"date\":\"29\\/07\"},{\"names\":[\"Θεοδοσία\",\"Θεοδόσω\"],\"date\":\"29\\/05\"},{\"names\":[\"Θεόδουλος\",\"Θεοδούλιος\",\"Θεοδούλης\",\"Θεόδουλη\",\"Θεοδουλία\",\"Θεοδούλα\"],\"date\":\"18\\/01\"},{\"names\":[\"Θεοδόσιος\",\"Θεοδόσης\",\"Δόσιος\",\"Δόσης\"],\"date\":\"11\\/01\"},{\"names\":[\"Θεοδόσιος\",\"Θεοδόσης\",\"Δόσιος\",\"Δόσης\"],\"date\":\"17\\/01\"},{\"names\":[\"Θεόγνωστος\",\"Θεογνώστης\",\"Θεογνωσία\",\"Θεογνώσιος\"],\"date\":\"19\\/05\"},{\"names\":[\"Θεοδώρα\",\"Δώρα\",\"Ντόρα\",\"Θοδώρα\",\"Δωρούλα\"],\"date\":\"11\\/02\"},{\"names\":[\"Θεοδώρα\",\"Δώρα\",\"Ντόρα\",\"Θοδώρα\",\"Δωρούλα\"],\"date\":\"11\\/03\"},{\"names\":[],\"date\":\"28\\/02\"},{\"names\":[\"Θεοδώρα\",\"Δώρα\",\"Ντόρα\",\"Θόδωρος\",\"Θοδώρα\",\"Θοδωρής\",\"Θοδωράκης\",\"Θώδης\",\"Θώδος\",\"Δώρης\"],\"date\":\"17\\/02\"},{\"names\":[\"Θεοδώρα\",\"Δώρα\",\"Ντόρα\",\"Θόδωρος\",\"Θοδώρα\",\"Θοδωρής\",\"Θοδωράκης\",\"Θώδης\",\"Θώδος\",\"Δώρης\"],\"date\":\"12\\/05\"},{\"names\":[\"Θεόπεμπτος\",\"Θεόπεμπτη\"],\"date\":\"05\\/01\"},{\"names\":[\"Θεοπίστη\"],\"date\":\"20\\/09\"},{\"names\":[\"Θεοπούλα\",\"Θεόπη\"],\"date\":\"06\\/01\"},{\"names\":[\"Θεοπρέπιος\",\"Θεοπρεπής\",\"Θεοπρεπία\",\"Θεοπρεπή\"],\"date\":\"22\\/08\"},{\"names\":[\"Θεοκλής\",\"Θεοκλέας\",\"Θεόκλεια\"],\"date\":\"14\\/09\"},{\"names\":[\"Θεόκλητος\"],\"date\":\"01\\/12\"},{\"names\":[\"Θεολόγος\",\"Θεολόγης\",\"Θολόγος\",\"Θολόγης\",\"Θολόης\",\"Θεολογία\",\"Θολογία\"],\"date\":\"08\\/05\"},{\"names\":[\"Θεοκτίστη\"],\"date\":\"09\\/11\"},{\"names\":[\"Θεόκτιστος\"],\"date\":\"19\\/05\"},{\"names\":[\"Θεμιστοκλής\",\"Θέμης\",\"Θεμιστοκλεία\",\"Θέμις\",\"Θέμιδα\"],\"date\":\"10\\/04\"},{\"names\":[\"Θεμιστοκλής\",\"Θέμης\",\"Θεμιστοκλεία\",\"Θέμις\",\"Θέμιδα\"],\"date\":\"21\\/12\"},{\"names\":[\"Θεονύμφη\"],\"date\":\"01\\/09\"},{\"names\":[\"Θεοφάνης\",\"Φάνης\",\"Θεοφανία\"],\"date\":\"06\\/01\"},{\"names\":[\"Θεοφάνης\",\"Φάνης\",\"Θεοφανία\"],\"date\":\"12\\/03\"},{\"names\":[\"Θεοφανώ\"],\"date\":\"16\\/12\"},{\"names\":[\"Θεοφίλη\",\"Θεοφιλίτσα\",\"Φιλιώ\"],\"date\":\"28\\/12\"},{\"names\":[\"Θεόφιλος\",\"Θεοφίλη\",\"Θεοφίλης\",\"Θεοφιλίτσα\",\"Φιλιώ\"],\"date\":\"08\\/07\"},{\"names\":[\"Θεοτόκης\",\"Θεοτοκία\"],\"date\":\"15\\/08\"},{\"names\":[\"Θεόφραστος\"],\"date\":\"10\\/04\"},{\"names\":[\"Θεοφύλακτος\",\"Φυλακτός\",\"Φυλαχτός\",\"Θεοφύλακτη\",\"Φυλακτή\",\"Φυλαχτή\",\"Φυλαχτούλα\"],\"date\":\"08\\/03\"},{\"names\":[\"Θεράπων\"],\"date\":\"14\\/05\"},{\"names\":[\"Θεσπέσιος\",\"Θεσπέσης\",\"Θεσπέσια\"],\"date\":\"01\\/06\"},{\"names\":[\"Θαυμαστός\",\"Θαυμαστή\"],\"date\":\"24\\/04\"},{\"names\":[\"Θεωνάς\",\"Θεώνη\",\"Θεωνίτσα\"],\"date\":\"05\\/01\"},{\"names\":[\"Θηρεσία\"],\"date\":\"01\\/10\"},{\"names\":[\"Θησέας\",\"Θησεύς\"],\"date\":\"10\\/04\"},{\"names\":[\"Θύρσος\",\"Θύρσης\",\"Θύρσα\",\"Θύρση\"],\"date\":\"20\\/01\"},{\"names\":[\"Θωμαΐς\",\"Θωμαΐδα\",\"Θωμαή\"],\"date\":\"14\\/04\"},{\"names\":[\"Θωμάς\",\"Θωμαή\",\"Τόμας\"],\"date\":\"06\\/10\"},{\"names\":[\"Ιακχος\",\"Ιακχη\"],\"date\":\"17\\/12\"},{\"names\":[\"Ιακώβ\"],\"date\":\"01\\/12\"},{\"names\":[\"Ιάκωβος\",\"Ιακωβίνα\",\"Ζακελίνα\"],\"date\":\"30\\/04\"},{\"names\":[\"Ιάκωβος\"],\"date\":\"23\\/10\"},{\"names\":[\"Ιγνάτιος\",\"Ιγνάτης\",\"Ιγνατία\"],\"date\":\"14\\/10\"},{\"names\":[\"Ιγνάτιος\",\"Ιγνάτης\",\"Ιγνατία\"],\"date\":\"20\\/12\"},{\"names\":[\"Ιανός\",\"Ιανή\"],\"date\":\"21\\/04\"},{\"names\":[\"Ιανουάριος\"],\"date\":\"21\\/04\"},{\"names\":[\"Ιέραξ\",\"Ιέρακας\",\"Γέρακας\"],\"date\":\"01\\/06\"},{\"names\":[\"Ιερεμίας\"],\"date\":\"01\\/05\"},{\"names\":[\"Ιερία\",\"Ιέρεια\"],\"date\":\"03\\/06\"},{\"names\":[\"Ιερόθεος\",\"Ιεροθέα\",\"Ιεροθέη\"],\"date\":\"04\\/10\"},{\"names\":[\"Ιερώνυμος\",\"Γερώνυμος\",\"Ιερονύμη\"],\"date\":\"15\\/06\"},{\"names\":[\"Ιάσιμος\",\"Ιασίμη\",\"Σίμος\",\"Σίμη\"],\"date\":\"04\\/02\"},{\"names\":[\"Ιάσων\",\"Ιάσονας\",\"Ιάσωνας\"],\"date\":\"29\\/04\"},{\"names\":[],\"date\":\"01\\/09\"},{\"names\":[\"Ιππόλυτος\",\"Ιππολύτη\",\"Ιππολύτα\"],\"date\":\"10\\/08\"},{\"names\":[\"Ιλαρίων\",\"Ιλαρίωνας\",\"Ιλαρία\",\"Ιλαριάδα\",\"Λαριάδα\"],\"date\":\"06\\/06\"},{\"names\":[\"Ιλιάνα\",\"Ιλιάς\"],\"date\":\"09\\/03\"},{\"names\":[\"Ιλλύριος\",\"Ιλλυρία\",\"Λύρος\",\"Λύρα\"],\"date\":\"03\\/04\"},{\"names\":[\"Ιορδάνης\",\"Γιορντανής\",\"Ντάνης\",\"Δάνης\",\"Ιορδανία\",\"Ιορδάνα\",\"Γιορντάνα\",\"Ντάνα\",\"Δάνα\"],\"date\":\"06\\/01\"},{\"names\":[\"Ιουβενάλιος\",\"Ιουβεναλία\",\"Ιουβενάλης\",\"Γιουβενάλης\"],\"date\":\"13\\/12\"},{\"names\":[\"Ιουλία\",\"Ιουλίτσα\",\"Γιουλία\",\"Γιούλα\",\"Γιουλίτσα\",\"Ιούλιος\",\"Τζούλια\"],\"date\":\"18\\/05\"},{\"names\":[\"Ιουλιανή\",\"Ιουλία\",\"Ιουλίτσα\",\"Γιουλία\",\"Γιούλα\",\"Γιουλίτσα\",\"Ιούλιος\",\"Τζούλια\"],\"date\":\"21\\/12\"},{\"names\":[\"Ιουλιανός\",\"Γιουλιανός\",\"Γιολανός\"],\"date\":\"16\\/03\"},{\"names\":[\"Ιουλίττα\",\"Ιουλίτα\",\"Ιουλίττη\",\"Ιουλίτη\",\"Γιουλίττα\",\"Γιουλίτα\",\"Γιουλίττη\",\"Γιουλίτη\"],\"date\":\"15\\/07\"},{\"names\":[\"Ιουνία\",\"Γιουνία\"],\"date\":\"17\\/05\"},{\"names\":[\"Ιούστα\",\"Γιούστα\"],\"date\":\"02\\/10\"},{\"names\":[\"Ιουστίνα\",\"Ιουστίνη\",\"Γιουστίνα\",\"Γιουστίνη\"],\"date\":\"02\\/10\"},{\"names\":[\"Ιουστινιανός\"],\"date\":\"02\\/08\"},{\"names\":[\"Ιουστίνος\"],\"date\":\"01\\/06\"},{\"names\":[\"Ιρις\",\"Ιριδα\"],\"date\":\"23\\/09\"},{\"names\":[\"Ιφιγένεια\"],\"date\":\"16\\/11\"},{\"names\":[\"Ισιδώρα\",\"Δώρα\"],\"date\":\"01\\/05\"},{\"names\":[\"Ισίδωρος\",\"Σιδέρης\"],\"date\":\"04\\/02\"},{\"names\":[\"Ισίδωρος\",\"Σιδέρης\"],\"date\":\"14\\/05\"},{\"names\":[\"Ισμαήλ\",\"Ισμαήλης\",\"Ισμαήλος\",\"Σμαήλης\",\"Σμαήλος\",\"Μαήλης\",\"Μαήλος\"],\"date\":\"17\\/06\"},{\"names\":[\"Ισμήνη\"],\"date\":\"01\\/09\"},{\"names\":[\"Ισοκράτης\"],\"date\":\"10\\/04\"},{\"names\":[\"Ιώβ\",\"Ιωβία\",\"Ιώβη\"],\"date\":\"06\\/05\"},{\"names\":[],\"date\":\"13\\/12\"},{\"names\":[\"Ιωακείμ\",\"Μάκης\"],\"date\":\"09\\/09\"},{\"names\":[\"Ιωάννης\",\"Ιωάννα\",\"Ιβάνα\",\"Βάνα\",\"Βάννα\"],\"date\":\"07\\/01\"},{\"names\":[],\"date\":\"27\\/05\"},{\"names\":[\"Ιωαννίκιος\",\"Ιωανίκιος\"],\"date\":\"04\\/11\"},{\"names\":[\"Ιωνάς\",\"Ιων\",\"Ιωνία\"],\"date\":\"21\\/09\"},{\"names\":[\"Ιωσήφ\",\"Σήφης\",\"Ιωσηφίνα\",\"Ζοζεφίνα\"],\"date\":\"09\\/04\"},{\"names\":[\"Ιωσήφ\",\"Σήφης\",\"Ιωσηφίνα\",\"Ζοζεφίνα\"],\"date\":\"31\\/07\"},{\"names\":[\"Ιωσήφ\",\"Σήφης\",\"Ιωσηφίνα\",\"Ζοζεφίνα\"],\"date\":\"30\\/12\"},{\"names\":[\"Κάλη\"],\"date\":\"15\\/05\"},{\"names\":[\"Καλλιόπη\",\"Καλλιοπία\",\"Πόπη\"],\"date\":\"08\\/06\"},{\"names\":[\"Καλλίνικος\",\"Καλλινίκης\"],\"date\":\"29\\/07\"},{\"names\":[\"Καλλιρόη\",\"Καλλιρρόη\"],\"date\":\"01\\/09\"},{\"names\":[\"Καλλίς\",\"Καλλίδα\",\"Καλλία\",\"Κάλλι\",\"Καλίς\",\"Καλίδα\",\"Καλία\",\"Κάλι\"],\"date\":\"16\\/04\"},{\"names\":[\"Καλλισθένη\",\"Καλλισθένης\"],\"date\":\"04\\/10\"},{\"names\":[\"Καλλίστη\"],\"date\":\"01\\/09\"},{\"names\":[\"Κάλλιστος\",\"Κάλιστος\"],\"date\":\"20\\/06\"},{\"names\":[\"Καλλίστρατος\",\"Καλλιστράτης\",\"Καλλιστράτη\"],\"date\":\"27\\/09\"},{\"names\":[\"Καλλιστώ\",\"Καλιστώ\"],\"date\":\"01\\/09\"},{\"names\":[\"Καθολική\"],\"date\":\"15\\/08\"},{\"names\":[\"Κέλσιος\",\"Κέλσια\",\"Κέλσα\",\"Κέλση\",\"Τσέλση\",\"Ελση\",\"Ελσα\"],\"date\":\"08\\/01\"},{\"names\":[\"Κερασιά\"],\"date\":\"20\\/10\"},{\"names\":[\"Καρπός\"],\"date\":\"13\\/10\"},{\"names\":[\"Καρπός\"],\"date\":\"26\\/05\"},{\"names\":[\"Κέρκυρα\"],\"date\":\"29\\/04\"},{\"names\":[\"Κασσιανή\",\"Κάσσυ\",\"Κασιανή\",\"Κασσιανός\",\"Κασιανός\",\"Κασσία\",\"Κασία\",\"Κάσσιος\",\"Κάσιος\",\"Κάσσος\",\"Κάσος\",\"Κάσσης\",\"Κάσης\"],\"date\":\"07\\/09\"},{\"names\":[\"Κασσιανός\",\"Κασιανός\",\"Κάσσιος\",\"Κάσιος\",\"Κάσσος\",\"Κάσος\",\"Κάσσης\",\"Κάσης\",\"Κασσια\",\"Κασια\"],\"date\":\"29\\/02\"},{\"names\":[\"Κάστωρ\",\"Κάστορας\",\"Κάστορης\"],\"date\":\"18\\/09\"},{\"names\":[\"Κήρυκος\"],\"date\":\"15\\/07\"},{\"names\":[\"Κλειώ\"],\"date\":\"01\\/09\"},{\"names\":[\"Κλεόπας\",\"Κλεόπιος\",\"Κλεοπία\",\"Κλεοπάκης\",\"Πάκης\"],\"date\":\"30\\/10\"},{\"names\":[\"Κλεοπάτρα\",\"Πάτρα\",\"Πατρούλα\",\"Κλειώ\",\"Πατριτσα\"],\"date\":\"01\\/09\"},{\"names\":[\"Κλεοπάτρα\",\"Πάτρα\",\"Πατρούλα\",\"Πατρίτσα\",\"Κλειώ\"],\"date\":\"19\\/10\"},{\"names\":[\"Κλεονίκη\"],\"date\":\"01\\/09\"},{\"names\":[\"Κλεόνικος\",\"Κλεονίκη\",\"Κλεονίκω\",\"Νίκη\"],\"date\":\"03\\/03\"},{\"names\":[\"Κιάρα\",\"Κιαράν\"],\"date\":\"09\\/09\"},{\"names\":[\"Κλημεντίνη\",\"Κλημεντίνα\",\"Κλεμεντίνη\",\"Κλεμεντίνα\"],\"date\":\"10\\/09\"},{\"names\":[\"Κλήμης\"],\"date\":\"10\\/09\"},{\"names\":[\"Κλώντια\",\"Κλόντια\",\"Κλό\",\"Κλαύδια\"],\"date\":\"20\\/03\"},{\"names\":[\"Κόδρος\",\"Κόδρα\"],\"date\":\"22\\/05\"},{\"names\":[\"Κόπρος\",\"Κόπρις\"],\"date\":\"24\\/09\"},{\"names\":[\"Κόνων\"],\"date\":\"05\\/03\"},{\"names\":[\"Κοραλία\",\"Κοραλλού\"],\"date\":\"01\\/09\"},{\"names\":[\"Κορνήλιος\",\"Κορνήλης\",\"Κορνήλος\",\"Κορνηλία\",\"Κορνήλα\"],\"date\":\"13\\/09\"},{\"names\":[\"Κοσμάς\"],\"date\":\"01\\/07\"},{\"names\":[\"Κοσμάς\"],\"date\":\"01\\/11\"},{\"names\":[\"Κρονίων\",\"Κρονίωνας\",\"Κρονίος\",\"Κρόνος\",\"Κρονία\"],\"date\":\"30\\/10\"},{\"names\":[\"Κρυστάλλω\",\"Κρουστάλλω\",\"Κρουστάλω\",\"Κρυσταλία\",\"Κρυσταλλία\",\"Κρουσταλένια\",\"Κρίστι\",\"Κρύστα\"],\"date\":\"15\\/08\"},{\"names\":[\"Κυπαρισσία\",\"Σίσσυ\",\"Παρέσια\",\"Παρεσίνα\",\"Παρεσσία\",\"Παρέσσα\"],\"date\":\"26\\/11\"},{\"names\":[\"Κυπριανός\",\"Κυπριανή\"],\"date\":\"02\\/10\"},{\"names\":[\"Κύρα\",\"Κυράτσα\",\"Κυράτσω\",\"Κυράτση\",\"Κυρατσούδα\",\"Κυρατσούλα\"],\"date\":\"28\\/02\"},{\"names\":[\"Κυριακή\",\"Κυριάκος\",\"Κική\",\"Κίκα\",\"Κικίτσα\",\"Κίτσα\",\"Κορίνα\",\"Σάντυ\",\"Κίτσος\",\"Ντομένικα\",\"Ρία\",\"Ύρια\",\"Ια\"],\"date\":\"07\\/07\"},{\"names\":[\"Κυριάκος\"],\"date\":\"29\\/09\"},{\"names\":[\"Κύριλλος\",\"Κυριλλία\",\"Κυρίλλα\",\"Κυρίλλη\"],\"date\":\"18\\/01\"},{\"names\":[\"Κύρος\",\"Κύρης\"],\"date\":\"31\\/01\"},{\"names\":[\"Κωνσταντίνα\",\"Κωσταντίνα\",\"Κωστούλα\",\"Ντίνα\",\"Τίνα\"],\"date\":\"21\\/05\"},{\"names\":[\"Κωνσταντίνος\",\"Κωσταντίνος\",\"Κώστας\",\"Κωστής\",\"Κώτσος\",\"Κώτσαρης\",\"Κωστάκης\",\"Κωτσάκης\",\"Κωστάρας\",\"Κωστάλας\"],\"date\":\"21\\/05\"},{\"names\":[\"Κωνστάντιος\",\"Κωστάντιος\",\"Κωνσταντία\",\"Κωσταντία\",\"Ντία\"],\"date\":\"26\\/12\"},{\"names\":[\"Λέανδρος\"],\"date\":\"13\\/03\"},{\"names\":[\"Λεπτίνα\",\"Λέπτινος\"],\"date\":\"26\\/10\"},{\"names\":[\"Λαμπαδός\",\"Λαμπαδία\",\"Λαμπαδίνα\",\"Λαμπαδή\"],\"date\":\"05\\/07\"},{\"names\":[\"Λεονάρδος\"],\"date\":\"06\\/11\"},{\"names\":[\"Λεμονιά\"],\"date\":\"21\\/11\"},{\"names\":[\"Λεόντιος\",\"Λεοντία\",\"Λεοντίνα\",\"Λεοντίτσα\"],\"date\":\"18\\/06\"},{\"names\":[\"Λεύκιος\",\"Λεύκης\",\"Λεύκος\",\"Λευκή\",\"Λευκούλα\",\"Λεύκας\",\"Λευκάδα\"],\"date\":\"14\\/12\"},{\"names\":[\"Λευκοθέα\",\"Λευκοθέη\"],\"date\":\"17\\/08\"},{\"names\":[\"Λαυρέντιος\",\"Λαυρέντης\"],\"date\":\"10\\/08\"},{\"names\":[\"Λαύρος\",\"Λαύρης\",\"Λάουρος\",\"Λαύρα\",\"Λάουρα\"],\"date\":\"18\\/08\"},{\"names\":[\"Λέων\",\"Λέοντας\",\"Λεοντάριος\",\"Λεοντάρης\",\"Λεοντόκαρδος\"],\"date\":\"18\\/02\"},{\"names\":[\"Λεωνίδης\",\"Λεωνίδας\",\"Λεωνιδία\"],\"date\":\"15\\/04\"},{\"names\":[\"Λήδα\",\"Λύδα\"],\"date\":\"27\\/03\"},{\"names\":[\"Λήδα\",\"Λύδα\"],\"date\":\"20\\/05\"},{\"names\":[\"Λιβύη\",\"Λίβιος\",\"Λίβας\"],\"date\":\"15\\/06\"},{\"names\":[\"Λίνος\",\"Λίνα\"],\"date\":\"05\\/11\"},{\"names\":[\"Λοίζος\"],\"date\":\"22\\/09\"},{\"names\":[\"Λώτ\",\"Λότ\"],\"date\":\"09\\/10\"},{\"names\":[\"Λούππος\",\"Λούππης\"],\"date\":\"27\\/10\"},{\"names\":[\"Λουίζα\"],\"date\":\"22\\/09\"},{\"names\":[\"Λουκάς\",\"Λουκία\",\"Λουκίτσα\"],\"date\":\"18\\/10\"},{\"names\":[\"Λουκάς\",\"Λουκία\",\"Λουκίτσα\"],\"date\":\"11\\/06\"},{\"names\":[\"Λουκάς\",\"Λουκία\",\"Λουκίτσα\"],\"date\":\"13\\/12\"},{\"names\":[\"Λουκιανός\",\"Λουκιανή\"],\"date\":\"15\\/10\"},{\"names\":[\"Λούλου\",\"Λούλης\",\"Λούλα\"],\"date\":\"23\\/06\"},{\"names\":[\"Λουντμίλλα\",\"Λουντμίλα\"],\"date\":\"16\\/09\"},{\"names\":[\"Λυδία\"],\"date\":\"27\\/03\"},{\"names\":[\"Λυδία\"],\"date\":\"20\\/05\"},{\"names\":[\"Λυκίας\",\"Λυκία\",\"Λύκιος\"],\"date\":\"06\\/07\"},{\"names\":[\"Λυμπέρης\",\"Λιμπέρης\",\"Λιμπέριος\",\"Λιβέριος\",\"Λιβέρης\"],\"date\":\"27\\/08\"},{\"names\":[\"Λυσίμαχος\",\"Λυσιμάχη\"],\"date\":\"09\\/03\"},{\"names\":[\"Λώρα\",\"Λωραίνη\",\"Λάουρα\",\"Λαυρεντία\",\"Λαυρεντίνα\"],\"date\":\"10\\/08\"},{\"names\":[\"Μαγδαληνή\",\"Μάγδα\",\"Μαγδούλα\",\"Μαγδαλένα\",\"Μαγδαλένια\",\"Μαγδαλή\",\"Μαγδάλω\"],\"date\":\"19\\/05\"},{\"names\":[\"Μαγδαληνή\",\"Μάγδα\",\"Μαγδούλα\",\"Μαγδαλένα\",\"Μαγδαλένια\",\"Μαγδαλή\",\"Μαγδάλω\"],\"date\":\"22\\/07\"},{\"names\":[\"Μάγνος\",\"Μάγνα\",\"Μαγνής\"],\"date\":\"28\\/04\"},{\"names\":[\"Μάγος\",\"Μάγια\"],\"date\":\"31\\/05\"},{\"names\":[\"Μελχιώρ\",\"Μελχιόρ\"],\"date\":\"25\\/12\"},{\"names\":[\"Μακεδόνιος\",\"Μακεδόνας\",\"Μακεδόνης\",\"Μακεδονία\",\"Μακεδονούλα\",\"Μακεδονίτσα\",\"Μακεδών\"],\"date\":\"27\\/03\"},{\"names\":[\"Μαλαματή\",\"Μάλα\",\"Μαλαματένια\",\"Ματίνα\"],\"date\":\"23\\/08\"},{\"names\":[\"Μαλαματή\",\"Μάλα\",\"Μαλαματένια\",\"Ματίνα\"],\"date\":\"30\\/04\"},{\"names\":[\"Μελανία\",\"Μέλανυ\",\"Μελανή\",\"Μαύρη\"],\"date\":\"31\\/12\"},{\"names\":[\"Μακάριος\",\"Μακάρης\",\"Μακαράς\",\"Μακαρία\",\"Μακάρω\",\"Μακαρίτσα\",\"Μακαρούλα\"],\"date\":\"19\\/01\"},{\"names\":[\"Μακάριος\"],\"date\":\"26\\/06\"},{\"names\":[\"Μελέτιος\",\"Μελέτης\",\"Μελετία\",\"Μελετούλα\",\"Μελετίνα\"],\"date\":\"12\\/02\"},{\"names\":[\"Μελέτιος\",\"Μελέτης\",\"Μελετία\",\"Μελετούλα\",\"Μελετίνα\"],\"date\":\"01\\/09\"},{\"names\":[\"Μελπομένη\"],\"date\":\"01\\/09\"},{\"names\":[\"Μελής\",\"Μέλος\",\"Μέλιος\",\"Μέλας\",\"Μέλια\",\"Μελίτσα\"],\"date\":\"04\\/05\"},{\"names\":[\"Μελιτίνη\",\"Μελιτίνος\",\"Μελιτίνα\",\"Μελίτη\",\"Μελίτα\",\"Μελίνα\"],\"date\":\"16\\/09\"},{\"names\":[\"Μελιτίνη\",\"Μελιτίνος\",\"Μελιτίνα\",\"Μελίτη\",\"Μελίτα\",\"Μελίνα\"],\"date\":\"29\\/10\"},{\"names\":[\"Μελίτων\",\"Μελίτωνας\",\"Μελίτος\",\"Μελίτης\"],\"date\":\"30\\/06\"},{\"names\":[\"Μεθόδιος\"],\"date\":\"11\\/05\"},{\"names\":[\"Μεθόδιος\"],\"date\":\"20\\/06\"},{\"names\":[\"Μακρίνα\"],\"date\":\"19\\/07\"},{\"names\":[\"Μενέλαος\"],\"date\":\"22\\/07\"},{\"names\":[\"Μένανδρος\"],\"date\":\"19\\/05\"},{\"names\":[\"Μάμας\",\"Μάμαντας\",\"Μάμα\"],\"date\":\"02\\/09\"},{\"names\":[\"Μαξιμιλιανός\"],\"date\":\"04\\/08\"},{\"names\":[\"Μάξιμος\",\"Μάξιμη\",\"Μάξιμα\"],\"date\":\"21\\/01\"},{\"names\":[\"Μάξιμος\",\"Μάξιμη\",\"Μάξιμα\"],\"date\":\"10\\/04\"},{\"names\":[\"Μαντώ\"],\"date\":\"01\\/09\"},{\"names\":[\"Μαργαρίτα\"],\"date\":\"01\\/09\"},{\"names\":[\"Μαργαρίτα\"],\"date\":\"25\\/01\"},{\"names\":[\"Μαργέτα\",\"Μαριέττα\",\"Μαργετίνα\"],\"date\":\"15\\/08\"},{\"names\":[\"Μάριος\",\"Μάρω\",\"Μαριώ\",\"Μαριωρή\",\"Μαρίκα\",\"Μαριγώ\",\"Μαριγούλα\",\"Μαρούλα\",\"Μαρίτσα\",\"Μανιώ\",\"Μαριέττα\",\"Μαρούσα\",\"Μάρσια\",\"Μαρια\"],\"date\":\"15\\/08\"},{\"names\":[\"Μάριος\",\"Μάρω\",\"Μαριώ\",\"Μαριωρή\",\"Μαρίκα\",\"Μαριγώ\",\"Μαριγούλα\",\"Μαρούλα\",\"Μαρίτσα\",\"Μαριέττα\",\"Μαρούσα\",\"Μάρσια\",\"Μαρια\"],\"date\":\"21\\/11\"},{\"names\":[\"Μάρθα\"],\"date\":\"04\\/06\"},{\"names\":[\"Μαρκέλλα\",\"Μαρκέλα\",\"Μαρκελλή\",\"Μαρκελή\"],\"date\":\"22\\/07\"},{\"names\":[\"Μάρκελος\"],\"date\":\"09\\/02\"},{\"names\":[\"Μάρκελος\"],\"date\":\"01\\/08\"},{\"names\":[\"Μαριάνθη\"],\"date\":\"01\\/09\"},{\"names\":[\"Μαριάννα\"],\"date\":\"28\\/02\"},{\"names\":[\"Μαριλένα\"],\"date\":\"19\\/05\"},{\"names\":[\"Μαριλένα\"],\"date\":\"22\\/07\"},{\"names\":[\"Μαρκιανή\",\"Μαρκιάνα\"],\"date\":\"24\\/05\"},{\"names\":[\"Μαρκιανός\",\"Μαρκίνος\"],\"date\":\"30\\/10\"},{\"names\":[\"Μαρίνα\",\"Μαρίνος\"],\"date\":\"17\\/07\"},{\"names\":[\"Μαρινίκη\"],\"date\":\"15\\/08\"},{\"names\":[\"Μαρίνος\"],\"date\":\"02\\/06\"},{\"names\":[\"Μαρίνος\"],\"date\":\"18\\/10\"},{\"names\":[\"Μάριος\"],\"date\":\"13\\/03\"},{\"names\":[\"Μερκούριος\",\"Μερκούρης\",\"Μέρκουρας\",\"Μάρκορας\",\"Μερκουρία\"],\"date\":\"25\\/11\"},{\"names\":[\"Μερόπη\",\"Μυρόπη\"],\"date\":\"02\\/12\"},{\"names\":[\"Μέρτιος\",\"Μέρτος\",\"Μέρτης\",\"Μύρτος\",\"Μερτία\",\"Μέρτα\",\"Μέρτη\",\"Μερτούλα\",\"Μυρτιά\",\"Μυρτούλα\"],\"date\":\"12\\/01\"},{\"names\":[\"Μεταξία\",\"Μεταξούλα\",\"Ταξούλα\",\"Μεταξένια\"],\"date\":\"08\\/11\"},{\"names\":[\"Ματθαίος\",\"Μαθαίος\",\"Μαθιός\",\"Ματθούλα\",\"Μαθούλα\"],\"date\":\"16\\/11\"},{\"names\":[],\"date\":\"14\\/03\"},{\"names\":[\"Ματίνα\"],\"date\":\"08\\/11\"},{\"names\":[\"Μαύρα\",\"Μαυρούλα\",\"Μαυρίτσα\",\"Μαύρος\"],\"date\":\"09\\/11\"},{\"names\":[\"Μαυρίκιος\",\"Μαυρίκης\",\"Μαυρικία\",\"Μαυρίκα\",\"Μωρίς\"],\"date\":\"27\\/12\"},{\"names\":[\"Μαυρίκιος\",\"Μαυρίκης\",\"Μαυρικία\",\"Μαυρίκα\",\"Μωρίς\"],\"date\":\"01\\/07\"},{\"names\":[\"Μαύρος\",\"Μαυρουδής\",\"Μαυροειδής\",\"Μαυρέτα\"],\"date\":\"30\\/01\"},{\"names\":[\"Ματρώνα\",\"Ματρόνα\"],\"date\":\"27\\/03\"},{\"names\":[\"Ματρώνα\",\"Ματρόνα\"],\"date\":\"20\\/10\"},{\"names\":[\"Ματρώνα\",\"Ματρόνα\"],\"date\":\"02\\/05\"},{\"names\":[\"Μήλιος\",\"Μήλης\",\"Μηλιώ\",\"Μηλιά\",\"Μηλίτσα\"],\"date\":\"08\\/05\"},{\"names\":[\"Μηνάς\",\"Μηναίς\",\"Μήνα\"],\"date\":\"11\\/11\"},{\"names\":[\"Μηνοδώρα\"],\"date\":\"10\\/09\"},{\"names\":[\"Μητροδώρα\"],\"date\":\"10\\/09\"},{\"names\":[\"Μπαλταζάρ\",\"Μπαλτασάρ\"],\"date\":\"25\\/12\"},{\"names\":[\"Μιχαηλ\"],\"date\":\"02\\/05\"},{\"names\":[\"Ρωμανος\"],\"date\":\"24\\/07\"},{\"names\":[\"Μπριζίτ\",\"Μπριγκίτα\",\"Μπριγκίττα\"],\"date\":\"01\\/02\"},{\"names\":[\"Μιχαέλα\",\"Μιχαέλλα\",\"Μιχαήλα\",\"Μιχαηλίτσα\",\"Μιχαλίτσα\",\"Μισέλ\",\"Μιχαλία\"],\"date\":\"08\\/11\"},{\"names\":[\"Μιχαήλ\",\"Μιχάλης\",\"Μιχαλός\",\"Μιχαλιός\",\"Μιχαλάκης\",\"Μίχος\",\"Μιχελής\",\"Μιχαηλός\"],\"date\":\"08\\/11\"},{\"names\":[\"Μιλτιάδης\",\"Μίλτος\"],\"date\":\"10\\/04\"},{\"names\":[\"Μίλος\",\"Μίλης\",\"Μίλων\"],\"date\":\"10\\/11\"},{\"names\":[\"Μίνος\",\"Μίνως\",\"Μίνα\"],\"date\":\"11\\/11\"},{\"names\":[\"Μιρέλλα\",\"Μυρέλλα\",\"Μιρέιγ\"],\"date\":\"15\\/08\"},{\"names\":[\"Μόδεστος\"],\"date\":\"16\\/12\"},{\"names\":[],\"date\":\"19\\/05\"},{\"names\":[\"Μόνικα\",\"Μόνα\"],\"date\":\"15\\/06\"},{\"names\":[\"Μορφούλα\"],\"date\":\"06\\/08\"},{\"names\":[\"Μόσχω\",\"Μοσχούλα\"],\"date\":\"01\\/09\"},{\"names\":[\"Μυγδόνιος\",\"Μυγδόνης\",\"Μυγδονία\",\"Μιγδονία\"],\"date\":\"28\\/12\"},{\"names\":[\"Μυρσίνη\",\"Μυρσώ\",\"Μέρσα\",\"Αμερισούδα\",\"Αμερσούδα\",\"Αμέρσσα\",\"Αμέρσα\"],\"date\":\"24\\/09\"},{\"names\":[\"Μυρτιδιώτισσα\",\"Μυρτώ\",\"Μύρτα\",\"Μυρτιά\"],\"date\":\"24\\/09\"},{\"names\":[\"Μύρων\",\"Μύρα\",\"Μίρκα\"],\"date\":\"17\\/08\"},{\"names\":[\"Μωϋσής\",\"Μωϋσία\",\"Μωσής\",\"Μωσία\"],\"date\":\"04\\/09\"},{\"names\":[\"Ναζάριος\"],\"date\":\"14\\/10\"},{\"names\":[\"Νέαρχος\",\"Νιάρχος\"],\"date\":\"22\\/04\"},{\"names\":[\"Ναθαναήλ\",\"Ναθάνης\",\"Ναθαναήλος\",\"Ναθαναήλης\",\"Ναθαναηλία\",\"Ναθανηλία\",\"Ναθανίτσα\"],\"date\":\"22\\/04\"},{\"names\":[\"Νεκτάριος\",\"Νεκτάρης\",\"Νεκταρία\",\"Νεκταρίνα\",\"Νεκταρούλα\"],\"date\":\"09\\/11\"},{\"names\":[\"Νάντια\"],\"date\":\"21\\/05\"},{\"names\":[\"Ναούμ\",\"Ναούμης\",\"Ναούμα\",\"Ναόμι\"],\"date\":\"01\\/12\"},{\"names\":[\"Νεόφυτος\",\"Νεοφυτία\",\"Νεοφύτη\"],\"date\":\"21\\/01\"},{\"names\":[\"Νερατζιά\"],\"date\":\"08\\/09\"},{\"names\":[\"Νάρκισος\",\"Νάρκισσος\"],\"date\":\"31\\/10\"},{\"names\":[\"Ναταλία\",\"Ναταλίνα\",\"Ναταλή\",\"Νάταλι\"],\"date\":\"26\\/08\"},{\"names\":[\"Νατάσα\",\"Νατάσσα\",\"Τασία\",\"Σία\",\"Τατία\",\"Τάσα\",\"Τέσα\",\"Τασούλα\",\"Τασσώ\"],\"date\":\"22\\/12\"},{\"names\":[\"Ναυκράτιος\",\"Ναυκράτης\"],\"date\":\"08\\/06\"},{\"names\":[\"Νέστωρ\",\"Νέστορας\",\"Νεστορία\"],\"date\":\"27\\/10\"},{\"names\":[\"Νήσιος\",\"Νήσης\",\"Νήσα\"],\"date\":\"27\\/02\"},{\"names\":[\"Νήφων\"],\"date\":\"14\\/06\"},{\"names\":[\"Νήφων\"],\"date\":\"23\\/12\"},{\"names\":[\"Νίκανδρος\",\"Νικανδρία\",\"Νίκη\"],\"date\":\"05\\/06\"},{\"names\":[\"Νικάνωρ\",\"Νικάνορας\"],\"date\":\"07\\/08\"},{\"names\":[\"Νίκη\"],\"date\":\"16\\/04\"},{\"names\":[\"Νίκη\"],\"date\":\"25\\/04\"},{\"names\":[\"Νικήτας\",\"Νικήτη\",\"Νικήτα\"],\"date\":\"15\\/09\"},{\"names\":[\"Νικηφόρος\",\"Νικηφορία\",\"Νικηφόρα\",\"Νίκη\"],\"date\":\"02\\/06\"},{\"names\":[\"Νικηφόρος\",\"Νικηφορία\",\"Νικηφόρα\",\"Νίκη\"],\"date\":\"09\\/02\"},{\"names\":[\"Νικόδημος\",\"Νικοδήμη\",\"Δήμος\",\"Δήμη\"],\"date\":\"14\\/07\"},{\"names\":[\"Νικόλαος\",\"Νικόλας\",\"Νίκος\",\"Νικολός\",\"Νικολής\",\"Νικολάκης\",\"Νικολούδα\",\"Νικολίτσα\"],\"date\":\"06\\/12\"},{\"names\":[],\"date\":\"14\\/04\"},{\"names\":[\"Νικολέττα\",\"Νικολετα\"],\"date\":\"06\\/12\"},{\"names\":[\"Νικολίνα\"],\"date\":\"06\\/12\"},{\"names\":[\"Νίκων\"],\"date\":\"26\\/11\"},{\"names\":[\"Νίνας\",\"Νίνα\"],\"date\":\"14\\/01\"},{\"names\":[\"Νόννα\",\"Νόνα\"],\"date\":\"05\\/08\"},{\"names\":[\"Ντιάνα\",\"Διάνα\"],\"date\":\"20\\/10\"},{\"names\":[\"Νυμφοδώρα\"],\"date\":\"10\\/09\"},{\"names\":[\"Ξένη\",\"Ξένια\",\"Ξένος\",\"Ξένιος\"],\"date\":\"24\\/01\"},{\"names\":[\"Ξανθίππη\",\"Ξανθή\",\"Ξανθούλα\"],\"date\":\"23\\/09\"},{\"names\":[\"Ξάνθιππος\"],\"date\":\"23\\/09\"},{\"names\":[\"Ξάνθος\",\"Ξάνθιος\",\"Ξανθιάς\",\"Ξανθούλιος\",\"Ξανθούλης\",\"Ξανθή\",\"Ξανθούλα\"],\"date\":\"09\\/03\"},{\"names\":[\"Ξενοφών\",\"Ξενοφώντας\",\"Φώντας\",\"Φόντας\",\"Φόνης\",\"Ξενοφωντία\",\"Ξενοφωντίνα\",\"Ξενοφούλα\",\"Ξενοφώντη\",\"Ξένια\"],\"date\":\"26\\/01\"},{\"names\":[\"Ξενοφών\",\"Ξενοφώντας\",\"Φώντας\",\"Φόντας\",\"Φόνης\",\"Ξενοφωντία\",\"Ξενοφωντίνα\",\"Ξενοφούλα\",\"Ξενοφώντη\",\"Ξένια\"],\"date\":\"10\\/04\"},{\"names\":[\"Ολγα\",\"Ολγίτσα\",\"Γίτσα\"],\"date\":\"11\\/07\"},{\"names\":[\"Ολιβιανός\",\"Ολβιανός\",\"Ολιβία\"],\"date\":\"29\\/05\"},{\"names\":[\"Ολιβιανός\",\"Ολβιανός\",\"Ολιβία\"],\"date\":\"17\\/09\"},{\"names\":[\"Ολυμπία\"],\"date\":\"11\\/05\"},{\"names\":[\"Ολυμπιάς\",\"Ολυμπιάδα\",\"Ολυμπία\",\"Ολύμπω\",\"Ολύμπη\",\"Ολια\",\"Ολυμπούλα\"],\"date\":\"25\\/07\"},{\"names\":[\"Ολύμπιος\"],\"date\":\"03\\/08\"},{\"names\":[\"Ομηρος\"],\"date\":\"10\\/04\"},{\"names\":[\"Ονούφριος\",\"Ονούφρης\",\"Ονουφρία\"],\"date\":\"12\\/06\"},{\"names\":[\"Ορέστης\",\"Ορεστία\",\"Ορεστιάς\",\"Ορεστιάδα\"],\"date\":\"10\\/11\"},{\"names\":[\"Ορσαλία\"],\"date\":\"21\\/10\"},{\"names\":[\"Ορτίσιος\",\"Ορτίσης\",\"Ορτίσια\",\"Ορτανσία\"],\"date\":\"15\\/06\"},{\"names\":[\"Οσιος\",\"Οσία\"],\"date\":\"27\\/08\"},{\"names\":[\"Ουρανία\",\"Ράνια\"],\"date\":\"01\\/09\"},{\"names\":[\"Ουρανία\",\"Ράνια\"],\"date\":\"06\\/01\"},{\"names\":[\"Ούρσουλα\"],\"date\":\"21\\/10\"},{\"names\":[\"Παχώμιος\",\"Παχούμιος\",\"Πάχος\"],\"date\":\"15\\/05\"},{\"names\":[\"Παγκράτιος\",\"Παγκρατία\"],\"date\":\"09\\/02\"},{\"names\":[\"Παγκράτιος\",\"Παγκρατία\"],\"date\":\"09\\/07\"},{\"names\":[\"Πελαγία\",\"Πελάγιος\",\"Πελαγής\",\"Πελαγούλα\",\"Πελαγίνα\",\"Πελαγίτσα\",\"Πελαγιώ\"],\"date\":\"08\\/10\"},{\"names\":[\"Παλλαδία\",\"Παλαδία\",\"Παλλάδα\",\"Παλάδα\"],\"date\":\"24\\/05\"},{\"names\":[\"Παλλάδιος\",\"Παλάδιος\",\"Παλλάδης\",\"Παλάδης\"],\"date\":\"28\\/01\"},{\"names\":[\"Πελοπίδας\"],\"date\":\"10\\/04\"},{\"names\":[\"Παναγής\",\"Πανάγος\"],\"date\":\"07\\/06\"},{\"names\":[\"Παναγιώτης\",\"Πάνος\",\"Πανούσος\",\"Παναγής\",\"Πανάγος\",\"Γιώτης\",\"Πανίκος\",\"Τάκης\",\"Παναγιώτα\",\"Γιώτα\",\"Παναγιούλα\",\"Παναγούλα\",\"Πάνη\",\"Τότα\",\"Τούλα\"],\"date\":\"15\\/08\"},{\"names\":[\"Παναγιώτης\",\"Πάνος\",\"Πανούσος\",\"Παναγής\",\"Πανάγος\",\"Γιώτης\",\"Πανίκος\",\"Τάκης\",\"Παναγιώτα\",\"Γιώτα\",\"Παναγιούλα\",\"Παναγούλα\",\"Πάνη\",\"Τότα\",\"Τούλα\"],\"date\":\"26\\/12\"},{\"names\":[\"Πανδώρα\"],\"date\":\"01\\/09\"},{\"names\":[\"Παντελεήμων\",\"Παντελεήμονας\",\"Παντελής\",\"Παντελάκης\",\"Παντέλος\",\"Παντελίτσα\",\"Παντελίνα\",\"Παντελεούσα\"],\"date\":\"27\\/07\"},{\"names\":[\"Πάμφιλος\"],\"date\":\"16\\/02\"},{\"names\":[\"Παντολέων\",\"Παντολέοντας\",\"Παντολεοντία\",\"Παντολεοντής\",\"Παντολεοντή\"],\"date\":\"17\\/09\"},{\"names\":[\"Παμφύλη\",\"Παμφίλη\"],\"date\":\"16\\/02\"},{\"names\":[\"Παράσχος\"],\"date\":\"01\\/03\"},{\"names\":[\"Παρασκευή\",\"Εύη\",\"Παρασκευούλα\",\"Βούλα\",\"Παρασκευάς\",\"Πάρης\",\"Πάρις\"],\"date\":\"01\\/03\"},{\"names\":[\"Παρασκευή\",\"Εύη\",\"Εβίτα\",\"Βιβή\",\"Βίβιαν\",\"Βέτη\",\"Βέττη\",\"Παρασκευούλα\",\"Βούλα\",\"Παρασκευάς\",\"Πάρης\",\"Πάρις\"],\"date\":\"26\\/07\"},{\"names\":[\"Παρθένα\",\"Παρθενία\",\"Παρθενούλα\"],\"date\":\"08\\/01\"},{\"names\":[\"Παρθένιος\",\"Παρθένης\",\"Παρθενία\",\"Παρθενόπη\"],\"date\":\"07\\/02\"},{\"names\":[\"Περικλής\"],\"date\":\"10\\/04\"},{\"names\":[\"Περιστέρα\"],\"date\":\"06\\/01\"},{\"names\":[\"Παρμενίων\"],\"date\":\"10\\/04\"},{\"names\":[\"Περσεφόνη\"],\"date\":\"24\\/09\"},{\"names\":[\"Πέρσης\",\"Πέρση\"],\"date\":\"24\\/09\"},{\"names\":[\"Πατάπιος\"],\"date\":\"08\\/12\"},{\"names\":[\"Παύλος\",\"Παυλίνα\",\"Πώλ\",\"Παυλίκος\",\"Πουλίκος\"],\"date\":\"29\\/06\"},{\"names\":[\"Πατρίκιος\",\"Πάτρικ\",\"Πατρίκος\",\"Πατρίκης\",\"Πατρίτσιος\",\"Πατρίτσης\",\"Πατρικία\",\"Πατρίκα\",\"Πατριτσία\",\"Πατρίτσα\"],\"date\":\"19\\/05\"},{\"names\":[\"Πάτροκλος\",\"Πατρόκλειος\",\"Πατροκλέας\",\"Πατροκλής\",\"Πατρόκλεια\",\"Πατροκλά\",\"Πάτρα\",\"Πατρούλα\"],\"date\":\"21\\/01\"},{\"names\":[\"Πέτρος\",\"Πετρής\",\"Πετράς\",\"Πετράκης\",\"Πετρουλάς\",\"Πετρίνος\",\"Πετρία\",\"Πετρίνα\",\"Πέτρα\",\"Πετρούλα\"],\"date\":\"29\\/06\"},{\"names\":[\"Παΐσιος\",\"Παΐσης\",\"Παϊσία\"],\"date\":\"19\\/06\"},{\"names\":[\"Πηγάσιος\",\"Πήγασος\",\"Πηγασία\"],\"date\":\"02\\/11\"},{\"names\":[\"Πηλεύς\",\"Πηλέας\"],\"date\":\"17\\/09\"},{\"names\":[\"Πηνελόπη\",\"Μπηλιώ\",\"Μπιλιώ\"],\"date\":\"01\\/09\"},{\"names\":[\"Πιερής\",\"Πιέρος\",\"Πιέριος\",\"Πιερία\",\"Πιέρα\",\"Πιερίων\"],\"date\":\"27\\/06\"},{\"names\":[\"Πλάτων\",\"Πλάτωνας\",\"Πλατωνία\",\"Πλατώνα\"],\"date\":\"18\\/11\"},{\"names\":[\"Πίνδαρος\"],\"date\":\"10\\/04\"},{\"names\":[\"Πλούταρχος\"],\"date\":\"05\\/06\"},{\"names\":[\"Πίστις\",\"Πίστη\"],\"date\":\"17\\/09\"},{\"names\":[\"Πλωτίνος\",\"Πλωτός\",\"Πλωτή\",\"Πλωτίνα\",\"Πλωτίνη\"],\"date\":\"12\\/02\"},{\"names\":[\"Πολυχρόνιος\",\"Πολυχρόνης\",\"Χρόνης\",\"Πολυχρονία\",\"Πολυχρονούλα\"],\"date\":\"07\\/10\"},{\"names\":[\"Πολυχρόνιος\",\"Πολυχρόνης\",\"Χρόνης\",\"Πολυχρονία\",\"Πολυχρονούλα\"],\"date\":\"23\\/02\"},{\"names\":[\"Πολύβιος\"],\"date\":\"10\\/04\"},{\"names\":[\"Πολύδωρος\",\"Πόλης\",\"Πόλα\",\"Πόλη\",\"Πολύδωρας\",\"Πολυδώρης\",\"Πολυδώρη\",\"Πολυδώρα\"],\"date\":\"03\\/09\"},{\"names\":[\"Πολύκαρπος\",\"Πολυκάρπης\",\"Πολυκαρπία\",\"Πολυκάρπη\",\"Πολυκαρπίτσα\",\"Πολυκαρπούλα\"],\"date\":\"23\\/02\"},{\"names\":[\"Πολυξένη\",\"Ξένη\",\"Ξένια\"],\"date\":\"23\\/09\"},{\"names\":[\"Πολυνίκη\",\"Πολύνα\",\"Πόλυ\"],\"date\":\"01\\/09\"},{\"names\":[\"Πολύμνια\"],\"date\":\"01\\/09\"},{\"names\":[\"Πολυτίμη\",\"Τίμη\"],\"date\":\"01\\/09\"},{\"names\":[\"Πορφύριος\",\"Πορφυρός\",\"Πορφύρης\",\"Πορφυρή\",\"Πορφυρία\",\"Πορφύρα\",\"Πορφυρώ\",\"Πορφυρούλα\"],\"date\":\"26\\/02\"},{\"names\":[\"Πουλχερία\",\"Πουλχερίνα\",\"Πουλχερίτσα\",\"Πουλχέρω\",\"Πουλχέρη\"],\"date\":\"10\\/09\"},{\"names\":[\"Πούλιος\"],\"date\":\"26\\/03\"},{\"names\":[\"Πρέσβεια\"],\"date\":\"15\\/08\"},{\"names\":[\"Πρίσκιλλα\",\"Πρισίλλα\"],\"date\":\"13\\/02\"},{\"names\":[\"Πρόδρομος\",\"Προδρομάκης\",\"Μάκης\",\"Προδρομία\"],\"date\":\"07\\/01\"},{\"names\":[\"Προκόπιος\",\"Προκόπης\",\"Προκοπία\",\"Προκοπή\"],\"date\":\"08\\/07\"},{\"names\":[\"Προμηθεύς\",\"Προμηθέας\"],\"date\":\"10\\/04\"},{\"names\":[\"Πύρρος\",\"Πύρος\",\"Πύρρα\",\"Πύρα\"],\"date\":\"01\\/06\"},{\"names\":[\"Ράλλης\"],\"date\":\"01\\/09\"},{\"names\":[\"Ραλλία\",\"Ραλία\",\"Ραλλού\",\"Ραλού\"],\"date\":\"01\\/09\"},{\"names\":[],\"date\":\"14\\/04\"},{\"names\":[\"Ραφαήλ\",\"Ραφαήλος\",\"Ραφαέλος\",\"Ραφαέλα\",\"Ραφαήλα\"],\"date\":\"08\\/11\"},{\"names\":[\"Ραΐς\",\"Ραΐδα\"],\"date\":\"23\\/09\"},{\"names\":[\"Ρηγίνος\",\"Ρηγίνη\",\"Ρηγίνα\",\"Ρεγίνα\",\"Ρεγγίνα\",\"Ρήγας\",\"Ρήγισσα\",\"Ρηγούλα\",\"Ρηγίλη\",\"Ρήγω\",\"Ρήγος\"],\"date\":\"25\\/02\"},{\"names\":[\"Ροδάνθη\",\"Ροζάνθη\"],\"date\":\"09\\/06\"},{\"names\":[\"Ροδή\",\"Ροδία\"],\"date\":\"20\\/03\"},{\"names\":[\"Ρόζυ\",\"Ρόζα\",\"Ροζαλια\"],\"date\":\"04\\/09\"},{\"names\":[\"Ροδιανός\",\"Ροδινός\",\"Ροδίνης\",\"Ρόδης\",\"Ροδιανή\",\"Ροδιάνα\"],\"date\":\"20\\/03\"},{\"names\":[\"Ροδίων\",\"Ρόδιος\",\"Ροδής\",\"Ρόδος\",\"Ροδιά\",\"Ροδούλα\",\"Ροδίτα\",\"Ρόζα\",\"Ροζαλία\",\"Ροζίτα\",\"Ροζίνα\",\"Ροζάνα\"],\"date\":\"10\\/11\"},{\"names\":[\"Ροδόπη\",\"Ροδώπη\"],\"date\":\"03\\/05\"},{\"names\":[\"Ρωμανός\",\"Ρωμάνα\",\"Ρωμανή\"],\"date\":\"01\\/10\"},{\"names\":[\"Ρωμύλος\",\"Ρωμύλιος\",\"Ρωμύλης\",\"Ρωμύλα\",\"Ρωμυλία\",\"Ρωμύλη\",\"Ρωμυλαία\"],\"date\":\"18\\/09\"},{\"names\":[\"Σάββας\",\"Σάβας\",\"Σαββούλης\",\"Σαβούλη\",\"Σαββούλα\",\"Σαβούλα\"],\"date\":\"05\\/12\"},{\"names\":[\"Σαββάτιος\",\"Σάββατος\",\"Σαββάτης\",\"Σαββατία\",\"Σαββατίνα\",\"Σαββάτα\",\"Σαββάτη\",\"Σαββάτω\"],\"date\":\"19\\/09\"},{\"names\":[\"Σεβαστιανή\",\"Σεβαστίνα\",\"Σεβαστιάνα\",\"Σεβαστή\",\"Σέβη\",\"Σεβούλα\",\"Σεβαστούλα\"],\"date\":\"07\\/06\"},{\"names\":[\"Σεβαστιανή\",\"Σεβαστίνα\",\"Σεβαστιάνα\",\"Σεβαστή\",\"Σέβη\",\"Σεβούλα\",\"Σεβαστούλα\"],\"date\":\"24\\/10\"},{\"names\":[\"Σεβαστιανός\",\"Σεβαστίνος\",\"Σεβαστός\",\"Σέβος\",\"Σέβης\"],\"date\":\"26\\/02\"},{\"names\":[\"Σεβαστιανός\",\"Σεβαστίνος\",\"Σεβαστός\",\"Σέβος\",\"Σέβης\"],\"date\":\"18\\/12\"},{\"names\":[\"Σεβηριανός\",\"Σεβηριανή\"],\"date\":\"09\\/03\"},{\"names\":[\"Σαβίνα\",\"Ζαμπίνα\",\"Ζαμπία\"],\"date\":\"11\\/03\"},{\"names\":[\"Σαπφώ\"],\"date\":\"01\\/09\"},{\"names\":[\"Σέλευκος\",\"Σελεύκα\",\"Σελεύκη\",\"Σελεύκεια\"],\"date\":\"16\\/02\"},{\"names\":[\"Σεληνιάς\",\"Σεληνιάδα\",\"Σεληνία\",\"Σελήνη\",\"Σελήνα\",\"Σελήνος\",\"Σελήνιος\"],\"date\":\"05\\/06\"},{\"names\":[\"Σαλώμη\",\"Σαλώμα\"],\"date\":\"03\\/08\"},{\"names\":[\"Σαμουήλ\",\"Σαμουήλος\",\"Σαμουήλης\",\"Σαμουέλος\",\"Σαμουηλία\",\"Σαμουήλα\",\"Σαμουέλα\"],\"date\":\"20\\/08\"},{\"names\":[\"Σέντ\"],\"date\":\"07\\/01\"},{\"names\":[\"Σάρα\",\"Σάρρα\"],\"date\":\"13\\/07\"},{\"names\":[],\"date\":\"13\\/12\"},{\"names\":[\"Σέργιος\",\"Σεργία\",\"Σεργιανή\",\"Σεργιούλα\"],\"date\":\"07\\/10\"},{\"names\":[\"Σαράντης\",\"Σαράντος\",\"Σαραντούλα\"],\"date\":\"16\\/08\"},{\"names\":[\"Σαράντης\",\"Σαράντος\",\"Σαραντούλα\"],\"date\":\"09\\/03\"},{\"names\":[\"Σεραφείμ\",\"Σεραφειμία\",\"Σεραφείμα\",\"Σεραφίνα\",\"Σεραφειμή\",\"Σεραφειμούλα\"],\"date\":\"06\\/05\"},{\"names\":[\"Σεραφείμ\",\"Σεραφειμία\",\"Σεραφείμα\",\"Σεραφειμή\",\"Σεραφειμούλα\"],\"date\":\"16\\/08\"},{\"names\":[\"Σεραφείμ\",\"Σεραφειμία\",\"Σεραφείμα\",\"Σεραφειμή\",\"Σεραφειμούλα\",\"Σεραφειμίτσα\"],\"date\":\"04\\/12\"},{\"names\":[\"Σεραφείμ\",\"Σεραφειμία\",\"Σεραφείμα\",\"Σεραφειμή\",\"Σεραφειμούλα\",\"Σεραφειμίτσα\"],\"date\":\"02\\/01\"},{\"names\":[\"Σεσίλια\",\"Κεκίλια\",\"Κικίλια\"],\"date\":\"22\\/11\"},{\"names\":[\"Σάτυρος\",\"Σάτος\"],\"date\":\"06\\/07\"},{\"names\":[\"Σπυρίδων\",\"Σπυρίδωνας\",\"Σπύρος\",\"Σπυρέτος\",\"Σπυράκης\",\"Σπυράκος\",\"Σπυρούλα\",\"Σπυρέτα\",\"Σπυρίνα\",\"Σπυριδούλα\",\"Σπυρίδινα\"],\"date\":\"12\\/12\"},{\"names\":[\"Σκιαδενή\"],\"date\":\"08\\/09\"},{\"names\":[\"Σιλβανός\",\"Σιλβάνα\",\"Σιλβανή\",\"Σίλβια\",\"Σίλβα\"],\"date\":\"05\\/11\"},{\"names\":[\"Σίλβεστρος\",\"Σιλβέστρης\",\"Σίλβης\",\"Σιλβέστρα\",\"Σίλβα\"],\"date\":\"02\\/01\"},{\"names\":[\"Σιλουανός\",\"Σιλουανή\",\"Σιλουάνα\",\"Σιλουάνια\"],\"date\":\"30\\/07\"},{\"names\":[\"Σίμωνας\",\"Σίμων\",\"Σίμος\",\"Σιμώνα\",\"Σιμόνα\",\"Σιμωνία\",\"Σιμώνη\",\"Σιμωνίτσα\"],\"date\":\"10\\/05\"},{\"names\":[\"Σμαραγδένια\",\"Σμαραγδία\",\"Σμαραγδή\",\"Σμαράγδα\",\"Σμαράγδω\",\"Σμαρούλα\",\"Σμαρώ\",\"Σμαραγδούλα\",\"Σμάρα\"],\"date\":\"09\\/03\"},{\"names\":[\"Σμάραγδος\",\"Σμαράγδης\",\"Σμαραγδένιος\",\"Σμάρης\"],\"date\":\"09\\/03\"},{\"names\":[\"Σολομονή\"],\"date\":\"01\\/08\"},{\"names\":[\"Σολομών\",\"Σολομώντας\",\"Σόλων\",\"Σόλωνας\",\"Σολομωντία\"],\"date\":\"02\\/12\"},{\"names\":[\"Σόλων\",\"Σόλωνας\",\"Σολόχων\"],\"date\":\"17\\/05\"},{\"names\":[\"Σόνια\"],\"date\":\"17\\/09\"},{\"names\":[\"Σοφία\",\"Σοφιανός\",\"Σοφιανή\",\"Σοφούλα\",\"Σοφούλης\",\"Σόφη\",\"Σοφίτσα\",\"Σοφίνα\",\"Φιφή\",\"Σοφούλη\",\"Φούλη\"],\"date\":\"17\\/09\"},{\"names\":[\"Σουλτάνα\",\"Σουλτάνης\",\"Σούζυ\",\"Σούζη\",\"Σουλτανίτσα\",\"Τάνια\"],\"date\":\"21\\/11\"},{\"names\":[\"Σοφοκλής\"],\"date\":\"10\\/04\"},{\"names\":[\"Συγκλητική\"],\"date\":\"05\\/01\"},{\"names\":[\"Σταμάτιος\",\"Σταμάτης\",\"Στάμος\",\"Σταμούλης\",\"Σταμέλος\",\"Σταμέλης\",\"Σταμελάς\"],\"date\":\"03\\/02\"},{\"names\":[\"Σταμάτιος\",\"Σταμάτης\",\"Στάμος\",\"Σταμούλης\",\"Σταμέλος\",\"Σταμέλης\",\"Σταμελάς\"],\"date\":\"16\\/08\"},{\"names\":[\"Σταμάτιος\",\"Σταμάτης\",\"Στάμος\",\"Σταμούλης\",\"Σταμέλος\",\"Σταμέλης\",\"Σταμελάς\"],\"date\":\"08\\/11\"},{\"names\":[\"Σταματία\",\"Σταματίνα\",\"Σταμάτα\",\"Μάτα\",\"Ματούλα\",\"Σταμέλα\",\"Σταμούλα\",\"Ματίνα\",\"Σταματή\",\"Μάτω\",\"Σταματέλλα\"],\"date\":\"03\\/02\"},{\"names\":[\"Σταματία\",\"Σταματίνα\",\"Σταμάτα\",\"Μάτα\",\"Ματούλα\",\"Σταμέλα\",\"Σταμούλα\",\"Ματίνα\",\"Σταματή\",\"Μάτω\",\"Σταματέλλα\"],\"date\":\"16\\/08\"},{\"names\":[\"Σταματία\",\"Σταματίνα\",\"Σταμάτα\",\"Μάτα\",\"Ματούλα\",\"Σταμέλα\",\"Σταμούλα\",\"Ματίνα\",\"Σταματή\",\"Μάτω\",\"Σταματέλλα\"],\"date\":\"08\\/11\"},{\"names\":[\"Στέργιος\",\"Στέργης\",\"Στέργος\",\"Στεργία\",\"Στεργιανή\",\"Στεργιούλα\",\"Στεργιούδα\"],\"date\":\"26\\/11\"},{\"names\":[\"Στέφανος\",\"Στέφος\",\"Στέφας\",\"Στεφανής\",\"Στεφανία\",\"Στεφάνα\",\"Στεφανιώ\",\"Στεφανίτσα\",\"Στεφανή\",\"Στέφα\",\"Στέφη\"],\"date\":\"27\\/12\"},{\"names\":[\"Σταύρος\",\"Σταύρακας\",\"Σταυράκιος\",\"Σταυρής\",\"Σταυριανός\",\"Σταυράκης\",\"Σταυρούλα\",\"Σταυριανή\",\"Σταυρίνα\",\"Σταυρία\"],\"date\":\"14\\/09\"},{\"names\":[\"Συλβέστρος\",\"Σιλβέστρος\"],\"date\":\"02\\/01\"},{\"names\":[\"Σύλβια\"],\"date\":\"15\\/12\"},{\"names\":[\"Συλάς\",\"Σύλος\",\"Σύλα\",\"Σύλια\",\"Σύλη\"],\"date\":\"26\\/03\"},{\"names\":[\"Συμέλα\",\"Σιμέλα\",\"Σουμελά\"],\"date\":\"15\\/08\"},{\"names\":[\"Συνέσιος\",\"Συνέσης\",\"Συνεσία\"],\"date\":\"26\\/05\"},{\"names\":[\"Συμεών\",\"Συμεώνης\",\"Συμεωνή\",\"Συμεωνία\",\"Συμεώνα\",\"Σύμος\",\"Σύμη\"],\"date\":\"03\\/02\"},{\"names\":[\"Συμεών\",\"Συμεώνης\",\"Συμεωνή\",\"Συμεωνία\",\"Συμεώνα\",\"Συμεωνίτσα\",\"Σύμος\",\"Σύμη\"],\"date\":\"01\\/09\"},{\"names\":[\"Στρατηγός\",\"Στρατηγούλα\"],\"date\":\"08\\/11\"},{\"names\":[\"Στρατονίκη\",\"Στρατή\",\"Νίκη\"],\"date\":\"31\\/10\"},{\"names\":[\"Στρατόνικος\",\"Στρατονίκης\",\"Στρατονίκιος\",\"Στράτος\",\"Στράτης\"],\"date\":\"30\\/09\"},{\"names\":[\"Στράτων\",\"Στράτος\",\"Στράτης\",\"Στράτα\",\"Στρατία\",\"Στρατίνα\",\"Στρατούλα\"],\"date\":\"17\\/08\"},{\"names\":[\"Στυλιανός\",\"Στυλιανή\",\"Στέλιος\",\"Στελής\",\"Τέλης\",\"Τέλιος\",\"Στελίτσα\",\"Στέλα\",\"Στέλλα\",\"Στέλια\",\"Τέλα\",\"Τελία\",\"Τελίτσα\"],\"date\":\"26\\/11\"},{\"names\":[\"Σώζων\",\"Σώζος\",\"Σωζούσα\",\"Σώζης\",\"Σώζα\",\"Σώζη\"],\"date\":\"07\\/09\"},{\"names\":[\"Σωκράτης\",\"Σωκρατίνα\",\"Σωκρατία\"],\"date\":\"10\\/04\"},{\"names\":[\"Σωκράτης\",\"Σωκρατίνα\",\"Σωκρατία\"],\"date\":\"21\\/10\"},{\"names\":[\"Σωτήριος\",\"Σωτήρης\",\"Σώτος\",\"Σωτηράκης\",\"Σωτηρία\",\"Σωτήρω\"],\"date\":\"06\\/08\"},{\"names\":[\"Σωσίπατρος\",\"Σωπάτρα\",\"Σώπατρος\",\"Σωπατρία\",\"Πάτρα\",\"Πατρούλα\",\"Πατρίτσα\"],\"date\":\"29\\/04\"},{\"names\":[\"Σωσίπατρος\",\"Σωπάτρα\",\"Σώπατρος\",\"Σωπατρία\",\"Πάτρα\",\"Πατρούλα\",\"Πατρίτσα\"],\"date\":\"10\\/11\"},{\"names\":[\"Σωφρόνιος\",\"Σωφρόνης\",\"Σωφρονία\",\"Σωφρόνη\"],\"date\":\"11\\/03\"},{\"names\":[\"Σωσσάνα\",\"Σωσάνα\",\"Σωσάννα\"],\"date\":\"15\\/12\"},{\"names\":[],\"date\":\"29\\/12\"},{\"names\":[\"Τάμαρα\"],\"date\":\"01\\/05\"},{\"names\":[\"Ταξιάρχης\"],\"date\":\"08\\/11\"},{\"names\":[\"Ταράσιος\",\"Ταράσης\"],\"date\":\"25\\/02\"},{\"names\":[\"Τερψιχόρη\"],\"date\":\"01\\/09\"},{\"names\":[\"Τέρτιος\",\"Τέρτος\",\"Τέρτης\",\"Τέρτια\",\"Τέρτα\",\"Τέρτη\",\"Τερτίνος\",\"Τερτίνα\"],\"date\":\"30\\/10\"},{\"names\":[\"Ταρσή\",\"Ταρσώ\",\"Ταρασία\",\"Ταρσίτσα\"],\"date\":\"25\\/02\"},{\"names\":[\"Τατιανή\",\"Τατιάνα\",\"Τάτια\",\"Τίτη\",\"Τάνια\"],\"date\":\"12\\/01\"},{\"names\":[\"Τηλέμαχος\"],\"date\":\"01\\/01\"},{\"names\":[\"Τίχων\",\"Τύχων\"],\"date\":\"16\\/06\"},{\"names\":[\"Τιμόθεος\",\"Τίμος\",\"Τιμάς\",\"Τίμης\",\"Τιμοθέα\",\"Τιμοθέη\",\"Τίμα\",\"Τίμη\",\"Θέος\",\"Θέα\",\"Θέη\"],\"date\":\"22\\/01\"},{\"names\":[\"Τιμόθεος\",\"Τίμος\",\"Τιμάς\",\"Τίμης\",\"Τιμοθέα\",\"Τιμοθέη\",\"Τίμα\",\"Τίμη\",\"Θέος\",\"Θέα\",\"Θέη\"],\"date\":\"10\\/04\"},{\"names\":[\"Τίμων\",\"Τιμόνα\",\"Τιμόνη\",\"Τίμος\",\"Τίμα\"],\"date\":\"28\\/07\"},{\"names\":[\"Τίτος\",\"Τίτης\",\"Τίτα\",\"Τίτη\"],\"date\":\"02\\/04\"},{\"names\":[\"Τίτος\",\"Τίτης\",\"Τίτα\",\"Τίτη\"],\"date\":\"25\\/08\"},{\"names\":[\"Τριανταφυλλιά\",\"Φύλλη\",\"Φύλλια\",\"Φυλλιώ\",\"Φυλλίτσα\",\"Τριανταφυλλένια\",\"Τριανταφυλλίνη\",\"Ρόζα\"],\"date\":\"08\\/08\"},{\"names\":[\"Τριαντάφυλλος\",\"Τριανταφύλλης\",\"Φύλλης\",\"Φύλλιος\",\"Τριανταφυλλένιος\",\"Τριανταφυλλίνος\"],\"date\":\"08\\/08\"},{\"names\":[\"Τριφύλλιος\",\"Τριφύλιος\"],\"date\":\"13\\/06\"},{\"names\":[],\"date\":\"30\\/01\"},{\"names\":[\"Τρύφωνας\",\"Τρύφων\",\"Τρυφωνία\"],\"date\":\"01\\/02\"},{\"names\":[\"Τρωάδιος\",\"Τρωάδης\",\"Τρωάδος\",\"Τρωάς\",\"Τρωάδα\",\"Τρωαδία\",\"Τρωάδη\",\"Τρωαδίτσα\"],\"date\":\"02\\/03\"},{\"names\":[\"Τσαμπίκα\",\"Μίκα\",\"Τσαμπίκος\"],\"date\":\"08\\/09\"},{\"names\":[\"Υάκινθος\",\"Υακίνθη\",\"Υάνθη\",\"Ιάνθη\"],\"date\":\"03\\/07\"},{\"names\":[\"Υπαπαντή\"],\"date\":\"02\\/02\"},{\"names\":[\"Υπάτιος\",\"Υπατος\",\"Υπάτης\"],\"date\":\"31\\/03\"},{\"names\":[\"Υπατία\",\"Υπατή\",\"Υπατούλα\",\"Πατούλα\"],\"date\":\"03\\/06\"},{\"names\":[\"Υπομονή\"],\"date\":\"29\\/05\"},{\"names\":[\"Φαβιανός\"],\"date\":\"20\\/01\"},{\"names\":[\"Φαεινή\",\"Φαεινός\"],\"date\":\"18\\/05\"},{\"names\":[\"Φεβρωνία\",\"Φευρωνία\",\"Φεύρω\",\"Φέβρω\",\"Φέβρα\",\"Φεύρα\",\"Φεβρούλα\",\"Φευρούλα\",\"Φευρωνίτσα\",\"Φεβρωνίτσα\"],\"date\":\"25\\/06\"},{\"names\":[\"Φαίδρα\",\"Φαιδρούλα\",\"Φαιδρίνα\"],\"date\":\"29\\/11\"},{\"names\":[\"Φαίδρος\",\"Φαιδρής\",\"Φαιδρινός\"],\"date\":\"29\\/11\"},{\"names\":[\"Φαίστος\",\"Φαιστή\",\"Φαιστίνα\"],\"date\":\"21\\/04\"},{\"names\":[\"Φανή\",\"Φένια\",\"Φάνια\",\"Φανούλα\"],\"date\":\"06\\/01\"},{\"names\":[\"Φανή\",\"Φένια\",\"Φάνια\",\"Φανούλα\"],\"date\":\"12\\/03\"},{\"names\":[\"Φανούριος\",\"Φανούρης\",\"Φάνης\",\"Φανή\",\"Φανουρία\",\"Νούρης\"],\"date\":\"27\\/08\"},{\"names\":[\"Φιλάρετος\",\"Φιλαρέτιος\",\"Φιλαρέτης\",\"Φιλαρέτη\"],\"date\":\"01\\/12\"},{\"names\":[\"Φιλέταιρος\",\"Φιλέταιριος\",\"Φιλεταίρης\",\"Φιλεταιρία\",\"Φιλεταίρα\",\"Φιλεταίρη\"],\"date\":\"30\\/12\"},{\"names\":[\"Φίληξ\",\"Φήλιξ\",\"Φίληκας\",\"Φίληξα\",\"Φιλήκη\"],\"date\":\"17\\/06\"},{\"names\":[\"Φίληξ\",\"Φήλιξ\",\"Φίληκας\",\"Φίληξα\",\"Φιλήκη\"],\"date\":\"19\\/10\"},{\"names\":[\"Φιλήμων\",\"Φιλήμονας\",\"Φιλημονή\",\"Φιλημόνα\",\"Φλημόνα\"],\"date\":\"22\\/11\"},{\"names\":[\"Φίλητος\",\"Φιλήτα\",\"Φιλήτη\"],\"date\":\"27\\/03\"},{\"names\":[\"Φιλίππα\",\"Φιλιππία\",\"Φιλιώ\"],\"date\":\"14\\/11\"},{\"names\":[\"Φίλιππος\",\"Φιλιππής\",\"Φίλιππας\",\"Φιλιππάκης\"],\"date\":\"14\\/11\"},{\"names\":[\"Φιλικητάτη\",\"Φιλικήτη\",\"Φιλικήτα\"],\"date\":\"01\\/02\"},{\"names\":[\"Φιλοποίμην\",\"Φίλης\"],\"date\":\"10\\/04\"},{\"names\":[\"Φιλοθέη\",\"Φιλοθέα\",\"Φιλοθεούλα\",\"Φιλόθεος\"],\"date\":\"19\\/02\"},{\"names\":[\"Φιλοκτήμων\",\"Φιλοκτήμονας\"],\"date\":\"09\\/03\"},{\"names\":[\"Φιλουμένη\",\"Φιλομένη\"],\"date\":\"29\\/11\"},{\"names\":[\"Φιλούμενος\",\"Φιλόμενος\",\"Φιλουμένη\",\"Φιλομένη\",\"Φίλος\",\"Φίλη\",\"Φιλομίνα\",\"Φιλομίλα\",\"Φιλομίλη\"],\"date\":\"29\\/11\"},{\"names\":[\"Φιλόσοφος\",\"Φιλοσοφία\",\"Φιλοσοφή\",\"Σοφός\",\"Σοφία\",\"Σόφη\"],\"date\":\"01\\/05\"},{\"names\":[\"Φίλωνας\",\"Φίλων\"],\"date\":\"24\\/01\"},{\"names\":[\"Φλωρεντία\",\"Φλωρέντα\",\"Φλωρένα\",\"Φλώρινα\",\"Φλωρένσα\",\"Φλωρέντζα\",\"Ντία\"],\"date\":\"13\\/10\"},{\"names\":[\"Φλωρέντιος\",\"Φλωρέντης\",\"Φλωρέντος\",\"Φλορέντσος\",\"Φλορέντζος\"],\"date\":\"13\\/10\"},{\"names\":[\"Φλώρος\",\"Φλώρης\",\"Φλώρα\",\"Φλωρή\"],\"date\":\"18\\/08\"},{\"names\":[\"Φλώρος\",\"Φλώρης\",\"Φλώρα\",\"Φλωρή\",\"Φλωρίτσα\"],\"date\":\"18\\/12\"},{\"names\":[\"Φοίβος\",\"Φοίβη\"],\"date\":\"03\\/09\"},{\"names\":[\"Φρειδερίκη\"],\"date\":\"31\\/07\"},{\"names\":[\"Φρειδερίκος\"],\"date\":\"31\\/07\"},{\"names\":[\"Φύλακας\"],\"date\":\"30\\/08\"},{\"names\":[\"Φωκάς\",\"Φώκιος\",\"Φώκης\",\"Φωκία\",\"Φωκίνα\"],\"date\":\"22\\/09\"},{\"names\":[\"Φωκίων\",\"Φώκος\"],\"date\":\"10\\/04\"},{\"names\":[\"Φωτεινή\",\"Φώτω\",\"Φώφη\",\"Φωτούλα\",\"Φαίη\",\"Φωφώ\"],\"date\":\"06\\/01\"},{\"names\":[\"Φωτεινή\",\"Φώτω\",\"Φώφη\",\"Φωτούλα\",\"Φαίη\",\"Φωφώ\"],\"date\":\"24\\/05\"},{\"names\":[\"Φωτεινή\",\"Φώτω\",\"Φώφη\",\"Φωτούλα\",\"Φαίη\",\"Φωφώ\"],\"date\":\"26\\/02\"},{\"names\":[\"Φώτιος\",\"Φώτης\",\"Φωτεινός\",\"Φώτις\"],\"date\":\"06\\/01\"},{\"names\":[\"Φώτιος\",\"Φώτης\",\"Φωτεινός\",\"Φώτις\"],\"date\":\"06\\/02\"},{\"names\":[\"Φώτιος\",\"Φώτης\",\"Φωτεινός\",\"Φώτις\"],\"date\":\"12\\/08\"},{\"names\":[\"Φωτίκα\",\"Φωτίκω\",\"Φώτα\",\"Φωτή\"],\"date\":\"06\\/01\"},{\"names\":[\"Χάιδω\",\"Χαιδευτός\"],\"date\":\"01\\/09\"},{\"names\":[\"Χαραλαμπία\",\"Χαρά\",\"Λαμπία\",\"Λαμπή\",\"Λάμπω\",\"Χαραλαμπή\",\"Μπαμπίνα\",\"Μπηλιώ\",\"Μπιλιώ\",\"Μπία\",\"Χάμπη\"],\"date\":\"10\\/02\"},{\"names\":[\"Χαράλαμπος\",\"Λάμπος\",\"Χαραλάμπης\",\"Χάρης\",\"Λάμπης\",\"Λαμπίας\",\"Μπάμπης\",\"Μπάμπος\",\"Χάμπος\"],\"date\":\"10\\/02\"},{\"names\":[\"Χαρίλαος\",\"Χάρης\"],\"date\":\"10\\/02\"},{\"names\":[\"Χαρίκλεια\",\"Χαρούλα\"],\"date\":\"01\\/09\"},{\"names\":[\"Χαρίκλεια\",\"Χαρούλα\"],\"date\":\"10\\/02\"},{\"names\":[\"Χάρις\"],\"date\":\"28\\/01\"},{\"names\":[\"Χαριτίνη\",\"Χαριτίνα\",\"Χαρίτη\",\"Τίνα\",\"Χαρά\"],\"date\":\"05\\/10\"},{\"names\":[\"Χαρίσιος\",\"Χάρισος\",\"Χαρίσης\",\"Χαρίσα\"],\"date\":\"01\\/03\"},{\"names\":[\"Χαρίτων\",\"Χαρίτωνας\",\"Χαρίτος\"],\"date\":\"28\\/09\"},{\"names\":[\"Χίλντα\"],\"date\":\"17\\/11\"},{\"names\":[\"Χιονία\",\"Χιονούλα\",\"Χιονίτσα\",\"Χιονάτη\"],\"date\":\"16\\/04\"},{\"names\":[\"Χρήστος\",\"Χρίστος\",\"Κρίστης\"],\"date\":\"25\\/12\"},{\"names\":[\"Χριστιανός\",\"Χριστιανή\"],\"date\":\"24\\/05\"},{\"names\":[\"Χριστίνα\",\"Χριστιάνα\",\"Κριστιάνα\",\"Χρίστα\",\"Κρίστα\",\"Χρίστη\",\"Κρίστη\"],\"date\":\"24\\/07\"},{\"names\":[\"Χριστίνα\",\"Χριστιάνα\",\"Κριστιάνα\",\"Χρίστα\",\"Κρίστα\",\"Χρίστη\",\"Κρίστη\",\"Χριστόλη\"],\"date\":\"25\\/12\"},{\"names\":[\"Χριστόδουλος\"],\"date\":\"16\\/03\"},{\"names\":[\"Χριστόδουλος\"],\"date\":\"21\\/10\"},{\"names\":[\"Χριστόφορος\",\"Χριστοφόρης\",\"Χριστοφόρα\",\"Φόρης\",\"Φόρα\",\"Χριστόφης\",\"Χριστοφία\",\"Χριστοφίνα\",\"Χριστοφίτσα\"],\"date\":\"09\\/05\"},{\"names\":[\"Χρυσή\",\"Χρύσα\",\"Χρυσαλία\"],\"date\":\"25\\/12\"},{\"names\":[\"Χρυσάνθη\",\"Χρυσανθίς\"],\"date\":\"19\\/03\"},{\"names\":[\"Χρυσάνθη\"],\"date\":\"25\\/10\"},{\"names\":[\"Χρύσανθος\"],\"date\":\"19\\/03\"},{\"names\":[\"Χρυσαυγή\"],\"date\":\"25\\/12\"},{\"names\":[\"Χρυσάφης\",\"Χρυσάφιος\",\"Χρυσαφένια\"],\"date\":\"25\\/10\"},{\"names\":[\"Χρυσή\"],\"date\":\"30\\/01\"},{\"names\":[\"Χρυσή\"],\"date\":\"13\\/10\"},{\"names\":[\"Χρυσοβαλάντου\",\"Χρυσοβαλαντία\",\"Βαλάντα\",\"Βαλάντης\",\"Χρυσοβαλάντης\",\"Χρυσοβαλάντος\",\"Βαλάντος\"],\"date\":\"28\\/07\"},{\"names\":[\"Χρυσούλα\",\"Σήλια\"],\"date\":\"25\\/12\"},{\"names\":[\"Χρυσόστομος\",\"Χρυσοστόμης\",\"Χρυσοστόμη\",\"Χρυσοστομία\",\"Χρυσοστομίτσα\"],\"date\":\"13\\/11\"},{\"names\":[\"Χρυστάλλα\",\"Χρυσταλλία\"],\"date\":\"25\\/12\"},{\"names\":[],\"date\":\"14\\/02\"},{\"names\":[],\"date\":\"30\\/05\"},{\"names\":[\"Ωκεανία\",\"Ωκεανή\",\"Ωκεανίς\"],\"date\":\"04\\/09\"},{\"names\":[\"Ωκεανός\",\"Ωκεάνιος\",\"Ωκεάνης\"],\"date\":\"04\\/09\"},{\"names\":[\"Ωραιοζήλη\",\"Ωραιοζηλία\",\"Ζήλια\",\"Ζήλη\",\"Ζέλια\"],\"date\":\"26\\/07\"},{\"names\":[\"Ωρίων\",\"Ωρίωνας\",\"Ωριώνης\",\"Ωριώνη\"],\"date\":\"10\\/11\"}],\"special\":[{\"toEaster\":-70,\"main\":\"Τελώνου και Φαρισαίου - Αρχή Τριωδίου\",\"variations\":[]},{\"toEaster\":-63,\"main\":\"Του Ασώτου\",\"variations\":[]},{\"toEaster\":-59,\"main\":\"Τσικνοπέμπτη\",\"variations\":[]},{\"toEaster\":-57,\"main\":\"Ψυχοσάββατο Α'\",\"variations\":[]},{\"toEaster\":-56,\"main\":\"Της Απόκρεω\",\"variations\":[]},{\"toEaster\":-49,\"main\":\"Τυροφάγου\",\"variations\":[]},{\"toEaster\":-48,\"main\":\"Καθαρά Δευτέρα\",\"variations\":[]},{\"toEaster\":-43,\"main\":\"Αγίου Θεοδώρου\",\"variations\":[\"Θεόδωρος\",\"Θεοδώρα\",\"Δώρα\",\"Ντόρα\",\"Θόδωρος\",\"Θοδώρα\",\"Θοδωρής\",\"Θοδωράκης\",\"Θώδης\",\"Θώδος\",\"Δώρη\"]},{\"toEaster\":-42,\"main\":\"Κυριακή της Ορθοδοξίας\",\"variations\":[\"Ορθοδοξία\",\"Λωξάνδρα\",\"Λωξάντρα\",\"Ρωξάνη\",\"Αξί\"]},{\"toEaster\":-35,\"main\":\"Γρηγορίου του Παλαμά\",\"variations\":[\"Γρηγόριος\",\"Γρηγόρης\",\"Γρηγορία\",\"Γόλη\"]},{\"toEaster\":-8,\"main\":\"Σάββατο του Λαζάρου\",\"variations\":[\"Λάζαρος\",\"Λάζο\"]},{\"toEaster\":-7,\"main\":\"Κυριακή των Βαίων\",\"variations\":[\"Βάϊος\",\"Βάϊα\",\"Βάγια\",\"Βαία\",\"Δάφν\"]},{\"toEaster\":-6,\"main\":\"Μεγάλη Δευτέρα\",\"variations\":[\"Πάγκαλο\"]},{\"toEaster\":-5,\"main\":\"Μεγάλη Τρίτη\",\"variations\":[]},{\"toEaster\":-4,\"main\":\"Μεγάλη Τετάρτη\",\"variations\":[]},{\"toEaster\":-3,\"main\":\"Μεγάλη Πέμπτη\",\"variations\":[\"Αλήθει\"]},{\"toEaster\":-2,\"main\":\"Μεγάλη Παρασκευή\",\"variations\":[]},{\"toEaster\":-1,\"main\":\"Μεγάλο Σάββατο\",\"variations\":[]},{\"toEaster\":0,\"main\":\"ΤΟ ΑΓΙΟ ΠΑΣΧΑ\",\"variations\":[\"Αναστάσιος\",\"Αναστασία\",\"Τάσος\",\"Αναστάσης\",\"Ανέστης\",\"Λάμπρος\",\"Λαμπρινή\",\"Λαμπρίνα\",\"Πασχάλης\",\"Πασχαλίνα\",\"Λίνα\",\"Στασινό\"]},{\"toEaster\":1,\"main\":\"2α Διακαινησίμου - Δευτέρα\",\"variations\":[]},{\"toEaster\":2,\"main\":\"3η Διακαινησίμου - Τρίτη\",\"variations\":[\"Λαμπροτρίτ\"]},{\"toEaster\":3,\"main\":\"4η Διακαινησίμου - Τετάρτη\",\"variations\":[\"Θεοχάρη\"]},{\"toEaster\":4,\"main\":\"5η Διακαινησίμου - Πέμπτη\",\"variations\":[]},{\"toEaster\":5,\"main\":\"6η Διακαινησίμου - Παρασκευή\",\"variations\":[]},{\"toEaster\":5,\"main\":\"Ζωοδόχου Πηγής\",\"variations\":[\"Πηγή\",\"Κρήνη\",\"Κρηνιώ\",\"Ζήσης\",\"Ζησούλα\",\"Ζήσιμος\",\"Ζωή\",\"Ζώης\",\"Ζωϊτσα\",\"Ζωζώ\",\"Παναγιώτης\",\"Πάνος\",\"Πανούσος\",\"Παναγής\",\"Πανάγος\",\"Γιώτης\",\"Πολυζώης\",\"Παναγιώτα\",\"Γιώτα\",\"Παναγιούλα\",\"Γιούλα\",\"Παναγούλα\"]},{\"toEaster\":6,\"main\":\"7η Διακαινησίμου - Σαββάτο\",\"variations\":[]},{\"toEaster\":7,\"main\":\"Του Θωμά\",\"variations\":[\"Θωμάς\",\"Θωμαή\",\"Τόμα\"]},{\"toEaster\":14,\"main\":\"Των Μυροφόρων\",\"variations\":[\"Μυροφόρ\"]},{\"toEaster\":21,\"main\":\"Του Παραλύτου\",\"variations\":[\"Βηθεσδ\"]},{\"toEaster\":39,\"main\":\"Ανάληψη του Χριστού\",\"variations\":[\"Νεφέλ\"]},{\"toEaster\":48,\"main\":\"Ψυχοσάββατο Β'\",\"variations\":[]},{\"toEaster\":49,\"main\":\"Πεντηκοστή\",\"variations\":[]},{\"toEaster\":50,\"main\":\"Αγ. Πνεύματος\",\"variations\":[\"Τριάδα\",\"Τριάς\",\"Κόρη\",\"Κορίνα\",\"Κορίνο\"]},{\"toEaster\":56,\"main\":\"Αγίων Πάντων\",\"variations\":[\"Αβδηρος\",\"Αγαπήνωρ\",\"Αγαμέμνων\",\"Αγαμέμνονας\",\"Αγαύη\",\"Αγεύς\",\"Αγήνωρ\",\"Αγησίλαος\",\"Αέθλιος\",\"Αελλώ\",\"Αγις\",\"Αδμητος\",\"Αγνοδίκη\",\"Αγοράκριτος\",\"Αγοραστή\",\"Αγορίτσα\",\"Αγορία\",\"Αγνω\",\"Αγνων\",\"Αδράστεια\",\"Αερόπη\",\"Αέροπος\",\"Αδωνις\",\"Απολλόδωρος\",\"Ακάδημος\",\"Αλβέρτος\",\"Αλμπερτ\",\"Αιγεύς\",\"Αίγλη\",\"Αίγινα\",\"Αιακός\",\"Αίγισθος\",\"Αλεμίνα\",\"Αλεμινιώ\",\"Αιδονή\",\"Αίας\",\"Αίγυπτος\",\"Αθηναίς\",\"Αθηνίων\",\"Αλθαία\",\"Αλκείδης\",\"Αλκαίος\",\"Αλκαμένης\",\"Αλκέτας\",\"Αιθήρ\",\"Αλκηστη\",\"Αιλιανός\",\"Αλκίνοος\",\"Αλκινόη\",\"Αλκμένης\",\"Αλκμήνη\",\"Αλκμηνιώ\",\"Αίθρα\",\"Αλκυόνη\",\"Αινείας\",\"Αινίας\",\"Αίολος\",\"Αίμων\",\"Αισχύλος\",\"Ακταίη\",\"Ακταίος\",\"Αίσωπος\",\"Ακτωρ\",\"Αιώρα\",\"Ανακρέων\",\"Αναξαγόρας\",\"Αναξίμανδρος\",\"Ανδροκλής\",\"Ανδρονίδης\",\"Αμαρυλλίς\",\"Ανθέμιος\",\"Αμυγδαλιά\",\"Αντεια\",\"Ανταίος\",\"Αντίπατρος\",\"Αμφιθόη\",\"Αμφικτύων\",\"Αντιμάχη\",\"Αντίμαχος\",\"Αντιόπη\",\"Αντίνοος\",\"Αμφιτρίτη\",\"Αμφιτρύων\",\"Αντιφών\",\"Αμύντας\",\"Αρχίλοχος\",\"Αργεντίνη\",\"Αργος\",\"Αρπίνα\",\"Αριέλ\",\"Αριέλλα\",\"Αρκάς\",\"Αρκτούρος\",\"Αρίστιππος\",\"Αριστογείτων\",\"Αριστόδικος\",\"Αριστόμαχος\",\"Αριστομένης\",\"Αριστόνικος\",\"Αριστονίκη\",\"Αριστοφάνης\",\"Αριστούλα\",\"Αρίων\",\"Αρμονία\",\"Αριέτα\",\"Αρριέτα\",\"Αρριέττα\",\"Αριέττα\",\"Αφεντία\",\"Αφέντρα\",\"Αφεντουλιώ\",\"Αφέντρω\",\"Αφεντρού\",\"Ασημώνη\",\"Ατθίς\",\"Αυξώ\",\"Ατρεύς\",\"Αυρήλιος\",\"Αυρηλία\",\"Ατταλος\",\"Αστυάναξ\",\"Ασωπός\",\"Βεατρίκη\",\"Βακχυλίδης\",\"Βελλερεφόντης\",\"Βάκις\",\"Βελισσάριος\",\"Βελισσαρία\",\"Βενετία\",\"Βενέτης\",\"Βενέτιος\",\"Βενιζέλος\",\"Βένος\",\"Βενιζέλα\",\"Βένη\",\"Βαρύτιμος\",\"Βαρυτίμη\",\"Βαύβω\",\"Βάφης\",\"Βαφυκλής\",\"Βίας\",\"Βιολέτα\",\"Βίων\",\"Βοιώ\",\"Βοιωτός\",\"Βορέας\",\"Βότρυς\",\"Βρασίδας\",\"Βρισηίς\",\"Βροντής\",\"Βροντίνος\",\"Βροτέας\",\"Βρυάς\",\"Βρύμη\",\"Βρύσων\",\"Βύζας\",\"Βύρων\",\"Βύρωνας\",\"Βώρος\",\"Γαία\",\"Γείτων\",\"Γέλως\",\"Γέμινος\",\"Γανυμήδης\",\"Γαυανής\",\"Γή\",\"Γηρυόνης\",\"Γιαλαμάς\",\"Γιασεμής\",\"Γλαύκη\",\"Γλαυκίδης\",\"Γλαυκιάς\",\"Γλαύκος\",\"Γκόλφω\",\"Γνήσιππος\",\"Γοργίας\",\"Γόργος\",\"Γόργω\",\"Γραικός\",\"Γραμμένος\",\"Γραμματική\",\"Γρύλος\",\"Γρύνειος\",\"Γύγης\",\"Γυής\",\"Γυπαιεύς\",\"Γύλιππος\",\"Δαείρα\",\"Δαίδαλος\",\"Δεινοκράτης\",\"Δεινόστρατος\",\"Δείνω\",\"Δείνων\",\"Δελφίων\",\"Δαναός\",\"Δάμας\",\"Δαμασιάς\",\"Δαμάσκιος\",\"Δαμαστής\",\"Δέξιππος\",\"Δάμις\",\"Δαμόκλης\",\"Δαμοφίλη\",\"Δαμόφων\",\"Δάρδανος\",\"Δευκαλίων\",\"Δήλιος\",\"Δημάρατος\",\"Δημοχάρης\",\"Δημόδοκος\",\"Δημοκίδης\",\"Δημοκράτης\",\"Δημόκριτος\",\"Δημοφίλη\",\"Δημόφων\",\"Διαγόρας\",\"Διαλεχτή\",\"Διαλεκτή\",\"Διαμαντής\",\"Διηδάμεια\",\"Διηάνειρα\",\"Δικαία\",\"Δικαίαρχος\",\"Δικτύς\",\"Διοχάντη\",\"Διόδωρος\",\"Διόκλης\",\"Διοφάνη\",\"Διοφάντη\",\"Διόφαντος\",\"Διοτίμα\",\"Δίνων\",\"Διφίλη\",\"Δίφιλος\",\"Δίων\",\"Διωξίππη\",\"Δούρις\",\"Δρύα\",\"Δρύκαλος\",\"Δρυόπη\",\"Δυναμένη\",\"Δύμας\",\"Δώρος\",\"Δωτώ\",\"Εχεκράτης\",\"Εχιδνα\",\"Εβελίνα\",\"Εβελύνα\",\"Εβελιν\",\"Εβελυν\",\"Επαφος\",\"Επιγένης\",\"Επίζηλος\",\"Επίδικος\",\"Επίκουρος\",\"Επίκτητος\",\"Επιμενίδης\",\"Εκάβη\",\"Εκάλη\",\"Ελβίρα\",\"Εκαταίος\",\"Εκάτη\",\"Ελατος\",\"Ελίδα\",\"Ελλάνικος\",\"Ελλη\",\"Ελλην\",\"Ελίκη\",\"Εικονία\",\"Εκτωρ\",\"Ενάρετη\",\"Εμπεδοκλής\",\"Ενιππεύς\",\"Ενυώ\",\"Ερεχθεύς\",\"Εργίνος\",\"Εργίνα\",\"Εργότιμος\",\"Ερατοσθένης\",\"Εριφύλη\",\"Ερμόδωρος\",\"Εριέτα\",\"Ερριέτα\",\"Ερριέττα\",\"Εριέττα\",\"Ερρίκος\",\"Ερύμανθος\",\"Ερυξιάς\",\"Ερυξίμαχος\",\"Ερωφίλη\",\"Ερωτόκριτος\",\"Εύχαρης\",\"Ευαγόρας\",\"Ευγέων\",\"Εύδημος\",\"Ευάλιος\",\"Εύδοξος\",\"Ευγνωσία\",\"Ευδώρα\",\"Εύηνος\",\"Ευπείθης\",\"Ευπάλινος\",\"Ευπόλεμος\",\"Ευπόλις\",\"Εφιππος\",\"Ευκλεάς\",\"Ευκλείδης\",\"Ευκρατίδης\",\"Ευθύδημος\",\"Ευθυκλής\",\"Ευθυμίδης\",\"Ευθύνους\",\"Εύμαχος\",\"Εύμαιος\",\"Εύμηλος\",\"Ετοιμοκλής\",\"Ευμόλπη\",\"Εύμολπος\",\"Εύνομος\",\"Ευριάδης\",\"Ευριδίκη\",\"Ευρυδίκη\",\"Ευριπίδης\",\"Εφρόνιος\",\"Ευρυδάμας\",\"Ευρυβιάδης\",\"Ευρυάλη\",\"Ευρύαλος\",\"Ευρύκλεια\",\"Ευρύλοχος\",\"Ευρυνόμη\",\"Ευρυσθεύς\",\"Ευρώπη\",\"Εστία\",\"Ευφοριών\",\"Ζαγρεύς\",\"Ζάλευκος\",\"Ζαμπέτας\",\"Ζαμπέτα\",\"Ζαφείριος\",\"Ζαφείρης\",\"Ζαφείρω\",\"Ζαφειρία\",\"Ζευξίδαμος\",\"Ζεύξιππος\",\"Ζεύς\",\"Ζέφυρος\",\"Ζήθος\",\"Ζήκος\",\"Ζήλος\",\"Ζήνις\",\"Ζηνόδοτος\",\"Ζηνόδωρος\",\"Ζήτης\",\"Ζωναίος\",\"Ζωογόνος\",\"Ζωτιάτης\",\"Ηχώ\",\"Ηγέλοχος\",\"Ηβη\",\"Ηγήμων\",\"Ηγήσανδρος\",\"Ηγησιάναξ\",\"Ηγησίας\",\"Ηγήσιππος\",\"Ηγήτωρ\",\"Ηγίας\",\"Ηδύλη\",\"Ηετίων\",\"Ηπιόνη\",\"Ηλέκτρα\",\"Ηλεκτρίων\",\"Ηλιος\",\"Ηνίοχος\",\"Ηρα\",\"Ηρέας\",\"Ηρακλείδης\",\"Ηράκλειτος\",\"Ηριγόνη\",\"Ηριλλος\",\"Ηρίννα\",\"Ηρόδοτος\",\"Ηρόδωρος\",\"Ηροφίλη\",\"Ηρόφιλος\",\"Ηφαιστος\",\"Ησίοδος\",\"Ησιόνη\",\"Ηώ\",\"Θάλητας\",\"Θέλμα\",\"Θέλημα\",\"Θελξιώπη\",\"Θεοδήγιος\",\"Θεοδώρα\",\"Δώρα\",\"Ντόρα\",\"Θοδώρα\",\"Δωρούλα\",\"Θεόκριτος\",\"Θέμις\",\"Θεοξένιος\",\"Θαμυρίς\",\"Θεοφρονία\",\"Θάρυπος\",\"Θέρσιππος\",\"Θερσίτης\",\"Θεύδιος\",\"Θέσπις\",\"Θέσιος\",\"Θέτις\",\"Θεσσαλονίκη\",\"Θέων\",\"Θηβαίς\",\"Θηριαμένης\",\"Θόη\",\"Θουκυδίδης\",\"Θουκιδίδης\",\"Θρασύβουλος\",\"Θρασύλλος\",\"Θρασύμαχος\",\"Θυέστης\",\"Θυία\",\"Θυμοχάρης\",\"Θυώνη\",\"Ιδαία\",\"Ιδαίος\",\"Ιάπετος\",\"Ιάμβλιχος\",\"Ιδομενεύς\",\"Ιαμος\",\"Ιεροκλής\",\"Ιβυκος\",\"Ιασίων\",\"Ιασώ\",\"Ιππαρχος\",\"Ιππη\",\"Ιππίας\",\"Ιπποδάμεια\",\"Ιπποκράτης\",\"Ιπποσθένης\",\"Ιππων\",\"Ικέλιδας\",\"Ιθακος\",\"Ικάριος\",\"Ικέτας\",\"Ιλιάς\",\"Ιλιάδα\",\"Ιλιόνη\",\"Ιλλος\",\"Ιθυκλής\",\"Ικτίνος\",\"Ιναχος\",\"Ιοβάτης\",\"Ιμβριος\",\"Ιοκάστη\",\"Ιόλη\",\"Ιόλλας\",\"Ιξιόνη\",\"Ιξίων\",\"Ιόνη\",\"Ινώ\",\"Ισαμπέλλα\",\"Ιζαμπέλλα\",\"Ισαβέλλα\",\"Ισαίος\",\"Ισανδρος\",\"Ιτη\",\"Ιφικράτεια\",\"Ιφικράτης\",\"Ισθμιονίκης\",\"Ιφιτος\",\"Ιστρος\",\"Ιτυς\",\"Ιώ\",\"Ιώλκιος\",\"Καδιανή\",\"Κάντιω\",\"Κάδμος\",\"Καλαμίς\",\"Κέλεος\",\"Κάλας\",\"Καλλιδίκη\",\"Καλλιάνθη\",\"Καλλίας\",\"Καλλιπάτειρα\",\"Καλλίππος\",\"Καλλικλής\",\"Καλλικράτης\",\"Καλλίμαχος\",\"Καλλιμέδων\",\"Καλλίνος\",\"Καλομοίρα\",\"Κέκρωψ\",\"Καλυψώ\",\"Κανέλλα\",\"Κανέλα\",\"Κανέλος\",\"Κανέλλης\",\"Νέλλη\",\"Νέλη\",\"Κένταυρος\",\"Καρανός\",\"Κάρπω\",\"Καρνεάδης\",\"Κάρολος\",\"Τσάρλς\",\"Τσάρλυ\",\"Κάρολ\",\"Καρολίνα\",\"Κασσάνδρα\",\"Κάσσανδρος\",\"Κηφεύς\",\"Κηφισόδωρος\",\"Κλεάνθης\",\"Κλέαρχος\",\"Κλεαρέτη\",\"Κλείνιος\",\"Κλεισθένης\",\"Κλείτος\",\"Κλεοδαίος\",\"Κλεόδαμος\",\"Κλεόβουλος\",\"Κλεομένης\",\"Κλεομήδης\",\"Κλέων\",\"Κλιτίας\",\"Κινησίας\",\"Κινύρα\",\"Κινυρίς\",\"Κίμων\",\"Κίρκη\",\"Κίσιος\",\"Κλυμένη\",\"Κλυταιμνήστρα\",\"Κλυτίδης\",\"Κλύτος\",\"Κλώθω\",\"Κνήμος\",\"Κοίνος\",\"Κονδυλένια\",\"Κονδυλία\",\"Κοντυλιά\",\"Κομνηνός\",\"Κορτέσσα\",\"Τέσσα\",\"Κορτέσα\",\"Τέσα\",\"Κορτέσσης\",\"Κορτέσης\",\"Κορυδών\",\"Κούρος\",\"Κραναός\",\"Κρατής\",\"Κρατίνος\",\"Κρατύλος\",\"Κρέων\",\"Κριτίας\",\"Κριτόδημος\",\"Κριτόλαος\",\"Κρίτων\",\"Κρίτωνας\",\"Κυβέλη\",\"Κυδιάς\",\"Κύδων\",\"Κτησίβιος\",\"Κτησίας\",\"Κύνθια\",\"Κυμοθόη\",\"Κύψελος\",\"Λαχαρής\",\"Λάχεσις\",\"Λάχης\",\"Λαέρτης\",\"Λακύδης\",\"Λάκων\",\"Λάμαχος\",\"Λαοδάμεια\",\"Λαοδάμας\",\"Λαοδίκη\",\"Λαμπέτια\",\"Λαμπροκλής\",\"Λάμπων\",\"Λαοθόη\",\"Λεοντεύς\",\"Λαόφιλος\",\"Λάσκαρης\",\"Λασκαρίνα\",\"Λευκάτη\",\"Λεύκιππος\",\"Λεύκων\",\"Λάσος\",\"Λεωχάρης\",\"Λεωδάμας\",\"Λεωκράτης\",\"Λάϊος\",\"Λεωσθένης\",\"Λητώ\",\"Λοίδα\",\"Λωίδα\",\"Λόις\",\"Λορέντζος\",\"Λουκρητία\",\"Λυγερή\",\"Λυγερός\",\"Λυκέας\",\"Λυκαίος\",\"Λυκάονας\",\"Λυκίς\",\"Λυκομήδης\",\"Λύκος\",\"Λυκούργος\",\"Λυκόφρων\",\"Λύκων\",\"Λύσανδρος\",\"Λυσίας\",\"Λύσιππος\",\"Λυσικράτη\",\"Λυσιμάχη\",\"Λυσίς\",\"Μεγακλής\",\"Μεγαλοστράτη\",\"Μεγάρη\",\"Μέγας\",\"Μεγασθένης\",\"Μεγιστίας\",\"Μελέαγρος\",\"Μέλαμπους\",\"Μελανιππίδης\",\"Μελάνθιος\",\"Μελανθώ\",\"Μάκαρ\",\"Μαίας\",\"Μελησίας\",\"Μελικέρτη\",\"Μέλισσος\",\"Μενέδημος\",\"Μενέκαλος\",\"Μένεκλης\",\"Μενεκράτης\",\"Μένιππος\",\"Μάνθος\",\"Μάνθα\",\"Μέμος\",\"Μέμα\",\"Μεχμέτ\",\"Μαντίας\",\"Μάντιος\",\"Μέντωρ\",\"Μένων\",\"Μαρίλια\",\"Μαρήλια\",\"Μαρούλα\",\"Μαρσύας\",\"Μεσινίδης\",\"Μέτων\",\"Μήδεια\",\"Μήδεος\",\"Μηριόνη\",\"Μήτις\",\"Μητρόδωρος\",\"Μητροκλής\",\"Μήτων\",\"Μιαούλης\",\"Μίκων\",\"Μίμνερμος\",\"Μιράντα\",\"Μνημοσύνη\",\"Μνησικλής\",\"Μορφέας\",\"Μοσχίνα\",\"Μουσαίος\",\"Μυκήνη\",\"Μυλλίας\",\"Μύνης\",\"Μυρίνη\",\"Μύρνα\",\"Μύρμηξ\",\"Μυρτίλος\",\"Μύρτις\",\"Μυρωνίδης\",\"Νέδων\",\"Ναπολέων\",\"Λέων\",\"Λεό\",\"Νέκλερη\",\"Νειοκλής\",\"Νέμεση\",\"Νεοπτόλεμος\",\"Νεοκλής\",\"Νεόκριτος\",\"Νέορος\",\"Ναύπλιος\",\"Ναυκλείδης\",\"Ναυμάχιος\",\"Ναυσικά\",\"Ναυσιθόη\",\"Ναυσικράτης\",\"Ναυσίμαχος\",\"Ναυσίνικος\",\"Νέσσος\",\"Νάϊρχος\",\"Νηίς\",\"Νηρεύς\",\"Νηρέας\",\"Νηρίτη\",\"Νήριτος\",\"Νησαίη\",\"Νηφαίη\",\"Νήσω\",\"Νικαγόρας\",\"Νικαρέτη\",\"Νικίας\",\"Νικόδωρος\",\"Νικοκλής\",\"Νικόμαχος\",\"Νικομήδης\",\"Νικοσθένης\",\"Νιόβη\",\"Νισαίος\",\"Νίσος\",\"Νοήμων\",\"Νομικός\",\"Νομική\",\"Νόμιος\",\"Ξέναρχος\",\"Ξενίδης\",\"Ξενόδαμος\",\"Ξενοδίκη\",\"Ξενόκλεια\",\"Ξενοκλής\",\"Ξενοκράτης\",\"Ξενόκριτος\",\"Ξενοφάνης\",\"Ξενόφιλος\",\"Ξένων\",\"Ξούθος\",\"Ξυνόφρων\",\"Οδιος\",\"Οδυσσεύς\",\"Οδυσσέας\",\"Οδύσσεια\",\"Οπίτης\",\"Οίαγρος\",\"Οιδίπους\",\"Οινεύς\",\"Οινοπίδης\",\"Οινοπίων\",\"Οινομάχος\",\"Ολυμπος\",\"Ολύνθιος\",\"Οίστρος\",\"Οθων\",\"Οθωνας\",\"Ονειρος\",\"Ονασιάς\",\"Ονήσιλος\",\"Ονήτωρ\",\"Ονομακλής\",\"Ορθαίος\",\"Ορμένος\",\"Οροίδος\",\"Ορφεύς\",\"Ορφέας\",\"Ορτίλοχος\",\"Οφελεστής\",\"Οφέλτης\",\"Οψιμος\",\"Παγώνα\",\"Παγόνα\",\"Παγούνω\",\"Πάππος\",\"Παλαιολόγος\",\"Παλαίμων\",\"Παλαμήδης\",\"Πελασγός\",\"Πειθέας\",\"Πάλλας\",\"Πελίας\",\"Πειθώ\",\"Πέλοψ\",\"Πέλοπας\",\"Πείσανδρος\",\"Πεισίστρατος\",\"Παιώνειος\",\"Πάν\",\"Πάννας\",\"Πάνας\",\"Πάνδαρος\",\"Πανδίων\",\"Πάνδροσος\",\"Πάνδωρος\",\"Πενθέας\",\"Πανταζής\",\"Πανσέληνος\",\"Πανωραία\",\"Περδίκας\",\"Περίανδρος\",\"Πάρις\",\"Πάρης\",\"Παρμενίδης\",\"Περσαίος\",\"Παρσενία\",\"Περσεύς\",\"Περσέας\",\"Πασιθέα\",\"Πασιφάη\",\"Πατροκλής\",\"Παυσανίας\",\"Πήρω\",\"Πλειστονίκης\",\"Πλειώνη\",\"Πλανητιάδης\",\"Πίγρης\",\"Πλήθων\",\"Πιτθεύς\",\"Πιτθέας\",\"Πιττακός\",\"Πλωτώ\",\"Πολέμαρχος\",\"Ποθητός\",\"Ποθητή\",\"Πολυδάμας\",\"Πολυδάμνεια\",\"Πολυδεύκης\",\"Πολυγνώτης\",\"Πολυδώρη\",\"Πολυκάστη\",\"Πολύκλειτος\",\"Πολυκράτης\",\"Πολύμερος\",\"Πολυμήδης\",\"Πολυνόη\",\"Ποσειδών\",\"Πραξιθέα\",\"Πραξιτέλης\",\"Πρίαμος\",\"Πρωταγόρας\",\"Πρωτεύς\",\"Πρωτέας\",\"Πρωτογένεια\",\"Πρωτογένης\",\"Πρώτω\",\"Πυθαγόρας\",\"Πυθεύς\",\"Πύθων\",\"Πτολεμαίος\",\"Πύρρα\",\"Πύρρανθος\",\"Πυρρίας\",\"Πυρρίμαχος\",\"Ρέα\",\"Ραδάμανθυς\",\"Ρείσης\",\"Ραμφίας\",\"Ρήγας\",\"Ρηγίλλα\",\"Ρήνη\",\"Ρητόριος\",\"Ρήσος\",\"Ριχάρδος\",\"Ρίζος\",\"Ριανός\",\"Ρίνων\",\"Ροδεία\",\"Ροδειάς\",\"Ροβέρτος\",\"Ροδόχρους\",\"Ροδόλφος\",\"Ρόδος\",\"Ρολάνδη\",\"Ρολάνδος\",\"Ροικός\",\"Σακελλάριος\",\"Σακελλάρης\",\"Σειληνός\",\"Σείριος\",\"Σεμέλη\",\"Σαραπίων\",\"Σαραφιανός\",\"Σαρπηδών\",\"Σάτνιος\",\"Σπειώ\",\"Σπάρτη\",\"Σπεύσιππος\",\"Σπήλιος\",\"Σπίνθαρος\",\"Σίδη\",\"Σθενέλαος\",\"Σθενίδας\",\"Σκάμων\",\"Σιβύλα\",\"Σκευοφύλακας\",\"Σικέλη\",\"Σκιπίων\",\"Σκιρωνίδης\",\"Σκοπελιανός\",\"Σκόπας\",\"Σιμμιάς\",\"Σιμωνίδης\",\"Σίσυφος\",\"Σίσσυφος\",\"Σμιχιάς\",\"Σόφιλος\",\"Σταμούλης\",\"Στάφυλος\",\"Στησαγόρας\",\"Στησίχορος\",\"Στίλπων\",\"Σφοδριάς\",\"Συνοδή\",\"Συνοδινός\",\"Στράβων\",\"Στρατοκλής\",\"Στράττις\",\"Συρμούλα\",\"Σύρμω\",\"Σύρος\",\"Σώφιλος\",\"Τελαμών\",\"Τελαυγής\",\"Τελέσιλλα\",\"Τελέστης\",\"Τελέστω\",\"Ταίναρος\",\"Τειρεσίας\",\"Τεκταίος\",\"Τεισίας\",\"Τέκτων\",\"Τέκτονας\",\"Τάλως\",\"Τάνταλος\",\"Τέρπανδρος\",\"Τερψιθέα\",\"Ταϋγέτη\",\"Τηλεβόης\",\"Τηλεκλείδης\",\"Τηλέφασση\",\"Τηλέφη\",\"Τηλεφίδης\",\"Τήλεφος\",\"Τήθυ\",\"Τήμενος\",\"Τηρέας\",\"Τήρω\",\"Τιμαγόρας\",\"Τιμαίος\",\"Τίμανδρος\",\"Τιμαρέτη\",\"Τιμάρατος\",\"Τιμοχάρης\",\"Τιμολέων\",\"Τιμος\",\"Τιμόκλεια\",\"Τιμοσθένης\",\"Τιμωνίδης\",\"Τολμαίος\",\"Τολμήδης\",\"Τριπτόλεμος\",\"Τρισεύγενη\",\"Τροφώνιος\",\"Τρυγώνα\",\"Τρυγόνα\",\"Τρύτων\",\"Τρίτων\",\"Τύχιος\",\"Τύνδαρης\",\"Τύριμμας\",\"Τυρταίος\",\"Τύφων\",\"Τυφώνη\",\"Υγεία\",\"Υαγνις\",\"Υβόννη\",\"Υδρέα\",\"Υδρεάς\",\"Υπείροχος\",\"Υπέρεια\",\"Υπέρβολος\",\"Υπερίδης\",\"Υπερίων\",\"Υπέροχη\",\"Υπέρτιμος\",\"Υλλος\",\"Υλότης\",\"Υψίπυλη\",\"Φαέθων\",\"Φαλέας\",\"Φειδίας\",\"Φαίδιμος\",\"Φάλαρις\",\"Φαίδων\",\"Φείδων\",\"Φαίστιος\",\"Φανιάς\",\"Φανόδικος\",\"Φανόκλης\",\"Φανοστράτη\",\"Φερεκύδης\",\"Φερεσύδη\",\"Φερούσα\",\"Φήμιος\",\"Φημονόη\",\"Φθία\",\"Φίλαινις\",\"Φιλεύς\",\"Φίλλις\",\"Φιλίνος\",\"Φιλίσκος\",\"Φίλιστος\",\"Φιλόδημος\",\"Φιλόπονος\",\"Φιλόλαος\",\"Φιλοκράτης\",\"Φιλοκτήτης\",\"Φιλόξενος\",\"Φιλομήλα\",\"Φιλόστρατος\",\"Φιλωτέρα\",\"Φιλώτας\",\"Φινεύς\",\"Φιντίας\",\"Φιντύς\",\"Φοίνιξ\",\"Φορμίων\",\"Φραγκίσκος\",\"Φραντζής\",\"Φραγκίσκη\",\"Φραντζέσκα\",\"Φρατζέσκα\",\"Φρασκώ\",\"Φρασκούλα\",\"Φρίξος\",\"Φροντίδας\",\"Φροντίς\",\"Φρύνη\",\"Φρύνιχος\",\"Φύλαρχος\",\"Φυλεύς\",\"Φυλλίς\",\"Φυλώ\",\"Φύρση\",\"Φωκυλίδης\",\"Φωτήλας\",\"Χαβρίας\",\"Χελιδόνα\",\"Χάλκων\",\"Χείλων\",\"Χαιρέδημος\",\"Χαιρέας\",\"Χαιρείας\",\"Χαιρέστρατος\",\"Χαιρήμων\",\"Χείρων\",\"Χαρίδημος\",\"Χαρικλής\",\"Χαρίνος\",\"Χαρμίδης\",\"Χάρμος\",\"Χερσιάς\",\"Χερσίφρων\",\"Χάρων\",\"Χίμαιρα\",\"Χιόνη\",\"Χίων\",\"Χλωρίς\",\"Χοίριλος\",\"Χρυσηίς\",\"Χρύσιππος\",\"Χρυσοθεμίς\",\"Χρυσοκόμης\",\"Ψαλμαχάρη\",\"Ψαλμαχάρης\",\"Ψαμάθη\",\"Ψαμμήτιχος\",\"Ωγυγής\",\"Ωγυγία\",\"Ωκάλεια\",\"Ωκέλος\",\"Ωληνός\",\"Ωκυπέτη\",\"Ωκυρρόη\",\"Ωκυτής\",\"Ωμαρής\",\"Ωραία\",\"Ωρειθυία\",\"Ωρος\",\"Ωφελίων\",\"Ωτος\"]},{\"toEaster\":-2,\"main\":\"Μεγάλη Παρασκευή\",\"variations\":[]},{\"toEaster\":1,\"main\":\"2α Διακαινησίμου - Δευτέρα\",\"variations\":[]}]}\n"
  },
  {
    "path": "secret.gradle",
    "content": "ext {\n    // Replace the existing values with your own unique keys\n\n    crashlyticsKey = \"1234567890123456789012345678901234567890\"\n    mixpanelToken = \"Include your Mixpanel Token here. You can find it on your project's Settings screen\"\n\n    androidVendingKey = \"Include your vending key here\"\n\n    adMobUnitId = \"ca-app-pub-3940256099942544/6300978111\" // This is Google's test Unit Id account\n}\n"
  },
  {
    "path": "settings.gradle",
    "content": "include ':android_mobile', ':android_common', ':android_wear', ':memento'\n"
  },
  {
    "path": "team-props/android-code-quality.gradle",
    "content": "task clean(type: Delete, dependsOn: subprojects.collect { p -> \"$p.name:clean\" }) {\n    delete project.buildDir\n}\n\ntask check(dependsOn: subprojects.collect { p ->\n    \"$p.name:check\"\n})\n\ntask assemble(dependsOn: subprojects.collect { p ->\n    \"$p.name:assemble\"\n})\n\ntask build(dependsOn: ['assemble', 'check'])\n"
  },
  {
    "path": "team-props/static-analysis/checkstyle-modules.xml",
    "content": "<!DOCTYPE module PUBLIC\n  \"-//Puppy Crawl//DTD Check Configuration 1.3//EN\"\n  \"http://www.puppycrawl.com/dtds/configuration_1_3.dtd\">\n\n<module name=\"Checker\">\n\n  <!-- Suppressions -->\n\n  <module name=\"SuppressionCommentFilter\">\n    <property name=\"offCommentFormat\"\n      value=\"CHECKSTYLE IGNORE\\s+(\\S+)\" />\n    <property name=\"onCommentFormat\"\n      value=\"CHECKSTYLE END IGNORE\\s+(\\S+)\" />\n    <property name=\"checkFormat\"\n      value=\"$1\" />\n  </module>\n\n  <module name=\"SuppressWithNearbyCommentFilter\">\n    <!-- Syntax is \"SUPPRESS CHECKSTYLE name\" -->\n    <property name=\"commentFormat\"\n      value=\"SUPPRESS CHECKSTYLE (\\w+)\" />\n    <property name=\"checkFormat\"\n      value=\"$1\" />\n    <property name=\"influenceFormat\"\n      value=\"1\" />\n  </module>\n\n  <module name=\"SuppressionFilter\">\n    <property name=\"file\"\n      value=\"team-props/static-analysis/checkstyle-suppressions.xml\" />\n  </module>\n\n  <module name=\"SuppressWarningsFilter\" />\n\n  <!-- Modules configuration -->\n\n  <module name=\"TreeWalker\">\n    <module name=\"FileContentsHolder\" />\n    <module name=\"SuppressWarningsHolder\" />\n  </module>\n\n  <!-- Checks whether files end with a new line.                        -->\n  <!-- See http://checkstyle.sf.net/config_misc.html#NewlineAtEndOfFile -->\n  <module name=\"NewlineAtEndOfFile\" />\n\n  <!-- Checks that property files contain the same keys.         -->\n  <!-- See http://checkstyle.sf.net/config_misc.html#Translation -->\n  <module name=\"Translation\" />\n\n  <!-- Checks for Size Violations.                    -->\n  <!-- See http://checkstyle.sf.net/config_sizes.html -->\n  <module name=\"FileLength\" />\n\n  <!-- Checks for whitespace                               -->\n  <!-- See http://checkstyle.sf.net/config_whitespace.html -->\n  <module name=\"FileTabCharacter\" />\n\n  <!-- Miscellaneous other checks.                   -->\n  <!-- See http://checkstyle.sf.net/config_misc.html -->\n  <module name=\"RegexpSingleline\">\n    <property name=\"format\" value=\"\\s+$\" />\n    <property name=\"minimum\" value=\"0\" />\n    <property name=\"maximum\" value=\"0\" />\n    <property name=\"message\" value=\"Line has trailing spaces.\" />\n    <property name=\"severity\" value=\"info\" />\n  </module>\n\n  <module name=\"TreeWalker\">\n\n    <!-- Checks for Naming Conventions.                  -->\n    <!-- See http://checkstyle.sf.net/config_naming.html -->\n    <module name=\"ConstantName\" />\n    <module name=\"LocalFinalVariableName\" />\n    <module name=\"LocalVariableName\" />\n    <module name=\"MemberName\" />\n    <module name=\"MethodName\" />\n    <module name=\"PackageName\" />\n    <module name=\"ParameterName\" />\n    <module name=\"StaticVariableName\" />\n    <module name=\"TypeName\" />\n\n    <!-- Checks for imports                              -->\n    <!-- See http://checkstyle.sf.net/config_import.html -->\n    <module name=\"AvoidStarImport\">\n      <property name=\"allowStaticMemberImports\" value=\"true\" />\n    </module>\n    <module name=\"IllegalImport\" />\n    <!-- defaults to sun.* packages -->\n    <module name=\"RedundantImport\" />\n    <module name=\"UnusedImports\" />\n\n\n    <!-- Checks for Size Violations.                    -->\n    <!-- See http://checkstyle.sf.net/config_sizes.html -->\n    <module name=\"LineLength\">\n      <!-- what is a good max value? -->\n      <property name=\"max\" value=\"150\" />\n      <!-- ignore lines like \"$File: //depot/... $\" -->\n      <property name=\"ignorePattern\" value=\"\\$File.*\\$\" />\n      <property name=\"severity\" value=\"info\" />\n    </module>\n    <module name=\"MethodLength\" />\n    <module name=\"ParameterNumber\" />\n\n\n    <!-- Checks for whitespace                               -->\n    <!-- See http://checkstyle.sf.net/config_whitespace.html -->\n    <module name=\"EmptyForIteratorPad\" />\n    <module name=\"GenericWhitespace\" />\n    <module name=\"MethodParamPad\" />\n    <module name=\"NoWhitespaceAfter\" />\n    <module name=\"NoWhitespaceBefore\" />\n    <module name=\"OperatorWrap\" />\n    <module name=\"ParenPad\" />\n    <module name=\"TypecastParenPad\" />\n    <module name=\"WhitespaceAfter\" />\n    <module name=\"WhitespaceAround\" />\n\n    <!-- Modifier Checks                                    -->\n    <!-- See http://checkstyle.sf.net/config_modifiers.html -->\n    <module name=\"ModifierOrder\" />\n    <module name=\"RedundantModifier\" />\n\n\n    <!-- Checks for blocks. You know, those {}'s         -->\n    <!-- See http://checkstyle.sf.net/config_blocks.html -->\n    <module name=\"AvoidNestedBlocks\" />\n    <module name=\"EmptyBlock\">\n      <property name=\"option\" value=\"text\" />\n    </module>\n    <module name=\"LeftCurly\" />\n    <module name=\"NeedBraces\" />\n    <module name=\"RightCurly\" />\n\n\n    <!-- Checks for common coding problems               -->\n    <!-- See http://checkstyle.sf.net/config_coding.html -->\n    <module name=\"EmptyStatement\" />\n    <module name=\"EqualsHashCode\" />\n    <module name=\"HiddenField\">\n      <property name=\"ignoreConstructorParameter\" value=\"true\" />\n      <property name=\"ignoreSetter\" value=\"true\" />\n      <property name=\"severity\" value=\"ignore\" />\n    </module>\n    <module name=\"IllegalInstantiation\" />\n    <module name=\"InnerAssignment\" />\n    <module name=\"MagicNumber\">\n      <property name=\"severity\" value=\"warning\" />\n      <property name=\"ignoreHashCodeMethod\" value=\"true\" />\n      <property name=\"ignoreAnnotation\" value=\"true\" />\n    </module>\n    <module name=\"MissingSwitchDefault\" />\n    <module name=\"SimplifyBooleanExpression\" />\n    <module name=\"SimplifyBooleanReturn\" />\n\n    <!-- Checks for class design                         -->\n    <!-- See http://checkstyle.sf.net/config_design.html -->\n    <module name=\"FinalClass\" />\n    <module name=\"HideUtilityClassConstructor\" />\n    <module name=\"InterfaceIsType\" />\n    <module name=\"VisibilityModifier\" >\n      <property name=\"ignoreAnnotationCanonicalNames\" value=\"Inject\" />\n    </module>\n\n\n    <!-- Miscellaneous other checks.                   -->\n    <!-- See http://checkstyle.sf.net/config_misc.html -->\n    <module name=\"ArrayTypeStyle\" />\n    <module name=\"UpperEll\" />\n\n    <module name=\"FileContentsHolder\" />\n    <!-- Required by comment suppression filters -->\n\n  </module>\n\n</module>\n"
  },
  {
    "path": "team-props/static-analysis/checkstyle-suppressions.xml",
    "content": "<?xml version=\"1.0\"?>\n\n<!DOCTYPE suppressions PUBLIC\n  \"-//Puppy Crawl//DTD Suppressions 1.1//EN\"\n  \"http://www.puppycrawl.com/dtds/suppressions_1_1.dtd\">\n\n<suppressions>\n\n  <!-- Exclude all Kotlin files -->\n  <suppress checks=\".*\" files=\".*\\.kt\" />\n\n  <!-- Preference Fragment -->\n  <suppress checks=\".\" files=\"android[\\\\/]support[\\\\/]v4[\\\\/]preference\" />\n  <!-- IAB -->\n  <suppress checks=\".\" files=\"com[\\\\/]alexstyl[\\\\/]specialdates[\\\\/]donate[\\\\/]util\" />\n\n</suppressions>\n"
  },
  {
    "path": "team-props/static-analysis/detekt-config.yml",
    "content": "autoCorrect: true\nfailFast: false\n\nbuild:\n  warningThreshold: 0\n  failThreshold: 26\n\n  weights:\n    complexity: 2\n    formatting: 0\n    LongParameterList: 1\n    comments: 0.5\n\npotential-bugs:\n  active: true\n  DuplicateCaseInWhenExpression:\n    active: true\n  EqualsWithHashCodeExist:\n    active: true\n  ExplicitGarbageCollectionCall:\n    active: true\n  LateinitUsage:\n    active: false\n  UnsafeCallOnNullableType:\n    active: false\n  UnsafeCast:\n    active: false\n\nperformance:\n  active: true\n  ForEachOnRange:\n    active: true\n  SpreadOperator:\n    active: true\n\nexceptions:\n  active: true\n\nempty-blocks:\n  active: true\n\ncomplexity:\n  active: true\n  LongMethod:\n    threshold: 20\n  LongParameterList:\n    threshold: 7\n  LargeClass:\n    threshold: 150\n  ComplexMethod:\n    threshold: 10\n  TooManyFunctions:\n    active: false\n    threshold: 20\n  ComplexCondition:\n    threshold: 3\n  LabeledExpression:\n    active: false\n\ncode-smell:\n  active: true\n  FeatureEnvy:\n    threshold: 0.5\n    weight: 0.45\n    base: 0.5\n\nformatting:\n  active: true\n  useTabs: false\n  Indentation:\n    active: true\n    indentSize: 4\n    autoCorrect: true\n  ConsecutiveBlankLines:\n    active: true\n    autoCorrect: true\n  MultipleSpaces:\n    active: true\n    autoCorrect: true\n  SpacingAfterComma:\n    active: true\n    autoCorrect: true\n  SpacingAfterKeyword:\n    active: true\n    autoCorrect: true\n  SpacingAroundColon:\n    active: true\n    autoCorrect: true\n  SpacingAroundCurlyBraces:\n    active: true\n    autoCorrect: true\n  SpacingAroundOperator:\n    active: true\n    autoCorrect: true\n  TrailingSpaces:\n    active: true\n    autoCorrect: true\n  UnusedImports:\n    active: true\n    autoCorrect: true\n  OptionalSemicolon:\n    active: true\n    autoCorrect: true\n  OptionalUnit:\n    active: true\n    autoCorrect: true\n  ExpressionBodySyntax:\n    active: false\n    autoCorrect: false\n  ExpressionBodySyntaxLineBreaks:\n    active: false\n    autoCorrect: false\n  OptionalReturnKeyword:\n    active: true\n    autoCorrect: false\n\nstyle:\n  active: true\n  NewLineAtEndOfFile:\n    active: true\n  ForbiddenComment:\n    active: true\n    values: 'STOPSHIP'\n  WildcardImport:\n    active: true\n  MaxLineLength:\n    active: true\n    maxLineLength: 150\n    excludePackageStatements: false\n    excludeImportStatements: false\n  NamingConventionViolation:\n    active: true\n    variablePattern: '^(_)?[a-z$][a-zA-Z$0-9]*$'\n    constantPattern: '^([A-Z_]*|serialVersionUID)$'\n    methodPattern: '^[a-z$][a-zA-Z$0-9]*$'\n    classPattern: '[A-Z$][a-zA-Z$]*'\n    enumEntryPattern: '^[A-Z$][a-zA-Z_$]*$'\n\ncomments:\n  active: true\n  CommentOverPrivateMethod:\n    active: true\n  CommentOverPrivateProperty:\n    active: true\n  UndocumentedPublicClass:\n    active: false\n    searchInNestedClass: true\n    searchInInnerClass: true\n    searchInInnerInterface: true\n  UndocumentedPublicFunction:\n    active: false\n\n# *experimental feature*\n# Migration rules can be defined in the same config file or a new one\nmigration:\n  active: true\n  imports:\n    # your.package.Class: new.package.or.Class\n    # for example:\n    # io.gitlab.arturbosch.detekt.api.Rule: io.gitlab.arturbosch.detekt.rule.Rule\n"
  },
  {
    "path": "team-props/static-analysis/findbugs-excludes.xml",
    "content": "<FindBugsFilter>\n\n  <Match>\n    <Or>\n      <Class name=\"~.*\\.R\\$.*\" />\n      <Class name=\"~.*\\.R\\$.*\" />\n      <Class name=\"~.*Test\" />\n      <Class name=\"~.*Test\\$.*\" />\n      <Class name=\"~.*\\.Manifest\\$.*\" />\n    </Or>\n  </Match>\n\n  <Match>\n    <Source name=\"~.*\\.kt\" />\n  </Match>\n\n  <Match>\n    <Class name=\"~.*android\\.support\\.v4\\.preference.*\" />\n    <Class name=\"~.*com\\.alexstyl\\.specialdates\\.donate\\.util.*\" />\n  </Match>\n\n</FindBugsFilter>\n"
  },
  {
    "path": "team-props/static-analysis/lint-config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<lint>\n\n  <!-- Loads of false positives :( -->\n  <issue id=\"StringFormatInvalid\"\n    severity=\"ignore\" />\n\n  <issue id=\"MissingTranslation\"\n    severity=\"ignore\" />\n  <issue id=\"GoogleAppIndexingWarning\"\n    severity=\"ignore\" />\n\n  <issue id=\"OldTargetApi\"\n    severity=\"informational\" />\n\n  <!-- Ignore RtL warnings since the app doesn't support RtL -->\n  <issue id=\"RtlSymmetry\"\n    severity=\"ignore\" />\n  <issue id=\"RtlHardcoded\"\n    severity=\"ignore\" />\n  <issue id=\"RtlEnabled\"\n    severity=\"ignore\" />\n\n  <!-- Lint only flags only missing content descriptions in XML ImageViews but we rarely put content descriptions here -->\n  <issue id=\"ContentDescription\"\n    severity=\"ignore\" />\n\n  <!-- We have duplicate IDs on pages in the homescreen, but those are never accessed from the activity, so it's safe -->\n  <issue id=\"DuplicateIncludedIds\"\n    severity=\"ignore\" />\n\n  <!-- Ignore OkIO's usages of java.nio.file -->\n  <issue id=\"InvalidPackage\">\n    <ignore regexp=\"okio-(.*?)\\.jar\" />\n  </issue>\n\n  <!-- Ignore Retrofit's usages of java.lang.invoke -->\n  <issue id=\"InvalidPackage\">\n    <ignore regexp=\"retrofit-(.*?)\\.jar\" />\n  </issue>\n\n  <!-- One of NearIt dependencies is currently ignoring all certificate issues for SSL connections.\n       We can't do anything about it until they change that dependency in their SDK with one that\n       properly validates certificates. -->\n  <issue id=\"TrustAllX509TrustManager\">\n    <ignore regexp=\"\\bcom/loopj/android/http/MySSLSocketFactory.*\" />\n  </issue>\n\n  <!-- The Google Services JSON plugin generates some API keys even if we don't actually use them -->\n  <issue id=\"UnusedResources\">\n    <ignore path=\"*generated/res/google-services/*\" />\n  </issue>\n\n</lint>\n"
  },
  {
    "path": "team-props/static-analysis/pmd-rules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<ruleset xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  name=\"Memento Calendar PMD rules\"\n  xmlns=\"http://pmd.sourceforge.net/ruleset/2.0.0\"\n  xsi:schemaLocation=\"http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd\">\n\n  <description>PMD rules for the Memento Calendar codebase.</description>\n\n  <exclude-pattern>.*\\.kt</exclude-pattern>\n  <exclude-pattern>.*\\.R\\$.*</exclude-pattern>\n  <exclude-pattern>.*Test.*</exclude-pattern>\n  <exclude-pattern>.*android.support.v4.preference.*</exclude-pattern>\n  <exclude-pattern>.*com.alexstyl.specialdates.donate.util.*</exclude-pattern>\n\n  <rule ref=\"rulesets/java/strictexception.xml\">\n    <!-- Ignored because of the Callable pattern -->\n    <exclude name=\"SignatureDeclareThrowsException\" />\n  </rule>\n  <rule ref=\"rulesets/java/typeresolution.xml\">\n    <!-- Ignored because of the Callable pattern -->\n    <exclude name=\"SignatureDeclareThrowsException\" />\n  </rule>\n\n  <rule ref=\"rulesets/java/naming.xml/ShortMethodName\">\n    <properties>\n      <property name=\"xpath\">\n        <value>\n          //MethodDeclarator[string-length(@Image) &lt; 2]\n        </value>\n      </property>\n    </properties>\n  </rule>\n\n  <rule ref=\"rulesets/java/braces.xml\" />\n\n  <rule ref=\"rulesets/java/design.xml\">\n    <exclude name=\"TooFewBranchesForASwitchStatement\" />\n    <exclude name=\"EmptyMethodInAbstractClassShouldBeAbstract\" />\n    <exclude name=\"FieldDeclarationsShouldBeAtStartOfClass\" />\n    <exclude name=\"ConfusingTernary\" />\n    <exclude name=\"AccessorMethodGeneration\" />\n  </rule>\n\n  <rule ref=\"rulesets/java/design.xml/EmptyMethodInAbstractClassShouldBeAbstract\">\n    <priority>5</priority>\n  </rule>\n\n  <!-- Suppress ImmutableField check for Api models -->\n  <rule ref=\"rulesets/java/design.xml/ImmutableField\">\n    <properties>\n      <property name=\"violationSuppressXPath\"\n        value=\"//ClassOrInterfaceDeclaration[starts-with(@Image, 'Api')]//FieldDeclaration\" />\n    </properties>\n  </rule>\n\n  <rule ref=\"rulesets/java/unusedcode.xml\" />\n  <rule ref=\"rulesets/java/logging-java.xml\" />\n  <rule ref=\"rulesets/java/strings.xml\" />\n  <rule ref=\"rulesets/java/migrating.xml\" />\n  <rule ref=\"rulesets/java/optimizations.xml\">\n    <exclude name=\"LocalVariableCouldBeFinal\" />\n    <exclude name=\"MethodArgumentCouldBeFinal\" />\n    <exclude name=\"AvoidInstantiatingObjectsInLoops\" />\n  </rule>\n  <rule ref=\"rulesets/java/basic.xml\" />\n  <rule ref=\"rulesets/java/sunsecure.xml\" />\n  <rule ref=\"rulesets/java/coupling.xml\">\n    <exclude name=\"LoosePackageCoupling\" />\n    <!-- LawOfDemeter seems to be bugged -->\n    <exclude name=\"LawOfDemeter\" />\n  </rule>\n  <rule ref=\"rulesets/java/imports.xml\" />\n  <rule ref=\"rulesets/java/junit.xml\" />\n  <rule ref=\"rulesets/java/naming.xml\">\n    <exclude name=\"AbstractNaming\" />\n    <exclude name=\"LongVariable\" />\n    <exclude name=\"ShortVariable\" />\n    <exclude name=\"ShortClassName\" />\n    <exclude name=\"AvoidFieldNameMatchingMethodName\" />\n  </rule>\n\n  <rule ref=\"rulesets/java/codesize.xml\">\n    <exclude name=\"TooManyMethods\" />\n    <exclude name=\"TooManyFields\" />\n  </rule>\n\n  <!-- Suppress ExcessiveParameterList check for Api models ctors and factory methods -->\n  <rule ref=\"rulesets/java/codesize.xml/ExcessiveParameterList\">\n    <properties>\n      <property name=\"violationSuppressXPath\"\n        value=\"//ClassOrInterfaceDeclaration[starts-with(@Image, 'Api')]//MethodDeclaration[@Static = 'true' and @Private = 'false'] | //ClassOrInterfaceDeclaration[starts-with(@Image, 'Api')]//ConstructorDeclaration\" />\n    </properties>\n  </rule>\n\n  <!-- Suppress CyclomaticComplexity check for equals and hashCode -->\n  <rule ref=\"rulesets/java/codesize.xml/CyclomaticComplexity\">\n    <properties>\n      <property name=\"violationSuppressXPath\"\n        value=\"//MethodDeclarator[@Image='equals' or @Image='hashCode']\" />\n    </properties>\n  </rule>\n\n  <!-- Suppress ModifiedCyclomaticComplexity check for equals and hashCode -->\n  <rule ref=\"rulesets/java/codesize.xml/ModifiedCyclomaticComplexity\">\n    <properties>\n      <property name=\"violationSuppressXPath\"\n        value=\"//MethodDeclarator[@Image='equals' or @Image='hashCode']\" />\n    </properties>\n  </rule>\n\n  <!-- Suppress StdCyclomaticComplexity check for equals and hashCode -->\n  <rule ref=\"rulesets/java/codesize.xml/StdCyclomaticComplexity\">\n    <properties>\n      <property name=\"violationSuppressXPath\"\n        value=\"//MethodDeclarator[@Image='equals' or @Image='hashCode']\" />\n    </properties>\n  </rule>\n\n  <!-- Suppress NPathComplexity check for equals and hashCode -->\n  <rule ref=\"rulesets/java/codesize.xml/NPathComplexity\">\n    <properties>\n      <property name=\"violationSuppressXPath\"\n        value=\"//MethodDeclarator[@Image='equals' or @Image='hashCode']\" />\n    </properties>\n  </rule>\n\n  <rule ref=\"rulesets/java/finalizers.xml\" />\n  <rule ref=\"rulesets/java/logging-jakarta-commons.xml\" />\n  <rule ref=\"rulesets/java/clone.xml\" />\n  <rule ref=\"rulesets/java/android.xml\" />\n\n</ruleset>\n"
  },
  {
    "path": "team-props/static-analysis.gradle",
    "content": "apply plugin: 'com.novoda.static-analysis'\n\nstaticAnalysis {\n    penalty {\n        maxErrors = 54\n        maxWarnings = 196\n    }\n\n    checkstyle {\n        toolVersion checkstyleVersion\n        exclude project.fileTree('src/test/java')\n        exclude project.fileTree('src/testDebug/java')\n        configFile rootProject.file('team-props/static-analysis/checkstyle-modules.xml')\n        includeVariants { variant -> excludeTestAndRelease(variant) }\n    }\n\n    pmd {\n        toolVersion pmdVersion\n        exclude project.fileTree('src/test/java')\n        exclude project.fileTree('src/testDebug/java')\n\n        ruleSetFiles = rootProject.files('team-props/static-analysis/pmd-rules.xml')\n        ruleSets = []   // Note: this is a workaround to make the <exclude-pattern>s in pmd-rules.xml actually work\n        includeVariants { variant -> excludeTestAndRelease(variant) }\n    }\n\n    findbugs {\n        toolVersion findbugsVersion\n        excludeFilter rootProject.file('team-props/static-analysis/findbugs-excludes.xml')\n        includeVariants { variant -> excludeTestAndRelease(variant) }\n    }\n}\n\nstatic boolean excludeTestAndRelease(variant) {\n    return !variant.name.toLowerCase().endsWith('test') && !variant.name.toLowerCase().endsWith('release')\n}\n"
  },
  {
    "path": "versions.gradle",
    "content": "ext {\n    // App Specifics\n    androidVersionCode = 81\n    androidVersionName = '12.1'\n\n    androidCompileSdkVersion = 27\n\n    // Libraries\n    androidBuildToolsVersion = '27.0.3'\n    android_support_version = '27.1.1'\n    play_services_version = '11.8.0'\n\n    // Code Quality\n    checkstyleVersion = '8.0'\n    findbugsVersion = '3.0.1'\n    pmdVersion = '5.8.1'\n\n    kotlin_version = '1.2.30'\n}\n"
  }
]